2

私の Android 4.3 アプリケーションでは、テクスチャをローカル png から TextureView にロードしたいと考えています。私は OpenGL を知らず、GLTextureActivityハードウェア アクセラレーション テストのコードを使用しています。ローディング テクスチャの部分もここに貼り付けます。

    private int loadTexture(int resource) {
        int[] textures = new int[1];

        glActiveTexture(GL_TEXTURE0);
        glGenTextures(1, textures, 0);
        checkGlError();

        int texture = textures[0];
        glBindTexture(GL_TEXTURE_2D, texture);
        checkGlError();

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

        Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource);

        GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
        checkGlError();

        bitmap.recycle();

        return texture;
    }

Nexus 7と Galaxy Nexus スマートフォンの 2 つのデバイスでコードを実行していますが、両者の速度に大きな違いがあることに気付きました。Nexus 7の場合、描画部分に約 170 ミリ秒かかりますが、Galaxy Nexusの場合は 459 ミリ秒かかります。最も時間のかかる操作は、テクスチャのロード、特にtexImage2D呼び出しです。動作が遅いチップを搭載したデバイスがあることを読みましたtexImage2D-texSubImage2D機能ですが、どのデバイスがそれらのデバイスであるかを誰かがどのように判断し、それらの機能を使用して同じ結果を達成することをどのように回避できますか?

前もって感謝します。

// 編集:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)電話デバイスでの呼び出しも大幅に遅くなるようです。なぜこうなった?どうすれば回避できますか?

4

1 に答える 1

1

フレームの再描画ごとにテクスチャをロードしていますか? それは正しくありません。メイン レンダリング ループの前にテクスチャを 1 回だけロードする必要があります。可能な限り高速なデバイスでも、即座にテクスチャをロードすることはできません。リソースをロードし、そこからビットマップをデコードしてから、GPU にロードします。これには時間がかかります。

于 2014-03-05T15:33:36.157 に答える