1

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

4

1 回答 1

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

于 2013-08-14T19:03:43.147 回答