OpenCL 会比 OpenGL 更快地绘制圆圈吗?

Would OpenCL be faster than OpenGL for only drawing circles?

提问人:Samuel Ammonius STUDENT 提问时间:11/18/2023 更新时间:11/18/2023 访问量:46

问:

我有一个 2D 游戏,除了 UI 之外,只需要绘制纯色圆圈。该游戏还已经使用OpenCL来计算圆圈的物理特性(有点像粒子模拟)。使用 OpenCL 进行渲染的好处是,我不需要在组合中添加另一个库,也不需要生成顶点缓冲区。我只是不确定性能是否仍然比使用 OpenGL 和 Vulkan 等专用图形库差,尤其是考虑到抗锯齿和轮廓等功能。

一些可能很重要的细节是,有成千上万的小圆圈,它们的大小都一样。物理碰撞已经进行了剔除,因此每个像素最多只需要考虑 ~10 个圆圈。下图与我想要制作的接近(图片来源):

image of lots of 2d marbles

从理论上讲,OpenCL 方法效率更高,但它实际上归结为图形 API 使用的硬件加速量。这是我第一个与GPU相关的项目,这就是为什么我不确定。混合库不是一个大问题,因为我可以将物理引擎重写为计算着色器或其他东西。

图形 GPU OpenCL

评论

1赞 Damir Tenishev 11/18/2023
我从未在实际代码上检查过这一点,但我想性能会因许多条件(圆圈数量、GPU 上的内存量、批次大小等)而有很大差异。我会投票支持通过 OpenCL 工作,对于大多数实际情况,如果内核编写得当,它应该会更快。在这种情况下,使用 OpenGL 编写正确的代码比使用 OpenCL 要容易得多。如果代码写得正确,OpenCL 案例应该会获胜,但您可能会被迫发明一些自行车,例如在图像上画圆圈。你为什么不尝试这两种选择,比较并告诉我们这个故事呢?
1赞 ProjectPhysX 11/18/2023
@DamirTenishev当然,OpenCL 可以像任何其他编程语言一样绘图。而且它非常高效。示例:youtu.be/pD8JWAZ2f8o
1赞 Damir Tenishev 11/18/2023
@ProjectPhysX,对于大多数编程语言来说,这完全依赖于 API 进行绘图。例如,除非您使用某种图形 API 或库或直接访问硬件,否则 C 语言不会绘制。OpenCL 也是如此,它可以读/写允许绘制的纹理,但它不提供用于绘制圆圈、盒子、文本等基元的 API。这样或那样,您将不得不重新发明自行车,编写这些函数或使用 Vulkan 或其他一些库。您提供的示例(光线追踪)对纹理非常友好,因为不涉及基元。
1赞 Wyck 11/18/2023
许多粒子系统将其粒子绘制为小圆圈(使用片段着色器将其栅格化为四边形,使其成为一个完美的圆圈)。这似乎不是问题。到目前为止,我对你的建议是不要去寻找你还没有的问题。只需使用基本方法进行编码,然后再进行优化。
1赞 Damir Tenishev 11/18/2023
@ProjectPhysX,这已经进入了圣战:)任何方法都是可能的,这就是为什么我建议塞缪尔写两个版本,比较并告诉我们这个故事。我不害怕Bresenham的算法,我不喜欢代码复制和自行车再发明,除非这种再发明是你的目标。你的建议与我的有什么不同,所以我们需要争论?:)同时,我建议使用 OpenCL,但保留了可能的缺点。你也建议同样。主题框架中的讨论点是什么?正如我所警告的那样,性能在很大程度上取决于实现。

答:

1赞 ProjectPhysX 11/18/2023 #1

两者本身都不是更快的。OpenCL 的栅格化速度与 OpenGL 一样快,前提是您自己为圆实现 Bresenham 栅格化例程。最后,图像只是一个整数数组。但在 OpenCL 中,您可以进行特定于应用程序的优化,例如固定大小的圆圈,以击败通用库光栅化算法。

主要的性能因素是数据移动(避免 PCIe 复制,在 VRAM 中具有粒子并在 VRAM 中呈现)和数据布局(用于合并内存访问的阵列结构)。

由于您已经在 OpenCL 中拥有模拟部分,因此我建议您也使用 OpenCL 进行渲染,这样您就可以省去添加另一个库的麻烦,并且可以更好地控制优化。