小编It'*_*lex的帖子

无限立方体世界引擎(如Minecraft)优化建议?

体素引擎(像Minecraft)优化建议?

作为一个有趣的项目(并让我的Minecraft-adict儿子为编程兴奋)我正在使用C#.NET4.5.1,OpenGL和GLSL 4.x构建一个类似3D Minecraft的体素引擎.

现在我的世界是用块建造的.块存储在字典中,我可以根据64位X | Z<<32密钥选择它们.这允许创建一个可以缓存和缓存块的"无限"世界.

  • 每个块由16x16x16块段组成.从0级基岩开始,它可以达到你想要的高度(不像我认为限制为256的我的世界).

  • 当它们进入视图并需要渲染时,块会在单独的线程上排队生成.这意味着块可能不会立即显示.在实践中你不会注意到这一点.注意:我不是在等待它们生成,它们将不会立即显示.

  • 当一个块需要呈现为一个VBO(第一时间glGenBuffer,GL_STREAM_DRAW生成用于该块等),其含有可能可见的/外侧面(相邻块被检查以及).[这意味着在修改邻居时可能需要重新分配一个块].首次测试时,会为每个线段和透明线段测试不透明面.每个段都知道它在该顶点数组中的起始位置以及它有多少个顶点,包括不透明面和透明面.

  • 纹理取自数组纹理.

渲染时;

  • 我首先采取截锥体的边界框并将其映射到块网格上.利用这些知识,我会选择平截头体内和相机一定距离内的每个块.
  • 现在我对块进行距离排序.
  • 之后,我确定实际可见的块区段的范围(索引,长度).现在我确切地知道哪些段(以及哪些顶点范围)在视图中"至少部分地".我所拥有的唯一多余部分是隐藏在山脉之后或"有时"深埋地下的部分.
  • 然后我开始渲染...首先我使用已知的顶点范围从前到后渲染不透明的面[启用剔除和深度测试,alpha测试和混合禁用].然后我将透明面渲染回前面[启用混合]

现在......有没有人知道改善这种情况的方法,仍然允许动态生成无限世界?我目前达到〜80FPS @ 1920×1080,〜120fps的@ 1024×768(截图http://i.stack.imgur.com/t4k30.jpg,http://i.stack.imgur.com/prV8X.jpg上)平均2.2Ghz i7笔记本电脑配ATI HD8600M gfx卡.我认为必须增加帧数.而且我想我必须,因为我想添加实体AI,声音并做凹凸和镜面映射.使用Occlusion Queries可以帮助我吗?......根据细分的性质,我无法想象.我已经最小化了对象的创建,因此整个地方都没有"新对象".此外,由于在使用调试或发布模式时性能没有真正改变,我认为这不是代码,而是更多的问题解决方法.

编辑:我一直在考虑使用,GL_SAMPLE_ALPHA_TO_COVERAGE但它似乎没有工作?

gl.Enable(GL.DEPTH_TEST);
gl.Enable(GL.BLEND); // gl.Disable(GL.BLEND);
gl.Enable(GL.MULTI_SAMPLE);
gl.Enable(GL.SAMPLE_ALPHA_TO_COVERAGE);
Run Code Online (Sandbox Code Playgroud)

opengl optimization cube voxel minecraft

6
推荐指数
1
解决办法
3434
查看次数

标签 统计

cube ×1

minecraft ×1

opengl ×1

optimization ×1

voxel ×1