类mc地图设计
序言
公司的一个项目在开发mc类型的游戏,早期参照市面上一款类mc的游戏用的是固定大小地图,而不是像mc是无限大小地图,这样可以把地图做的很精美。但最近接到需求,需要把固定大小的地图,改为无限大小的。地图里很多模块都是按照固定大小进行组织的,改起来很蛋疼。
地图结构
那么如何制作无限大地图?可以地图切分无数多个小的单元,把这些单元组装起来就是个无限大的地图,那么只需把视野内的单元渲染出来就可以了。其实救是渲染出一个一个这种单元,将单元命名为chunk,一般大小为16\16\16。
地图单元chunk
首选看下chunk是如何组织数据的,在旧版的地图中有着很多模块,包括:方块,水,点光源,时间等,大约有10个模块。下一步把这些模块都拆分成16 \16\16大小的单元,进行组织数据。然后把这些做成组件的形式加入chunk中。这样一个chunk就包含着16\16\16范围内的全部数据。
地图文件结构:
像旧版固定地图,可以把地图的信息全部存储在一个文件中,但对于无线大的地图,就无法这么做了。这里跟chunk一样,会引入一个地图文件单元region。每个region大小为256\256\256, 也就是每个region中存储着16\16\16个chunk 的数据。然后根据人物的位置,动态的加载/保存这个文件。
人物视野:
尽管地图是无限大的,但不可能把所有数据都加载进内存,而是只把视野内的数据加载好即可。用视野把地图文件region和地图数据chunk链接起来。每次视野变化,都从文件中读取数据,加载新chunk,保存旧的chunk数据。
地图的系统
上面我们已经处理好了一个无限大地图的数据,然后把所有这些数据分门别类的组装起来,使其变成一个地图。这里引入了系统这个概念,每个系统操作组件,来实现一个功能。
- 视野系统:实时更新chunk
- 文件系统:地图文件region的加载和存储
- 剔除系统:使用的Intel的moc库进行的遮挡剔除。
- lod系统:设置每个chunk的lod,渲染的时候根据lod进行渲染
- 光照系统:处理点光源和lightmap
- 方块网格系统:生成需要渲染方块网格
- 其他一些系统。
总结
ecs天然的适合这类无限大地图,可以分门别类的针对每个系统进行优化,调优。相对与旧版的固定地图,现在的结构更加清晰,支持功能更多。整体性能也没有增加。