将 glDrawElements 性能与预期 GPU 性能进行比较?

Posted

技术标签:

【中文标题】将 glDrawElements 性能与预期 GPU 性能进行比较?【英文标题】:Compare glDrawElements performance against expected GPU performance? 【发布时间】:2021-10-18 16:35:09 【问题描述】:

我正在使用 OpenGL 4.5 在集成的 Intel UHD 630 GPU 上渲染一个非常大的网格(高度图),并试图了解我所获得的性能是否符合预期(诚然较低级别) GPU,或者我是否在某处做错了什么。

网格是从 1024x1024 图像生成的,生成一个大网格:

顶点缓冲区:4190766 个顶点(167630640 字节) 索引缓冲区:6285870 个索引(25143480 字节)

我正在使用设置了 GL_STATIC_DRAW 的 VBO,并且网格仅在程序启动时上传一次。它是通过一个 glDrawElements 调用绘制的。

目前我的帧时间是 9 毫秒。如果我禁用网格的 glDrawElements 调用(只留下其他较小的网格和 UI 绘图),我的帧时间将远低于 1 毫秒。所以几乎所有的绘制时间都花在了这个大的绘制调用上。

但是,即使在此 GPU 上,我也希望有更好的性能。网格在 VBO 中,它已经有了数据,所以我不知道为什么要花 9 毫秒来绘制。

有没有办法知道这个 GPU 的实际能力,以及在绘制 4 百万个以上的顶点时这个帧时间是否符合预期?

【问题讨论】:

"但是,即使在此 GPU 上,我也希望有更好的性能。" 为什么?你似乎在推约 200 万个三角形。每帧 10 毫秒,即每秒约 2 亿个三角形。这对于集成 GPU 来说非常可观。 “这对于集成 GPU 来说非常值得尊敬” 这就是我希望得到的答案,因为我不知道这些天集成 GPU 应该具备什么能力.现代游戏推动了大量的三角形,我已经接近了一个(尽管很大)绘制调用的帧限制。我想知道这个限制应该是什么。 【参考方案1】:

您的 GPU 必须每帧渲染超过 200 万个三角形,这对于 4 年前问世的集成卡来说要求很高。

如果您正在考虑优化性能,那么我建议您采取以下措施:

不是为每个高度图像素生成一个顶点,而是生成一个更稀疏的统一顶点网格(比如说,相隔一个世界单位)并根据它们各自的高度图值提升它们。如果您在高度值变化很大的某些区域需要更高的精度,您可以细分这些特定区域,同时保持顶点密度较低的平坦区域。您可以更进一步,折叠位于平坦表面上的三角形,因此无法提供太多地形细节,这应该会根据您使用的高度图显着减少顶点数。

另一种可以显着提高帧率的方法是将大网格分解为较小的网格,并实施各种剔除方法,以确保仅渲染摄像机可见的地形片段。其中最重要的是平截头体剔除,这将使您的 GPU 不必处理数十万个无论如何都不可见的顶点。可以在here 找到一个很好的截锥剔除资源,它对我个人帮助很大并且非常容易实现。

【讨论】:

以上是关于将 glDrawElements 性能与预期 GPU 性能进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES - glDrawElements - 无法理解索引

基础概念记录

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

我不明白的 glDrawElements 的使用

OpenGL - glDrawElements vs 顶点数组对象

当我尝试从 vbo 获取颜色时,glDrawElements 没有输出