web-dev-qa-db-ja.com

ハードウェアアクセラレーションアクティビティ-OpenGLテクスチャサイズの制限を取得する方法

Honeycombでhwアクセラレーションを有効にし、Canvasにビットマップを表示しようとしています。すべて正常に動作しますが、大きなビットマップ(1次元で2048以上)の場合、ログにエラーが記録されます。

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

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

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

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

45
Pointer Null

現在、最小制限は2048pxです(つまり、ハードウェアmust少なくとも2048x2048のテクスチャをサポートします。)ICSでは、Canvasクラスに新しいAPIを導入します。この情報:
Canvas.getMaximumBitmapWidth()およびCanvas.getMaximumBitmapHeight()

65
Romain Guy

最大許容サイズを取得する別の方法は、すべての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ミリ秒しかかかりませんでした。

16
Pkmmte

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

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

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

私の答えは、このトピックの最後の更新後長い時間がかかることを知っています...ごめん

6
VinceFR

仕様によれば、GL_MAX_TEXTURE_SIZEglGetIntegervを呼び出します。

GL_MAX_TEXTURE_SIZE paramsは1つの値を返します。この値は、GLが処理できる最大のテクスチャの大まかな推定値を示します。値は少なくとも64でなければなりません。

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

3
K-ballo