体素引擎(像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生成用于该块等),其含有可能可见的/外侧面(相邻块被检查以及).[这意味着在修改邻居时可能需要重新分配一个块].首次测试时,会为每个线段和透明线段测试不透明面.每个段都知道它在该顶点数组中的起始位置以及它有多少个顶点,包括不透明面和透明面.
纹理取自数组纹理.
渲染时;
现在......有没有人知道改善这种情况的方法,仍然允许动态生成无限世界?我目前达到〜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)