Android和OpenGL启动时出现黑屏问题

5
我目前正在为我的客户编写一款Android应用程序,其中包含一个带有GLSurfaceView.Renderer的GLSurfaceView。
我的整个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...
}

如果我除了onSurfaceCreated中的glClearColor(..)之外,删除了所有的代码行,我仍然会在我的实际背景色设置之前看到一个黑色的闪光。如果我只从我的代码中删除glClearColor(..)(因此保留所有其他的OpenGL内容),那么一切都会被渲染在黑色背景上。
我希望看到的是,我只想摆脱这个黑色的闪光,因此我的背景颜色可以在启动时正确初始化......
有任何想法如何实现这一点吗?
Dirk

你是否查看了代码中所有缓冲区交换发生的位置?通常在开始绘制之前清除屏幕颜色是很有必要的,否则屏幕上会充满应用程序启动时VRAM中的垃圾(相信我,这看起来比黑屏闪烁不太专业)。立即交换缓冲区是实现此目的的一种技巧。 - Andon M. Coleman
1个回答

6

我遇到了同样的问题,并通过使用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);
           }                
       });
    }

请注意,只能从UI线程而不是onDrawFrame()运行的渲染线程中触摸View的背景属性,因此需要发布可运行程序。
在Android 4.4上,这可以完美地启动,没有可怕的刺耳黑色帧。我还没有尝试过旧版Android。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接