3

我的应用程序基于 openGL,支持 ES 1.1 和 ES 2.0。

我的视图控制器有一个视图,它是 EAGLView 的一个实例(根据 Apple 的示例代码),它反过来为 ES 1.1 或 2.0 使用不同的“渲染器”对象(对于使用过 Xcode 示例的任何人来说,这几乎是标准)。

我使用 CADisplayLink 来更新屏幕。我的目标是至少 iOS 4.0+,所以应该没有问题。

启动时,显示启动图像 (Default.png) 后的第一帧呈现黑色。中间有一帧烦人的黑色闪烁。

如果在制作窗口 Key and Visible 之前我“伪造”了一轮更新/渲染周期(以便将后台缓冲区也渲染到,而不是空的),则闪烁消失但仅在使用 ES 2.0 时才会消失

我将 kEAGLDrawablePropertyRetainedBacking 设置为 YES,但是这两个值似乎都没有任何区别。

使用 ES 1.1 时,闪烁仍然存在。唯一的区别是,如果我在使窗口可见之前执行“刷新”,屏幕会闪烁到我使用 glClearColor() 指定的颜色。但是如果我不预刷新,闪烁总是黑色的。

我已经在 Cocos2d 论坛上一次又一次地看到关于这个问题的讨论,但即使在那里,这个问题似乎总是在每次提出新的 hack 之后又回来咬你。

尽管如此,我使用的是普通 OpenGL ES(不是Cocos2d 或任何其他库),但无论我如何搜索网络,都找不到任何有类似问题的人......

有什么提示吗?

4

4 回答 4

4

问题的原因与您所诊断的差不多——当相关的视图控制器立即完成加载时(即,当 Default.png 图像被删除时),它还没有任何内容。CADisplayLink 直到该帧结束才会触发。

我认为正确的做法是进行完整的重绘并呈现在 viewDidLoad: 中,因为您要在此处设置不在 NIB 中的视图位。这不应该在任一渲染路径中引入延迟帧,假设它们是作为单缓冲区或双缓冲区实现的。

假设还有其他一些无法诊断的问题,在一种情况下,我有一个应用程序,由于代码的性质超出了我的控制范围(作为一个跨平台端口,我无法提前绘制框架)只做胶水代码)。所以我所做的是在我的第一个视图控制器之上添加一个包含 Default.png 的全屏 UIImageView。然后我等待了一帧并删除了 UIImageView。无论您的渲染循环如何,这都应该有效。

于 2011-02-25T12:13:00.417 回答
1

我通过在绘制第一帧之前添加额外的 presentRenderbuffer(当然,前面有 glBindRenderbuffer)解决了同样的问题。出于某种原因,GLView 需要两个 presentRenderbuffer 调用才能开始显示任何内容。我想这可能与一些后台缓冲区处理有关,尽管这很奇怪。

于 2012-12-11T08:29:29.357 回答
0

您需要在layoutSubviewsOpenGLView 类的方法中重绘场景。

-(void)layoutSubviews {
    GLint backingWidth, backingHeight;

    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);

    glViewport(0, 0, backingWidth, backingHeight);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    [scene draw];
    [context presentRenderbuffer:GL_RENDERBUFFER];
}
于 2013-02-15T09:17:43.553 回答
-1

在基于视图的应用程序上打开 eaglview 时,我遇到了类似的问题。我有一秒钟的黑屏闪烁,然后打开了opengl视图。有效的只是eaglLayer.opaque = NO;在课堂上制作initWithCoder方法。EAGLView

于 2013-09-16T17:56:41.297 回答