47

ハニカムでハードウェア アクセラレーションを有効にして、キャンバスにビットマップを表示しようとしています。すべて正常に動作しますが、大きなビットマップ (1 次元で >2048) の場合、ログにエラーが表示されます:

OpenGLRenderer: ビットマップが大きすぎてテクスチャにアップロードできません

これはハードウェアの制限によるものであり、ハードウェア アクセラレーションが有効になっている場合 (View.isHardwareAccelerated() で確認)、表示される最大ビットマップ サイズを減らすことで回避できます。

私の質問は、ハードウェアによるビットマップ描画に使用できる最大テクスチャ サイズを簡単に決定する方法です。私のデバイスでは 2048 が制限のようですが、別のデバイスでは異なる場合があります。

編集: 私は OpenGL アプリを作成しているのではなく、ハードウェア アクセラレーションを利用できる通常のアプリを作成しています。したがって、私は OpenGL にまったく精通していません。ログに OpenGL 関連のエラーが表示され、それを解決しようとしています。

4

4 に答える 4

67

現在、最小制限は 2048px です (つまり、ハードウェアは少なくとも 2048x2048 のテクスチャをサポートする必要があり
Canvas.getMaximumBitmapWidth()ます)。ICS では、次の情報を提供する新しい API を Canvas クラスに導入しますCanvas.getMaximumBitmapHeight()

于 2011-09-23T01:07:38.840 に答える
18

最大許容サイズを取得する別の方法は、すべての EGL10 構成をループして最大サイズを追跡することです。

public static int getMaxTextureSize() {
    // Safe minimum default size
    final int IMAGE_MAX_BITMAP_DIMENSION = 2048;

    // Get EGL Display
    EGL10 egl = (EGL10) EGLContext.getEGL();
    EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);

    // Initialise
    int[] version = new int[2];
    egl.eglInitialize(display, version);

    // Query total number of configurations
    int[] totalConfigurations = new int[1];
    egl.eglGetConfigs(display, null, 0, totalConfigurations);

    // Query actual list configurations
    EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
    egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);

    int[] textureSize = new int[1];
    int maximumTextureSize = 0;

    // Iterate through all the configurations to located the maximum texture size
    for (int i = 0; i < totalConfigurations[0]; i++) {
        // Only need to check for width since opengl textures are always squared
        egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize);

        // Keep track of the maximum texture size
        if (maximumTextureSize < textureSize[0])
            maximumTextureSize = textureSize[0];
    }

    // Release
    egl.eglTerminate(display);

    // Return largest texture size found, or default
    return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION);
}

私のテストでは、これは非常に信頼性が高く、インスタンスを作成する必要はありません。パフォーマンスに関しては、Note 2 で実行に 18 ミリ秒かかり、G3 ではわずか 4 ミリ秒でした。

于 2014-11-08T23:36:34.700 に答える
8

デバイスのテクスチャ サイズ制限を動的に知りたい場合 (デバイスによって異なるため)、次のメソッドを呼び出す必要があります。

int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);

また、一部のデバイス (Nexus One など) では、テクスチャ サイズは 2 の累乗でなければならないことを忘れないでください。

このトピックの最後の更新から長い時間が経ってから回答が来ることを知っています...申し訳ありません

于 2012-07-26T08:43:04.850 に答える
4

仕様によると、 で呼び出しglGetIntegervますGL_MAX_TEXTURE_SIZE

GL_MAX_TEXTURE_SIZE パラメータは 1 つの値を返します。この値は、GL が処理できる最大のテクスチャの概算を示します。値は 64 以上である必要があります。

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml

于 2011-09-18T08:00:39.067 に答える