【问题标题】:Quickly Updating OpenGL Textures快速更新 OpenGL 纹理
【发布时间】:2011-12-31 19:34:33
【问题描述】:

我正在开发的 Android 应用需要渲染一些大型位图,这些位图每帧都会不断更新。在过去的一年中,我通过 SurfaceView 和 Canvas 渲染它们,但现在由于 Galaxy Nexus 的巨大屏幕尺寸,绘制大位图非常慢。

我正在尝试将渲染交换为 openGL,但我无法以足够快的速度每帧更新纹理。目前我正在使用 glTexSubImage2d() 将位图数据复制到每一帧的纹理中,但这太慢了。我搜索了一下,显然是glCopyTexSubImage is somewhat faster,但Android 实现不接受数据参数。

有什么建议可以不延迟地渲染动态纹理吗?

【问题讨论】:

  • 我找到了一个声称调用 texImage2d 然后在同一帧中渲染的源会使 GPU 停顿,并建议使用双缓冲。但是,我不确定双缓冲会有什么帮助。 groups.google.com/group/android-developers/browse_thread/thread/…
  • 您对位图进行了哪些更新?如果您能够为每一帧更新位图,这不会有什么大的变化,对吧?
  • 我不是想用一个问题来回答一个问题,但我只是好奇.....你是用java还是c/c++调用你的opengl?
  • Java,虽然我使用的 gl 方法应该只调用本机方法。
  • 这是一个照片编辑应用程序,所以它可以是任何东西,从在屏幕上对角线绘制一条线,或模糊一部分,或从图层中剪切一个选择。位图操作很快。问题是它们必须在位图对象上完成,因为我使用 Canvas 对象的功能。

标签: java android opengl-es


【解决方案1】:

我不确定这是否能回答您的问题,但我这样做的方式是我在 C/C++ 中分配了一个帧缓冲区,并通过 ByteBuffer (jni->NewDirectByteBuffer()) 将其传递给 java。我把它用作纹理,它工作得又快又好。然后,我可以直接在 C/C++ 中修改此帧缓冲区,并且在 OpenGL 表面上执行渲染后,这些更改立即可见。我目前在使用 ICS Galaxy Nexus 时遇到问题,因为如果纹理超过 2048x2048 像素,它就无法正确应用纹理。我假设错误与设备的硬件约束有关,但我仍在做一些测试。

【讨论】:

  • 这听起来非常有趣。我会仔细看看的。你有更多关于你是如何工作的信息吗? (例如,如何将字节缓冲区用作 openGL 纹理)谢谢!
  • OpenGL 方法将 ByteBuffer(或 CharBuffer)作为参数。例如,gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, 0, 0, textureWidth, textureHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, charBuffer);。您可以通过jni->NewDirectByteBuffer() 方法将此缓冲区从 C/C++ 传递给 Java。
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多