2

我正在尝试在 Android 上构建一个 OpenGL ES 2.0 渲染系统。我有一个 FloatBuffer,我在其中放置了所有顶点数据。目前,我只是为它分配大量字节并忽略绘制调用,如果它们会溢出该大小的缓冲区。有没有办法动态调整缓冲区的大小?如果我只是释放缓冲区并在每次渲染后重新分配它,我想那会很慢。

4

2 回答 2

2

实际上,我仍在学习高性能 OpenGL 渲染,但切换到顶点缓冲区对象通常可以实现最长的执行时间。最后,您必须尝试并测试。

这里有一些进一步阅读的来源:

  1. Android 第 7 课:顶点缓冲区对象 (VBO) 简介

    当没有大量数据要传输时这很好,但是随着我们的场景变得更加复杂,有更多的对象和三角形,这可能会增加 CPU 和内存使用的额外成本。我们能做些什么呢?我们可以使用顶点缓冲对象。不是每帧都从客户端内存传输顶点信息,而是将信息传输一次,然后从这个图形内存缓存中完成渲染。

  2. OpenGL 顶点缓冲区对象 (VBO) -> 更新 VBO

  3. 顶点规范最佳实践 -> 动态 VBO

于 2013-07-04T19:52:22.790 回答
2

有没有办法动态调整缓冲区的大小?

不,您当前的方法看起来不错。您可能想要扩展它,如果数据不适合当前缓冲区,则创建一个新的更大的缓冲区并用新数据填充它。

不幸的是,OpenGL-ES 没有像 OpenGL-3 那样允许您在缓冲区对象之间复制数据的功能。使用它,您可以在完全保留在 GPU 内存中的 BO 之间进行复制,这样您就必须只更新丢失的部分。

如果我只是释放缓冲区并在每次渲染后重新分配它,我想那会很慢。

它肯定不会提高性能,这是正确的。根据您的实际实现,它可能会对性能产生巨大影响,这是正确的。所以我建议不要这样做。

于 2013-07-05T12:12:54.373 回答