c++ - OpenGL 帧率 : connection with the size of the window

标签 c++ opengl glut freeglut

我当时正在追踪并消除 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/

相关文章:

c++ - 按需渲染帧

c++ - glutMotionFunc '' 翻转”问题

c++ - 绘制opencv?

c++ - 比较两个 vector 可能会给我一个错误

c++ - Boost.Asio iostream 冲洗不工作?

c++ - "Undefined reference to"

c++ - 使用opengl和c++使用动画(经过一段时间后一个一个地)翻译三角形

opengl - 在 OpenGL 3/GLSL 130 中设置线宽

OpenGL - 采样器阵列限制?

c++ - Visual Studio Express 2017 笔划文本功能的输出不显示