OpenGL帧率:与窗口大小的连接

rsp*_*cer 4 c++ opengl glut freeglut

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

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

这是否意味着我在GPU渲染中的瓶颈?当然GPU的这些日子比足够强大更没有注意到一个300x300的1920×1080和区别?还是我从我的显卡上问了太多?

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

我要问的是:在改变窗口大小时期望减少帧速率是否合理,或者是否存在非常错误?

dat*_*olf 13

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

恭喜:您发现了填充率

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

是的,差不多.具体而言,瓶颈是来自/到图形存储器的带宽,或片段着色器的复杂性,或两者的组合.

当然GPU现在功能强大到不足以发现300x300和1920x1080之间的区别?

300×300   =   90000
1920×1080 = 2073600
Run Code Online (Sandbox Code Playgroud)

换句话说:你要求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秒,依此类推.

  • @rspencer:最终你会经历120Hz的所有可能的分解. (3认同)