我当时正在追踪并消除 C++/OpenGL/GLUT 代码中那些低效且缓慢的部分,在这样做的过程中,我观察了我的每秒帧数计数器,以了解我是否真的取得了进展。我注意到,如果我最大化窗口,我的帧速率会从大约 120 下降到 60。
进一步的实验表明这是一个线性的事情,我可以通过改变窗口的大小来改变帧率。
这是否意味着我的瓶颈在 GPU 渲染中?现在的 GPU 肯定已经足够强大了,不会注意到 300x300 和 1920x1080 之间的区别?还是我对我的显卡要求太高了?
另一种情况是我的代码中存在一些错误,导致系统在较大的渲染时速度变慢。
我要问的是:在更改窗口大小时预期帧速率减半是否合理,还是有什么非常不对劲的地方?
最佳答案
Further experimentation revealed that this was a linear thing, I could change the frame rate by changing the size of the window.
恭喜:您发现了填充率
Does this mean that my bottleneck in in the GPU rendering?
是的,差不多。具体来说,瓶颈要么是来自/到图形内存的带宽,要么是片段着色器的复杂性,要么是两者的结合。
Surely GPUs these days are more than powerful enough not to notice the difference between a 300x300 and 1920x1080?
300×300 = 90000
1920×1080 = 2073600
换句话说:您要求 GPU 填充大约 20 倍的像素。这意味着必须处理 20 倍的数据。
从 120Hz 到 60Hz 的下降来自垂直同步。如果您禁用 V-Sync,您会发现,对于 1920×1080,您的程序可能会达到比 60Hz 更高的速率,但对于 300×300,它将低于 180Hz。
原因很简单:当与显示器垂直回扫同步时,您的 GPU 只能在显示器进行垂直同步时“输出”下一帧。如果您的显示器可以达到 120Hz(很明显就像您的显示器一样)并且您的渲染完成时间少于 1/120 秒,那么截止日期和您的帧率将与显示器同步。但是,如果绘制一帧花费的时间超过 1/120 秒,那么它将与显示的每第二帧同步。如果渲染时间每 3 秒超过 1/60 秒,则每 4 秒 1/30 秒,依此类推。
关于c++ - OpenGL 帧率 : connection with the size of the window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19811782/