【问题标题】:OpenGL Rendering not Resuming after App Backgrounded应用程序后台处理后 OpenGL 渲染未恢复
【发布时间】:2016-08-27 02:37:09
【问题描述】:

我正在使用 OpenGL ES 在 CADisplayLink 上渲染场景:

self.displayLink = CADisplayLink(target: self, selector: #selector(self.updateOpenGL))
self.displayLink!.frameInterval = 1 
self.displayLink!.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

如果我后台应用程序并转到 Spring Board,当我恢复应用程序时,渲染会继续。

但是,如果我将应用程序置于后台,打开另一个应用程序(例如日历),当我将应用程序带回前台时,屏幕就不再呈现了。如果我使用 Xcode 暂停执行,或在渲染管道中的断点处停止,DisplayLink 仍在运行并执行我的 OpenGL 渲染代码。

有什么想法吗?

【问题讨论】:

    标签: ios opengl-es cadisplaylink


    【解决方案1】:

    当应用程序进入后台并返回时,不能保证超时维护 OpenGL ES 上下文。应用程序必须处理这个问题,因为如果另一个应用程序加载 OpenGL ES,操作系统可能会删除上下文。

    当用户启动另一个应用程序时,您的 OpenGL ES 应用程序处于后台 OpenGL ES 应用程序。如果该应用程序需要的内存超出了 设备,系统会静默自动终止您的应用程序 不需要它执行任何额外的工作。

    此信息来自 Apple 文档OpenGLES Programming Guide

    【讨论】:

    • 我知道应用程序有责任保存它们的状态 - 如果它们被终止。但是您是否建议 Calendar 正在启动一个 OpenGL ES 实例?看起来很奇怪 - 事实上,当我启动日历时,它只显示它的欢迎屏幕(因为我以前没有使用过它)。
    • 我并不是说日历应用程序使用 OpenGLES,但是 OpenGLEs 上下文被删除的原因有很多。应用程序进入后台后您传递 GL 命令的原因可能有一个。这很可能会导致您的上下文被杀死。
    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多