Honeycombでhwアクセラレーションを有効にし、Canvasにビットマップを表示しようとしています。すべて正常に動作しますが、大きなビットマップ(1次元で2048以上)の場合、ログにエラーが記録されます。
OpenGLRenderer:ビットマップが大きすぎてテクスチャにアップロードできない
これはハードウェアの制限によるものであり、ハードウェアアクセラレーションが有効になっている場合に表示される最大ビットマップサイズを小さくすることで回避できます(View.isHardwareAccelerated()で確認)。
私の質問は、ハードウェアによるビットマップ描画に使用可能な最大テクスチャサイズを簡単に決定する方法です。私のデバイスでは2048が制限のようですが、デバイスによって異なる場合があります。
編集:OpenGLアプリを作成するのではなく、ハードウェアアクセラレーションを利用できる通常のアプリのみを作成します。したがって、私はOpenGLにまったく精通していません。ログにOpenGL関連のエラーが表示されるだけで、それを解決しようとしています。
現在、最小制限は2048pxです(つまり、ハードウェアmust少なくとも2048x2048のテクスチャをサポートします。)ICSでは、Canvasクラスに新しいAPIを導入します。この情報:Canvas.getMaximumBitmapWidth()
およびCanvas.getMaximumBitmapHeight()
。
最大許容サイズを取得する別の方法は、すべての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ミリ秒しかかかりませんでした。
デバイスのテクスチャサイズの制限を動的に知りたい場合(デバイスに応じて変化するため)、このメソッドを呼び出す必要があります。
int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
一部のデバイス(Nexus Oneなど)では、テクスチャサイズは2のべき乗でなければならないことを忘れないでください!
私の答えは、このトピックの最後の更新後長い時間がかかることを知っています...ごめん
仕様によれば、GL_MAX_TEXTURE_SIZE
でglGetIntegerv
を呼び出します。
GL_MAX_TEXTURE_SIZE paramsは1つの値を返します。この値は、GLが処理できる最大のテクスチャの大まかな推定値を示します。値は少なくとも64でなければなりません。
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml