循环FPS下降的可能原因?

时间:2014-09-07 18:44:00

标签: c++ performance opengl cycle frame-rate

我在opengl中编写了一个新的代码库,并且很早就遇到了一个奇怪的错误。 帧率的明显波动是重复和可预测的。

我知道它与呈现的对象完全成比例。 它也与屏幕大小成比例(不是视口大小,不是窗口大小,只是物理设备大小) 它大致是0.2:1(低:高)帧的比率

我很好奇并将其绘制成图形,请记住窗口/上下文没有被暗示或上限。 Object count and screen size comparisons

视图完全静止,所有物体都是静止的。 每个帧都完全相同。 任何时候都没有给出任何意见。 没有什么是基于时间的。 没有垃圾收集。

我不明白,如果它基本上是一帧被渲染一遍又一遍可能导致如此巨大的变化?

这是程序流程的伪代码

create window
load shaders
grab uniform locations
create camera
create 3 meshes // They just hold the buffers and data for a model
create x objects and pass a pointer to a random mesh // Objects hold position, rotation etc + link to mesh
while game is running
    poll window for events
    capture mouse and recalculate VP matrix if required
    for each object
        recalc MVP
        bind mesh's buffers and draw elements
    draw window //SFML handles this, just swaps front/back buffers and draws
clean up data

如果这没有给出任何见解,那么我将VS2012项目上传到github:https://github.com/Twistedsnail/Untitled_for_SO(它可能不会在本地运行,因为它需要指定位置的SFML2和VS文件中的GLM)

1 个答案:

答案 0 :(得分:3)

当我们在上一份工作中构建游戏引擎时,我们也不时会遇到类似的奇怪问题。

我记得的原因:

  • Lua垃圾收集。哪里使用Lua作为引擎的脚本语言,GC会让它看起来好像渲染有问题!虽然不是很明显。检查应用程序/计算机中可能变得贪婪的任何其他线程甚至进程。

  • OpenGL驱动程序问题:禁用或启用"线程优化"在NVIDIA驱动程序中,有时会对此类性能产生有趣的影响。 ATI驱动程序通常只是容易出现需要升级的错误。

  • Windows事件循环的问题。就像使用GetMessage而不是PeekMessage一样。

另一件事:如果你真的没有渲染太多而且拥有几千个FPS:即使渲染时间稍有增加,也会有很多"巨大的"对你的FPS的影响。 因此,您所看到的可能是非常正常的操作系统/驱动程序任务,这些任务在使用" normal"时无关紧要。游戏FPS喜欢60到120,后来不太明显。