Android和OpenGL在启动时提供黑色框架

Android和OpenGL在启动时提供黑色框架,android,opengl-es-2.0,renderer,glsurfaceview,Android,Opengl Es 2.0,Renderer,Glsurfaceview,我目前正在为我的一个客户编写一个Android应用程序,该应用程序具有GLSurfaceView和GLSurfaceView.Renderer 我的整个OpenGL都工作得很好(它基本上是另一个开发人员首先在iOS上编写的一个端口)。除了一件事。 当视图被加载,因此OpenGL的东西被加载时,我的背景会快速闪烁黑色,然后OpenGL开始正确渲染(使用我的背景)。所以我要做的是: 在onSurfaceCreated中,我从以下内容开始: @Override public void onSurfac

我目前正在为我的一个客户编写一个Android应用程序,该应用程序具有GLSurfaceView和GLSurfaceView.Renderer

我的整个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

我刚刚遇到了同样的问题,并通过使用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"
    />
请注意,您只能从UI线程而不是运行onDrawFrame()的渲染线程中触摸视图的背景属性,因此需要发布runnable


在安卓4.4上,这提供了一个完美流畅的启动,没有可怕的黑色框架。我还没有在旧的Androids上试用过。

您有没有查看过代码中发生缓冲区交换的所有位置?通常,在开始绘制之前,最好将屏幕清除为一种颜色,否则当应用程序启动时,屏幕将充满VRAM中的任何垃圾(相信我,这看起来比黑屏闪光灯要不专业)。立即交换缓冲区是实现这一点的一个技巧。
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);
           }                
       });
    }