我正在OpenGL ES 2.0中为android编写一个小应用程序。一切都很顺利,但今天我实现了2D文本绘制。我只是创建一个普通的画布,在上面写文本,然后把这个位图加载为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);从内存中释放不必要的纹理,但它没有改变任何东西。
有什么想法吗?哪里可能有问题?
感谢Toneks
如果setText()被不同于OpenGL ES代码其余部分的线程调用,那么这就是问题所在。所有对OpenGL ES的调用都必须在Android上的单个线程中进行。这篇文章提供了更多的细节:
http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1