为什么我的 2d 图形应用程序 运行 在集成显卡上更快?
Why my 2d graphic application run faster on Inegrated graphics card?
我正在使用 OpenGL(如 QGIS)开发 2D 图形应用程序。最近,当我测试一些基准时,我的 2 个图形卡之间存在奇怪的性能差异。所以我做了一个简单的测试,并使用 VBO 绘制了 100 万个正方形。所以每 20 个字节有 4m 个顶点,所以我的 VBO 总大小是 80 MB。我只用一次 DrawElements 调用就绘制了所有内容。当我在我的笔记本电脑上测量渲染时间时,它有 2 个图形卡,它在 Geforce 上运行大约 43 毫秒,在集成英特尔卡上运行大约 1 毫秒。但我希望在 Geforce 上更快。为什么会这样?我应该禁用一些吗
Opengl 选项?
我的系统规格是:
华硕 N53m 集成显卡和 Geforce GT 610m
编辑:
我还在另一个配备 AMD Radeon HD 5450 的系统上进行了测试,它又是大约 44 毫秒。我也改为使用单精度,它减少到 30 毫秒。但仍然集成 GPU 更快!
这绝对不是测量问题,因为我可以看到缩放 in/out.
时的延迟
运行time 不同 OpenGL 实现的行为大不相同,正如我在有关 VR 低延迟渲染技术的实验中发现的那样。一般来说,唯一真正可靠的测量时间间隔是绘图中同一步骤之间的帧间时间,它能提供一致的结果。 IE。测量从缓冲区交换到缓冲区交换的时间(如果要测量原始绘图性能,请禁用 V-Sync),或相同 glClear
次调用之间的时间。
其他所有内容仅在特定实现中保持一致,但在供应商之间不一致(在测试时我周围没有 AMD GPU,因此我缺乏这方面的数据)。我发现了一些值得注意的角落案例:
交换缓冲区
- NVidia:returns 仅在交换缓冲区出现后。这意味着:等待 V-Sync 或仅在交换缓冲区
后才 returns
- Intel/Linux/X11:总是returns立即。垂直同步会影响下一个 OpenGL 调用,该调用会影响尚未呈现的缓冲区 和 中不适合命令队列的像素。因此 "clearing" 具有大四边形、天空盒或使用深度乒乓方法(仅在非常古老的应用程序中发现)的视口会给出非常不一致的帧间隔。 glClear 将在交换后可靠地阻塞直到 V-Sync
glFinish
- NVidia:如预期的那样实际完成了渲染
- Intel/Linux/X11:绘制到后台缓冲区,就像一个无操作,绘制到前台缓冲区就像一个完成,然后从辅助后台缓冲区复制到前台缓冲区(奇怪);本质上意味着你不能使绘图过程 "visible".
我还必须测试 Intel 驱动程序在绕过 X11(使用 KMS)时的功能。请注意,只要结果一致并符合规范,OpenGL 规范将如何以及何时执行特定操作留给实现。所有观察到的行为都完全符合。
我正在使用 OpenGL(如 QGIS)开发 2D 图形应用程序。最近,当我测试一些基准时,我的 2 个图形卡之间存在奇怪的性能差异。所以我做了一个简单的测试,并使用 VBO 绘制了 100 万个正方形。所以每 20 个字节有 4m 个顶点,所以我的 VBO 总大小是 80 MB。我只用一次 DrawElements 调用就绘制了所有内容。当我在我的笔记本电脑上测量渲染时间时,它有 2 个图形卡,它在 Geforce 上运行大约 43 毫秒,在集成英特尔卡上运行大约 1 毫秒。但我希望在 Geforce 上更快。为什么会这样?我应该禁用一些吗 Opengl 选项?
我的系统规格是: 华硕 N53m 集成显卡和 Geforce GT 610m
编辑:
我还在另一个配备 AMD Radeon HD 5450 的系统上进行了测试,它又是大约 44 毫秒。我也改为使用单精度,它减少到 30 毫秒。但仍然集成 GPU 更快!
这绝对不是测量问题,因为我可以看到缩放 in/out.
运行time 不同 OpenGL 实现的行为大不相同,正如我在有关 VR 低延迟渲染技术的实验中发现的那样。一般来说,唯一真正可靠的测量时间间隔是绘图中同一步骤之间的帧间时间,它能提供一致的结果。 IE。测量从缓冲区交换到缓冲区交换的时间(如果要测量原始绘图性能,请禁用 V-Sync),或相同 glClear
次调用之间的时间。
其他所有内容仅在特定实现中保持一致,但在供应商之间不一致(在测试时我周围没有 AMD GPU,因此我缺乏这方面的数据)。我发现了一些值得注意的角落案例:
交换缓冲区
- NVidia:returns 仅在交换缓冲区出现后。这意味着:等待 V-Sync 或仅在交换缓冲区 后才 returns
- Intel/Linux/X11:总是returns立即。垂直同步会影响下一个 OpenGL 调用,该调用会影响尚未呈现的缓冲区 和 中不适合命令队列的像素。因此 "clearing" 具有大四边形、天空盒或使用深度乒乓方法(仅在非常古老的应用程序中发现)的视口会给出非常不一致的帧间隔。 glClear 将在交换后可靠地阻塞直到 V-Sync
glFinish
- NVidia:如预期的那样实际完成了渲染
- Intel/Linux/X11:绘制到后台缓冲区,就像一个无操作,绘制到前台缓冲区就像一个完成,然后从辅助后台缓冲区复制到前台缓冲区(奇怪);本质上意味着你不能使绘图过程 "visible".
我还必须测试 Intel 驱动程序在绕过 X11(使用 KMS)时的功能。请注意,只要结果一致并符合规范,OpenGL 规范将如何以及何时执行特定操作留给实现。所有观察到的行为都完全符合。