我正在使用 opengl 3.3,使用完全流式传输的 VBO 渲染一个自上而下的基于图块的世界。
在遇到一些滞后后,我做了一些基准测试,结果发现很可怕!
让我解释一下图片。第一个标记的方块是我使用最简单的着色器运行我的游戏。没有闪电,什么都没有!我只是上传 5000 个顶点并绘制它们。我的内存负载约为 20-30%,cpu-load 30-40%
第二个是闪电。每个灯光都作为数组上传到片段着色器,每个片段都会处理灯光。负载约 40-50%。100% 有 60 盏灯。
第三个是延迟着色。首先,我将法线和漫反射绘制到 FBO,然后将每个灯光渲染到默认 FB,同时读取这些灯光。负载约为 80%。基本上不受灯光数量的影响。
这些是我渲染的场景:
如您所见,没有什么花哨的。是复古风格。我的计划是增加大量的复杂性,并且仍然在低端计算机上运行流畅。我的是i7 nvidia 660M,所以应该没有问题。
作为比较,我运行了魔兽争霸 3,它占用了大约 50-60% 的负载,20% 的内存。
我注意到的一件奇怪的事情是,如果我禁用垂直同步并且不在交换缓冲区之前调用 glFinish,负载会显着下降。然而,时钟上升并产生热量(53C*)。
现在,首先我想知道你是否认为这是正常的。如果不是,那么我的瓶颈可能是什么?会不会是我的流媒体 VBO?我试过双重缓冲和孤立,但没有。将 sprite 的数量加倍基本上会增加 5-10% 的内存负载。GPU负载基本保持不变。
我知道这个问题不容易回答,但我会根据您的需要提供更多详细信息。不想在这里发布我的 20000 行代码。
哦,还有一件事......它会波动。绘制调用是相同的,但负载可以从 2-100% 变化,只要感觉。
更新:
我的主循环如下所示:
交换缓冲区
renderAndDoGlCalls
更新GameAndPoll
如果还有时间就睡觉(1/60 秒)
重复。
如果没有 v-sync、glflush 或 glfinsih,这会导致使用百分比:
交换:0.16934400677376027
任:0.9929640397185616
upp:0.007698000307920012
民意调查:0.0615780024631201
睡眠:100.39487801579511
在交换缓冲区之前使用 glFinish:
交换:26.609977064399082(这通常会上升到 80%)
任:1.231584049263362
upp:0.010266000410640016
民意调查:0.07697400307896013
睡眠:74.01582296063292
使用 Vsync 启动良好,通常与使用 glFinish 相同,然后是 bam!:
交换:197.84934791397393
任:1.221324048852962
upp:0.007698000307920012
民意调查:0.05644800225792009
睡眠:0.002562000102480004
它保持这种状态。