2013-11-14 1 views
4

В настоящее время я пишу приложение для Android для своих клиентов, у которых есть GLSurfaceView с GLSurfaceView.Renderer.Android и OpenGL дает черный кадр при запуске

Весь мой продукт OpenGL работает просто отлично (это в основном порт того, что другой разработчик написал на iOS в первую очередь). За исключением одного. Когда изображение загружается, и, таким образом, материал OpenGL загружается, мой фон быстро мигает черным, а затем OpenGL начинает рендеринг правильно (с моим фоном). Так что я делаю:

В onSurfaceCreated я начинаю с этим:

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    GLES20.glClearColor(0.9f + 0.1f * (21.0f/255), 
      0.9f + 0.1f * (36.0f/255), 
      0.9f + 0.1f * (31.0f/255), 1.0f); 

    // Here goes my other stuff, if I comment all my other stuff out I still get the flash at startup 
} 

В моем методе onDrawFrame я это делаю:

@Override 
public void onDrawFrame(GL10 gl) { 

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

    // My stuff, again, if I comment all this stuff out I still get the flash... 
} 

Так, если удалить все строки кода, за исключением glClearColor (..) in onSurfaceCreated Я все еще вижу черную вспышку перед установкой фактического цвета фона. Если я удалю только glClearColor (..) из моего кода (и, таким образом, оставим все остальные элементы OpenGL на месте), все будет отображаться на черном фоне.

То, что я хотел бы видеть, что я просто избавиться от черной вспышки и, таким образом, что мой цвет фона инициализируется правильно при запуске ...

Любые идеи, как я могу добиться этого?

Dirk

+0

Вы просматривали все местоположения, где в вашем коде происходят своп-буферы? Часто желательно очистить экран до цвета, прежде чем начинать рисовать, потому что в противном случае экран будет заполнен любым мусором в VRAM, когда приложение запустится (и поверьте, это выглядит намного менее профессионально, чем черная вспышка). Подмена буферов немедленно - это один трюк, используемый для этого. –

ответ

3

Я просто ударил с такой же проблемой и работал вокруг него, используя фоновое свойство GLSurfaceView в. Вот мой XML:

<view class="android.opengl.GLSurfaceView" 
    android:id="@+id/glview" 
    android:background="@drawable/window_bg" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

Где window_bg тот же рисуют, как фон окна, указанный в теме деятельности.

Сделав это, вы затем удалить фон рисуем при первом обращении к onDrawFrame(), используя логическое значение для отслеживания того, что это уже было сделано или нет:

boolean initialRenderHack; 

// 
// GLSurfaceView.Renderer 
// 
@Override 
public void onDrawFrame(GL10 gl10) { 

     // ... drawing code goes here ... 

     // Remove the initial background 
     if (!initialRenderHack) { 
     initialRenderHack = true; 
     view.post(new Runnable() { 
      @Override 
      public void run() { 
       view.setBackgroundResource(0); 
      }     
     }); 
    } 

Обратите внимание, что вы можете коснуться только View-х фоновое свойство из потока пользовательского интерфейса, а не поток рендеринга, который выполняется onDrawFrame(), следовательно, необходимо опубликовать runnable.

На Android 4.4 это дает совершенно жидкий запуск без ужасной резкой черной рамки. Я еще не пробовал это со старыми андроидами.

 Смежные вопросы

  • Нет связанных вопросов^_^