4

我正在追踪和消除我的 C++/OpenGL/GLUT 代码中那些效率低下且速度慢的部分,并且在这样做的过程中,我观察了每秒帧数计数器,以了解我是否真的取得了进展。我注意到如果我最大化窗口,我的帧速率会从大约 120 下降到 60。

进一步的实验表明这是一个线性的事情,我可以通过改变窗口的大小来改变帧速率。

这是否意味着我在 GPU 渲染方面的瓶颈?现在的 GPU 肯定已经足够强大以至于不会注意到 300x300 和 1920x1080 之间的区别?还是我对显卡要求太多了?

另一种方法是我的代码中有一些错误导致系统在较大的渲染上变慢。

我要问的是:在更改窗口大小时期望帧速率减半是否合理,还是有什么非常不对劲的地方?

4

1 回答 1

13

进一步的实验表明这是一个线性的事情,我可以通过改变窗口的大小来改变帧速率。

恭喜:您发现填充率

这是否意味着我在 GPU 渲染方面的瓶颈?

是的,差不多。具体来说,瓶颈要么是来自/到图形内存的带宽,要么是片段着色器的复杂性,或者是两者的组合。

现在的 GPU 肯定已经足够强大以至于不会注意到 300x300 和 1920x1080 之间的区别?

300×300   =   90000
1920×1080 = 2073600

或者换句话说:你要求 GPU 填充大约 20 倍的像素。这意味着必须扔掉和处理 20 倍的数据。

从 120Hz 到 60Hz 的下降来自 V-Sync。如果您禁用 V-Sync,您会发现,对于 1920×1080,您的程序可能会达到比 60Hz 更高的速率,但对于 300×300,它会低于 180Hz。

原因很简单:当与显示垂直回扫同步时,您的 GPU 只能在显示垂直同步时“输出”下一帧。如果您的显示器可以达到 120Hz(很明显,就像您的那样)并且您的渲染时间少于 1/120 秒,那么它将使截止日期和您的帧速率与显示器同步。但是,如果绘制一个帧需要超过 1/120 秒,那么它将与显示的每个第二帧同步。如果每 3 次渲染超过 1/60 秒,每 4 次渲染超过 1/30 秒,以此类推。

于 2013-11-06T12:23:44.313 回答