2012-02-23 3 views
1

私はSpriteクラスと、OpenGLSurvaceビューを使ってスプライトクラスを拡張する別のクラスを持っています。それはそれはOpenGLのテクスチャを作成するためにdecodeResource関数を呼び出すloadBitmap機能がロードされたテクスチャへの静的ポインタを使用して、あなたが見ることができるように、このEclipseでデバッガを使用しているときにOpenGLテクスチャがうまくレンダリングされますが、アプリケーションを単独で実行すると白くレンダリングされるのはなぜですか?

public class Invader extends Sprite { 

    static int mTextureId = -1; 

    Invader(Context context, float x, float y, float angle) 
    { 
     super(context, x, y, angle); 
     super.setSize(width, height); 
//  super.setPos(x, y); 
//  super.setAngle(angle); 

     // Check to see if the texture is loaded already. If it is a valid texture 
     // id, don't bother loading it again 
     if (mTextureId < 0) 
     { 
      super.loadBitmap(context.getResources(), R.drawable.piano_key_white); 
     } 
     else 
     { 
      super.setTexture(mTextureId); 
     } 
    } 

    @Override 
    protected int getTexture() 
    { 
     return mTextureId; 
    } 

    @Override 
    protected void setTexture(int textureId) 
    { 
     mTextureId = textureId; 
    } 

} 

ようになります。 SDKプラグインを使用してEclipseを使用してデバッガからアプリケーションを実行すると、すべてが素晴らしいように見えます。アプリケーションを通常電話で実行すると、インベーダーを白い四角形(オブジェクトの色)としてレンダリングするこのクラス以外は、すべてがうまく描画されます。

私が見つけたことから、テクスチャが適切に読み込まれていない可能性があります。したがって、白い四角形が描画されます。私は、なぜこれがデバッグで動作し、通常の実行中ではないのか分かりません。何か案は?リモートデバッグでプログラムが実行されていないときの違いは何ですか?

+0

私はコードを読む前に私は答えました。うーん、私はあなたが何をしているのか分からず、あなたは絶対に0のOpenGLコードを投稿したので、トラブルシューティングのために何もない。私の答えを試してみてください。それがうまくいかない場合、あなたはSOLであり、実際のOpenGLコードを投稿してそれ以上の助けを必要とします。 – Kaa

+0

投稿したコードを振り返ってみると、OpenGLコードがないことに気づきました。私はエラーが何であったかを理解したと思う。デバッグを開始して解放されたRendererオブジェクトへの静的参照がありました。しかし、デバッグせずに自分の携帯電話からプログラムを実行したとき、以前の静的リファレンスはglテクスチャIDを参照していましたが、glリソースが解放されてホワイトボックスが作成されました。 – ilektron

+0

あなたの答えに私のコメントを読んでください。私が失礼すると謝るが、あなたが言ったことは全く意味がない。また、何も参照しないでください。混乱していてjavaに存在しません。 – Kaa

答えて

0

テクスチャサイズが2の累乗であることを確認してください。さまざまなデバイスが、テクスチャをサイジング制約に準拠していない限り正しく読み込むことはできません。

IE

1x2の 2x2の 512x256 128×128 など

ここ
+0

テクスチャのパワーはすべて2です。res/drawable-Xdpi /にある場合、イメージはコンパイル時に2の非累乗に変更される可能性がありますか? res/rawフォルダにテクスチャを入れてみましたが、同じことがありました。 – ilektron

1

はあなたが何をする必要があるかです:

  1. 置きテクスチャで "RES /描画可能" フォルダ
  2. ロード中にテクスチャのスケーリングを無効にする、コード:

テクスチャアレイ割り当て(DUH;))

// Texture and geometry data 
private int [] m_textureID = new int[1]; 

ローディング:

 // Load the texture from resource 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inScaled = false; 
    Bitmap bitmap = BitmapFactory.decodeResource(m_resources, R.drawable.tex, options); 

    gl.glGenTextures(1, m_textureID, 0); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, m_textureID[0]); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    // Free resources 
    bitmap.recycle(); 

    // Do some error checking 
    if(m_textureID[0] == 0) 
     throw new RuntimeException("Error loading texture!"); 
1

私はそれを考え出しました。私はこれが学ぶ良い教訓だと思う。私のクラスは別の静的クラスは、スプライトのリストが含まれ、この

public class Sprite { 
    private static int mTextureID = -1; 
    private static boolean mShouldLoadTexture = true; 
... 
    onReder(GL10 gl) { 
     if (mShouldLoadTexture) { 
       mTextureID = loadTexture(gl, someBitmap); 
       mShouldLoadTexture = false; 
     } 
    } 
} 

のように言って何かを見

public static class SpriteList { 
    private static Vector<Sprite> mSprites; 
    ... 
} 

電話がある上、私は反対し、デバッグとしてそれを実行したときの違いは、単にランチャーから実行しますパッケージはすべてスタティッククラスがリセットされていますが、電話機のランチャはスタティッククラスを必ずリセットするわけではありません。

だから、私は最初デバッグとして、それを実行するだろうというとき、クラスが、それは、その後、テクスチャをロードGL10オブジェクト内のテクスチャポインタを割り当て、静的 mTextureIDにそれを割り当てるために必要なことがわかります。この時点で、mTextureIDには有効なGLテクスチャポインタが含まれています。

今度は、デバッグを終了し、Eclipseから切断し、携帯電話でランチャーを実行します。 Spriteクラスのコンテナがリセットされていないため、mTextureIDには存在しないGLテクスチャIDを指し示す値が残っていました。さらに、mShouldLoadTextureは 'false'のままです。つまり、クラスがビットマップからテクスチャをリロードしようとしません。したがって、onRender()は無効なテクスチャIDへのポインタを使用して、代わりに白いボックスを表示しようとします。

シナリオを簡略化して理解しやすくしました。静的コンテナはこの例では意味がありませんが、私が行っていたことがわかっていることを説明するためのものだと思いました。私が含まれているクラスをstaticにしなくても、すべてがうまくいくように機能しました。

+0

申し訳ありませんが、あなたは何の意味もありません。まず第一に、ランチャーはアプリケーションの実行やメモリとは関係なく、起動の意図を送信する以外にはありません。メモリと実行はVM内で処理されます。第2に、デバッグモードでの実行とリリースモードでの実行との違いはありません。少なくとも、静的フィールドの下に格納されている値には違いはありません。アプリでは間違いが間違っており、静的フィールドではありません。あなたのアプリケーションが完全に終了しているとは限りませんし、再開するとGLコンテキストが失われる可能性があります。 – Kaa

+0

あなたは正しい、間違っています。残念なことに、私はJavaの説明にCの理解を使用しようとしました。違いはないはずですが、あります。あなたは、一時停止と再開に逆らって完全にシャットダウンしていないプログラムであることは間違いありません。ランチャーからの実行とは反対の「デバッグ」モードでの実行との違いは、「デバッグ」モードで実行しているときに、アクティビティーを実行する意図が送信される前にプログラムが完全に停止し、存在していた可能性のある静的コンテキストが失われることです。 – ilektron

0

私はこの同じ正確な問題を抱えていました。私にとっては、デバッグモードで初めてアプリを起動したときにテクスチャが読み込まれますが、アプリから電話を終了して再び開いた場合、すべてのテクスチャが消えてしまいました。 IDE内からアプリを再起動しない限り、読み込みにテクスチャを取得できませんでした。

私にとっては、静的フィールドを削除することを提案し、それを完全に固定しました(静的フィールドは、異なるテクスチャのセットを循環する正方形の回転角を保持していました。私のテクスチャリストの現在のテクスチャの)。

静的フィールドが原因でこれが発生する理由はまだ分かりません。

レコードYESでは、テクスチャは2のべき乗の次元であり、それらをdrawable-nodpiフォルダに配置しました。

0

私は同様の問題を抱えていました。問題は、ADBに接続すると実行が遅れてしまうことでした。この遅れは、私のアプリが非常に特殊な条件下でのみ動作し、これらの遅延なしでは全く動作しなくなった原因となりました。 これが誰かを助けてくれることを願っています。

関連する問題