我正在编写一个Android应用程序,它需要绘制大量在网格中对齐的图片。计划绘制约2000幅图画(建立马赛克)。每张图片的尺寸均为 1024x1024。当然,我在那里遇到了严重的效率问题。
现在我正在使用 OpenGL ES 2.0 进行绘图。我有一个线程将图像从资源加载到位图对象中,并将它们传递到中央池。然后,OpenGL 的渲染线程从该池中获取图像,将图像数据从位图加载到 GPU,并将其绘制在构建的网格的右侧单元格上。
这太慢了。我使用 Android 模拟器对这个过程进行了一些测量。将资源加载到位图对象中大约需要 60 毫秒。将位图加载到 GPU + 绘图大约需要 15ms。
我不清楚如何加快速度并以至少 30 FPS 的速度完成此操作。我目前的想法是使用外部库来加载位图,并且可能使用 NDK 来加快速度。我还了解纹理图集和批处理我的绘图。我可以实现这个,但由于我的问题是在运行时从资源加载图像,所以我现在没有尝试。
也许有人可以给我关于如何有效地做到这一点的建议。
谢谢大家。
最佳答案
首先,我只想澄清一下,因为我认为您的标题具有误导性 - 根据您的描述,您真正的问题不是绘图而是加载。您并没有真正说您是否有绘图问题(您提到了加载和绘图的 fps)。
您没有提及所有要求,例如 - 您需要多长时间绘制所有要求?例如,也许您可以将第一个 X 作为应用程序加载的一部分加载,因此当应用程序加载时,纹理已经创建并可以绘制,同时在专用线程中加载另一个 X,依此类推...... 另一种方法是拥有低分辨率图像和高分辨率图像,首先加载低分辨率图像,然后再替换(例如,按需)。我不确定这对于 2000 张图像来说在内存方面是否合理,但您可以检查一下。
另外,我建议看一下 Rajawali - 这是一个很好的框架,有很好的示例,包括多个纹理(Google Play 中也有示例应用程序)。也许它会有所帮助。
关于java - 使用 OpenGL ES 2.0 在 Android 中高效绘制许多纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551154/