几次onDrawFrame调用后,Android OpenGL应用程序崩溃了

时间:2013-08-14 18:03:17

标签: android opengl-es

我在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

1 个答案:

答案 0 :(得分:1)

如果setText()被一个不同于其他OpenGL ES代码的线程调用,那就是问题所在。所有对OpenGL ES的调用都必须来自Android上的单个线程。本文提供了更多详细信息:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1