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); を追加しました。不要なテクスチャをメモリから解放しますが、何も変更されていません。

問題になる可能性のあるアイデアはありますか?

ありがとう

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 に答える