我在 OpenGL ES 2.0 中为 android 编写小应用程序。一切都很顺利,但今天我实现了 2D 文本绘图。我只是创建普通的 Canvas ,在上面写文字,然后我只是将这个位图加载为 2D 纹理并绘制它。这是我用来更改文本值的方法。
public void setText(String text){
if(!this.text.equals(text)){
this.text = text;
Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(bitmap);
bitmap.eraseColor(0);
Paint textPaint = new Paint();
textPaint.setTextSize(32);
textPaint.setAntiAlias(true);
textPaint.setARGB(0xff, 0x00, 0x00, 0x00);
textPaint.getTextBounds(text, 0, text.length(), bounds);
canvas.drawText(text, 0, bounds.height(), textPaint);
GLES20.glDeleteTextures(1, new int[]{textureHandle}, 0);
this.setTexture(bitmap);
bitmap.recycle();
}
}
我想尝试一下,所以我开始计算 onDrawFrame 调用的数量。它运行良好,但在第 1045 次调用时它卡住了,然后它继续运行了几帧,然后应用程序就崩溃了。
我得出结论,这可能是由于缺少可用内存而发生的,因此我添加了 GLES20.glDeleteTextures(1, new int[]{textureHandle}, 0);从内存中释放不必要的纹理,但它没有改变任何东西。
有什么想法可能有问题吗?
谢谢唐克斯
最佳答案
如果调用 setText() 的线程与其余 OpenGL ES 代码不同,那么这就是问题所在。对 OpenGL ES 的所有调用都必须从 Android 上的单个线程进行。本文对此提供了更多详细信息:
关于Android OpenGL 应用程序在几次 onDrawFrame 调用后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238998/