我正在尝试在 Android 上使用 OpenGL ES 实现离屏渲染。我的最终目标是提高我在普通 java 和 Bitmap/int[] API 中所做的纹理映射的性能。我尝试了 pbuffer 方法,类似于来自相关论坛主题。它显示出相当低的性能,glReadPixels
呼叫在一台设备上最多需要 50 毫秒,在另一台设备上最多需要 15 毫秒。
有更现代的方法使用帧缓冲区。代码示例相当复杂,我预计从帧缓冲区到 Android 位图的传输速度不会比使用 pbuffers 快得多。我的估计正确吗?
第三种方法是使用像素图。如果我理解文档正确的话,他们应该在 OpenGL 和 Dalvik 内存之间使用比简单复制更复杂的内存共享。问题是Android SDK中没有相关的API。
没有eglCreateImageKHR
and EGLImageKHR
Java 中公开的结构。我能找到的所有 C++ 示例都依赖于它们。
有eglCreatePixmapSurface
但我无法从文档中弄清楚如何使用它。可能它在中接收某种位图句柄native_pixmap
参数,但我找不到任何方法来创建这样的句柄。搜索“eglCreatePixmapSurface android”只会导致问题报告。
我的主要问题是:我可以在 Android 上通过 Java 使用像素图而无需编写本机代码吗?如果我需要原生,在深入研究 OpenGL 之前,是否可以使用工作代码来评估性能?
提高 Android 上纹理加载性能的最佳方法是将您放置的 EGL 图像扩展和 EGL_NATIVE_BUFFER_ANDROID 与本机代码结合使用。我在这有一个代码示例article。我通过这种方法测量了主要的性能改进。
Android 不支持 Pixmap,并且 pbuffers 不适用于 Nvidia Tegra 设备。您应该使用 FBO 附加纹理来代替。这就是 Android SurfaceTexture 类的实现方式。
如果您需要 alpha 纹理,这是使用本机代码的另一个原因。
位图和带有 alpha 纹理的 OpenGL ES 之间存在兼容性问题。
使用硬件纹理压缩格式(ETC/PVR 而不是 PNG)和 mipmap 也可以大大提高纹理渲染的加载性能和质量,如本文中所讨论的article.
最大的问题是 glReadPixels()。 EGL_NATIVE_BUFFER_ANDROID 仅适用于写入纹理,不适用于将它们读回位图。 Android的平台代码使用glReadPixels()来实现TextureView.getBitmap(),速度非常慢。最好的解决方案是不将纹理复制到位图,而是直接显示渲染的TextureView,从而避免glReadPixels()。
我一直在使用 OpenGL ES 2.0,3.0 的情况可能有所改善。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)