将 OpenGL 用于 2d 游戏的最有效方法是啥?

Posted

技术标签:

【中文标题】将 OpenGL 用于 2d 游戏的最有效方法是啥?【英文标题】:Most efficient way to use OpenGL for 2d games?将 OpenGL 用于 2d 游戏的最有效方法是什么? 【发布时间】:2011-09-19 09:04:37 【问题描述】:

我有一个我为 iPhone 编写的游戏引擎,它使用 OpenGL 来绘制 2d 精灵、背景等。我本来可以使用 Cocos2d,但我想我可以通过自己编写来了解更多信息。它工作并且似乎相当有效,但是通过 Instruments OpenGL 分析器运行我的游戏,它返回了很多关于如何做得更好的指针,谈论 VBO 和类似的事情。

假设我的游戏只绘制了许多应用了不同纹理的二维四边形,那么最有效的方法是什么?绘制 2 个三角形或单个四边形更快吗? VBO 在这方面是不是矫枉过正,或者它们实际上会带来性能提升?

【问题讨论】:

【参考方案1】:

好的,我不知道简单四边形的实际性能提升。但是,如果您的“几何”是静态的,那么您会从显示列表中获得最大的收益。它们使用起来非常简单,几乎不需要更改代码。

需要注意的是,最昂贵的操作是上下文切换。这是从绑定纹理(非常昂贵)到改变颜色(不那么昂贵)的任何事情。因此,您可能可以做的最好的事情是一次性使用一种纹理渲染所有精灵。

如果你有一个大的静态关卡,你可以把整个东西画到一个显示列表中,然后只调用它。需要注意的是,您仍然应该尝试针对上下文切换进行优化。

您还应该在代码上投入一些时间,以防止尝试呈现不可见的东西。 (检查整个关卡的深度学习解决方案。)

【讨论】:

显示列表自 openGL 3.1 起已弃用。 VBO 并不复杂,应该使用它们来代替。 是的,我已经对上下文切换非常小心,并且将它们保持在绝对最小值(所有精灵都来自单个图集),与可见性计算相同。不过,问题更多的是关于精灵 - 如果我正在绘制数百个四处移动的精灵/四边形,它们应该都是 VBO 还是对几何图形这么简单? 哇,真的,我不知道这个。我喜欢显示列表,因为当您构建自定义场景并拥有始终呈现相同的东西时,您可以将其塞进一个 DL 并对此感到满意。但我不知道 OP 是否会从 VBO 中得到很多,节省大量的设置代码。

以上是关于将 OpenGL 用于 2d 游戏的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在内存中操作 std::strings 的 2D 动态数组的最有效方法是啥?

将标准化数据提供给报告软件的最有效方法是啥

在 OpenGL 中将文本打印到屏幕的最简单方法是啥?

在Android上将Canvas移植到OpenGL

使用OpenGL从矩阵绘制热图的最有效方法?

在 iOS 上使用 OpenGL-ES 2.0 设置横向正交投影的正确方法是啥?