我正在用 opengl 编写一个新的代码库,很早就遇到了一个奇怪的错误。
这是重复且可预测的帧速率明显波动。
我知道它绝对与渲染的对象成正比。
它还与屏幕尺寸成正比(不是视口尺寸,不是窗口尺寸,只是物理设备尺寸)
大约是 0.2:1(低:高)帧的比例
I got curious and graphed it, bear in mind that the window/context isn't vsynced or capped.
视图完全静止,所有物体也静止。
每一帧都完全相同。
任何时候都没有给出任何输入。
没有什么是基于时间的。
不会发生垃圾收集。
我不明白,如果它基本上是一遍又一遍地渲染一帧,那么什么会导致如此巨大的变化?
这是程序流程的伪代码
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 https://github.com/Twistedsnail/Untitled_for_SO(它可能不会在本地运行,因为它需要指定位置的 SFML2 和 VS 文件中的 GLM)
当我们在上一份工作中构建游戏引擎时,我们时不时也会遇到类似的奇怪问题。
我记得的原因:
Lua 垃圾收集。哪里使用Lua作为引擎的脚本语言,GC会让渲染看起来好像有问题!虽然不是很明显。检查应用程序/机器中是否有任何其他线程甚至进程可能变得贪婪。
OpenGL 驱动程序问题:在 NVIDIA 驱动程序中禁用或启用“线程优化”有时会对性能产生有趣的影响。 ATI 驱动程序通常只是存在需要升级的错误。
Windows 事件循环的问题。就像使用 GetMessage 而不是 PeekMessage 一样。
另一件事:如果您确实渲染不多并且具有数千 FPS:即使渲染时间的最轻微增加也会对您的 FPS 产生“巨大”影响。
因此,您所看到的可能是非常正常的操作系统/驱动程序任务,这些任务在使用 60 到 120 等“正常”游戏 FPS 时无关紧要,并且以后不会太明显。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)