我正在追踪并消除那些效率低且速度慢的C ++ / OpenGL / GLUT代码部分,并且在这样做的过程中,我每秒钟都会看到我的帧数,知道我是否真的在取得进展。我注意到如果我最大化窗口,我的帧速率从大约120降到60。
进一步的实验表明这是线性的,我可以通过改变窗口的大小来改变帧速率。
这是否意味着我在GPU渲染中的瓶颈?当然GPU现在足够强大不来注意300x300和1920x1080之间的区别?或者我从我的显卡上问了太多?
另一种选择是我的代码中存在一些错误导致系统在较大的渲染上变慢。
我要问的是:在改变窗口大小时期望减少帧速率是否合理,或者是否存在非常错误?
答案 0 :(得分: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 / 120s,那么它将与显示的每个第2帧同步。如果渲染每3秒钟需要超过1/60秒,每4秒钟需要1/30秒,依此类推。