gpt4 book ai didi

iphone - 优化 OpenGL ES 应用程序。我应该尽可能避免调用 glVertexPointer 吗?

转载 作者:行者123 更新时间:2023-12-03 19:31:15 24 4
gpt4 key购买 nike

我正在使用 OpenGL ES 1.1 为 iPhone 开发一款游戏;我在数据结构中有很多纹理四边形,其中每个节点都有一个子节点列表。因此,我从根开始遍历该结构,并渲染每个四边形,然后是其子项,依此类推。

问题是,对于每个四边形,我都调用 glVertexPointer 来设置顶点。

  • 我应该避免为每个四边形调用它吗?例如,仅调用一次就能提高性能吗?
  • glVertexPointer 将顶点复制到 GPU 内存还是只保存指针?

尝试最小化调用次数并不容易,因为每个节点可能有不同的四边形。我有很多具有相同顶点数据的相等 Sprite ,但我不一定要一个接一个地渲染,因为我可能在它们之间绘制不同的 Sprite 。

谢谢。

最佳答案

glVertexPointer 仅保留指针,但会导致 OpenGL 驱动程序中的状态更改和显式同步,因此成本相当高。通常,当您说“这是我的数据,请绘制”时,GPU 就会开始绘制,并尽可能与 CPU 上发生的任何事情并行地继续绘制。当您更改渲染状态时,它需要完成在旧状态下所做的任何事情。因此,通过每个四边形更改一次,您可以有效地强制并发处理变得连续。因此,避免每个四边形使用 glVertexPointer(大概还有 glDrawArrays 或 glDrawElements?)应该会给您带来显着的好处。

立即优化只是在数据结构中保留四边形总数的计数,为至少具有该大小的顶点分配单个目标缓冲区,并使所有四边形将其几何形状复制到目标缓冲区中,而不是每次调用 glVertexPointer 。然后调用 glVertexPointer 和您的绘图调用(希望也压缩为一次调用),最后有一个大数组。它在 CPU 方面的成本有点高,但并行性和无需重复的 GPU/CPU 同步应该可以为您节省很多。

在小心翼翼地讨论当前 NDA 下的主题时,我强烈建议您查看 Xcode 4 beta。 Apple 拥有的其他功能包括 stated publicly to be present是一个 OpenGL ES 分析器。因此您可以轻松比较方法。

要将数据复制到 GPU,您需要使用顶点缓冲区对象。这意味着使用 glGenBuffers 创建一个缓冲区,使用 glBufferData 将数据推送到其中,然后发布一个地址为例如的 glVertexPointer 。 0 如果您上传的数据中的第一个字节是顶点的第一个字节。在 ES 1.x 中,您可以将数据上传为 GL_DYNAMIC_DRAW 来标记您打算经常更新数据并经常从中提取数据。如果您能够做到绘制的次数多于上传的次数,那么这可能是值得的。

如果您切换到 ES 2.x,还有 GL_STREAM_DRAW,它可能值得研究,但与您的问题没有直接关系。我提到它是因为如果你在 Google 上搜索顶点缓冲区对象(在桌面 OpenGL 上可用),它很可能会出现。 ES 1.x 的选项只有 GL_STATIC_DRAW 和 GL_DYNAMIC_DRAW。

我最近刚刚开发了一个 iPad ES 1.x 应用程序,其中的对象每帧都会更改,但每个使用的渲染管道都会绘制两次。屏幕上只有 5 个这样的对象,每个对象有 40 个顶点,但从最初的实现切换到 VBO 实现使我的总处理时间减少了 20%。

关于iphone - 优化 OpenGL ES 应用程序。我应该尽可能避免调用 glVertexPointer 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4794581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com