EGLConfigChooser
をに渡して実装していますので、アプリケーションのニーズに応じて現在のデバイスに最適な設定を選択できます。HTC DesireのEGLConfigでデバイスをハングアップする
より具体的には、使用可能なすべての設定を照会して、最も深いバッファサイズ(最も深いバッファサイズを持つものと最大の色深度を持つものの間)と、壁のコード次の:
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): Chosen EGLConfig:
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_RED_SIZE = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_BLUE_SIZE = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_GREEN_SIZE = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_ALPHA_SIZE = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_DEPTH_SIZE = 24
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_ALPHA_FORMAT = 24
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_ALPHA_MASK_SIZE = 0
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_STENCIL_SIZE = 8
:
@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display)
{
//Querying number of configurations
int[] num_conf = new int[1];
egl.eglGetConfigs(display, null, 0, num_conf); //if configuration array is null it still returns the number of configurations
int configurations = num_conf[0];
//Querying actual configurations
EGLConfig[] conf = new EGLConfig[configurations];
egl.eglGetConfigs(display, conf, configurations, num_conf);
EGLConfig result = null;
for(int i = 0; i < configurations; i++)
{
Log.v("EGLConfigChooser", "Configuration #" + i);
print(egl, display, conf[i]);
result = better(result, conf[i], egl, display);
}
Log.v("EGLConfigChooser", "Chosen EGLConfig:");
print(egl, display, result);
return result;
}
/**
* Returns the best of the two EGLConfig passed according to depth and colours
* @param a The first candidate
* @param b The second candidate
* @return The chosen candidate
*/
private EGLConfig better(EGLConfig a, EGLConfig b, EGL10 egl, EGLDisplay display)
{
if(a == null) return b;
EGLConfig result = null;
int[] value = new int[1];
egl.eglGetConfigAttrib(display, a, EGL10.EGL_DEPTH_SIZE, value);
int depthA = value[0];
egl.eglGetConfigAttrib(display, b, EGL10.EGL_DEPTH_SIZE, value);
int depthB = value[0];
if(depthA > depthB)
result = a;
else if(depthA < depthB)
result = b;
else //if depthA == depthB
{
egl.eglGetConfigAttrib(display, a, EGL10.EGL_RED_SIZE, value);
int redA = value[0];
egl.eglGetConfigAttrib(display, b, EGL10.EGL_RED_SIZE, value);
int redB = value[0];
if(redA > redB)
result = a;
else if(redA < redB)
result = b;
else //if redA == redB
{
//Don't care
result = a;
}
}
return result;
}
(ロガーへのプリント方法プリントEGLConfig値)今
、それが正常に動作するように見える、それは次のような構成を選択し、
この設定を使用すると、電話画面が紫色のアーティファクトで緑色に変わり(シーンは木製のテーブルで黒く見えます)、完全にハングしてあらゆる種類の入力に応答しなくなります。デバッガ経由で私のプロセスを終了し、そうするとデバイスが再起動します(?!!)。
どうすればこのような問題の原因となる設定を返すのですか。eglGetConfigs
あなたの誰かが何か似たような経験をしていますか、私のコードに何らかの欠陥がありますか?私はそれを二重にチェックしましたが、それは私には大丈夫です(それはhttp://brandnewreality.com/blog/android-egl-querying-your-gl-driverに触発されています)
ありがとうございます。追加
リンクprint()メソッドが壊れています。ここはウェイバックマシンからです:https://web.archive.org/web/20111230060315/http://brandnewreality.com/blog/android-egl-querying-your-gl-driver – kurtzmarc