Android和OpenGL在启动时提供黑框

dir*_*ert 5 android renderer glsurfaceview opengl-es-2.0

我正在为一个拥有GLSurfaceView和GLSurfaceView.Renderer的客户编写一个Android应用程序.

我的整个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
}
Run Code Online (Sandbox Code Playgroud)

在我的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...
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我删除除onSurfaceCreated中的glClearColor(..)之外的所有代码行,我仍然会在设置实际背景颜色之前看到黑色闪光.如果我只从我的代码中删除glClearColor(..)(从而将所有其他OpenGL内容留在原处),所有内容都在黑色背景上呈现.

我想看到的是,我只是摆脱黑色闪光,因此我的背景颜色在启动时正确初始化...

有什么想法我能做到吗?

短剑

Reu*_*ton 5

我只是遇到了同样的问题,并使用GLSurfaceView的background属性解决了这个问题.这是我的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"
    />
Run Code Online (Sandbox Code Playgroud)

其中window_bg与活动主题中指定的窗口背景相同.

完成此操作后,您将在第一次调用onDrawFrame()时删除背景drawable,使用布尔值来跟踪它是否已经完成:

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);
           }                
       });
    }
Run Code Online (Sandbox Code Playgroud)

请注意,您只能从UI线程触摸View的background属性,而不是onDrawFrame()运行的渲染线程,因此需要发布runnable.

在Android 4.4上,这提供了一个完美流畅的启动,没有可怕的黑色框架.我尚未尝试使用旧的Androids.