3

変換してビットマップをlibGDXテクスチャに変換しようとしています:

  1. AndroidBitmapからbyte[]
  2. byte[]libGDXへPixmap
  3. libGDXPixmapからlibGDXTexture

私が直面している問題は、テクスチャに変換されるビットマップが、アセットフォルダにあるテクスチャパッカーからスプライトシートを描画していることです。

public void onByteArrayOfCroppedImageReciever(byte[] bytes) {
    try {
        pmap=new Pixmap(bytes, 0, bytes.length);
        tex=new Texture(pmap);
        face=new Sprite(tex);
        // game.setScreen(new GameScreen(game, batcher, face));
    } catch(Exception e) {
        Gdx.app.log("KS", e.toString());
        e.printStackTrace();
    }
}
4

4 に答える 4

12

うーん、別の可能性は、スレッドの問題があることです。libgdx がレンダリング スレッドで同時にテクスチャをロードしているときに、独自のアンマネージ テクスチャを UI スレッドでロードすると、この種の問題に気づきました。これが問題である場合、簡単な解決策は、Gdx.app.postRunnable を使用してテクスチャの作成をレンダリング スレッドと同期させることです。すなわち:

public void onByteArrayOfCroppedImageReciever(byte[] bytes) {
    try {
        pmap=new Pixmap(bytes, 0, bytes.length);
        Gdx.app.postRunnable(new Runnable() {
            @Override
            public void run() {            
                tex=new Texture(pmap);
                face=new Sprite(tex);
            }
        });
    } catch(Exception e) {
        Gdx.app.log("KS", e.toString());
        e.printStackTrace();
    }
}
于 2013-05-02T00:47:10.550 に答える
1

pixmapクラスはバイト変換に時間がかかり、プロセスが終了していない場合に一時的なpixmapを返すことがあるため、新しいスレッドでコーディングする必要があるため、別のスレッドで実行すると問題が解決します。

于 2013-06-20T07:11:03.090 に答える
1

その運用パイプラインにコミットしていますか? 要求した変換を行う別の方法を次に示します。

  1. com.badlogic.gdx.graphics.TextureData を実装して、コンストラクターで android.graphics.Bitmap を取得します。
  2. prepare() で、Bitmap.getPixels を使用して IntBuffer を割り当てて埋めます。
  3. bitmath を使用して、バッファ内のデータを ARGB から RGBA に交換します。(arr[i] << 8) | (arr[i]>>24)
  4. getType() で TextureData.TextureDataType.Compressed を返します
  5. consumerCompressedData() で glTexImage2D を呼び出して、データを (事前バインドされた) テクスチャにフィードします。

上記のパイプラインには、ピクセル データの複数のコピーと再圧縮が含まれています。このパイプラインにより、Bitmap データを 1 つのコピーだけでテクスチャに直接送ることができます (とにかくバイト形式の変換に必要です)。それはあなたのために働くでしょうか?

于 2013-07-26T14:49:08.110 に答える