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

标签 android opengl-es

我在 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 上的单个线程进行。本文对此提供了更多详细信息:

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

关于Android OpenGL 应用程序在几次 onDrawFrame 调用后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238998/

相关文章:

android - 如何在Android状态栏通知中显示正确的当前时间?

android - 使用 Apportable 时可以在 xcode 中安装 Android 设备模拟器吗

java - OpenGL-ES 寻找正确的坐标(翻译等...)

iphone - 如何在 OpenGL ES 2.0 中创建带有模板缓冲区的 FBO?

android 动态壁纸 水波纹效果

android - OpenGL ES 多个对象未被渲染

java - 当按后退按钮时, ListView 会转到顶部。如何解决这个问题?

java - 我应该把我的文件 ndk 放在哪里

android - 如何选择回收站 View 中的项目并将项目位置获取到我的 Activity

c++ - OpenGL 在 Qt 中绘制小​​部件