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