类mc地图设计

发表于2020-05-20
评论0 4k浏览

序言       

       公司的一个项目在开发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数据。

ngrilOFjyMmGKdleQsXF.png

 

地图的系统

 

   上面我们已经处理好了一个无限大地图的数据,然后把所有这些数据分门别类的组装起来,使其变成一个地图。这里引入了系统这个概念,每个系统操作组件,来实现一个功能。

  1. 视野系统:实时更新chunk
  2. 文件系统:地图文件region的加载和存储
  3. 剔除系统:使用的Intel的moc库进行的遮挡剔除。
  4. lod系统:设置每个chunk的lod,渲染的时候根据lod进行渲染
  5. 光照系统:处理点光源和lightmap
  6. 方块网格系统:生成需要渲染方块网格
  7. 其他一些系统。

 

总结

   ecs天然的适合这类无限大地图,可以分门别类的针对每个系统进行优化,调优。相对与旧版的固定地图,现在的结构更加清晰,支持功能更多。整体性能也没有增加。

 

  • 允许他人重新传播作品,但他人重新传播时必须在所使用作品的正文开头的显著位置,注明用户的姓名、来源及其采用的知识共享协议,并与该作品在磨坊上的原发地址建立链接
  • 可对作品重新编排、修改、节选或者以作品为基础进行创作和发布
  • 可将作品进行商业性使用

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引