0

我有大约 500 个 vec4 需要可用,但每个对象只有约 15 个,然后更改为这 500 个中的 15 个用于绘制下一个对象,依此类推。

起初,我尝试将所有内容一次存储在“统一 vec4 行 [500]”中,这在某些设备上效果很好,但例如在 Galaxy SII 上,这会导致即时崩溃,出现 outOfMemory 异常。比我尝试使用以下方法将每个对象从 CPU 端复制到 GPU 所需的 15 个:

GLES20.glUniform4f(GLES20.glGetformLocation(programHandle, "lines["+i/4+"]"), 
      lines[i], lines[i+1], lines[i+2], lines[i+3]);

因为有相当多的对象要绘制,这导致大量的 vec4 被传递给 GPU,并且垃圾收集器每 2 秒被调用一次。

“lines”是一个float[4*lineCount],也许上传整个float[]的调用会更快,内存效率更高,有人知道怎么做吗?

我相信 UBO 会很好地解决这个问题,但它们不能在 android 上使用,对吗?

有谁知道更好的解决方案?非常感谢!

Galaxy SII 用户就靠你了^_^

4

2 回答 2

0

这里发生了一些事情:

  • 如果您因为 Opengl 而使垃圾收集器运行,则必须重新考虑您的解决方案。它可能会导致您的帧速率不一致。

  • 在我看来,您可能会将属性数组与制服混淆。属性数组将是这里的解决方案,因为您希望最小化每帧必须移动到 gpu 的数据量。

  • Galaxy SII 不支持统一缓冲区对象,它只有 OpenGL ES2.0

    • 如果你真的想使用一个大的统一数据集,唯一的方法就是使用纹理。(但在这种情况下真的不推荐。)
于 2017-07-17T08:13:44.810 回答
0

如果您可以使用 OpenGL ES3.0,那么您可以使用统一缓冲区。任何支持 ES3.0 的 Android 设备都应该支持 UBO。

于 2017-07-17T07:41:16.720 回答