gpt4 book ai didi

iOS OpenGL ES 屏幕旋转,同时后台应用栏可见

转载 作者:可可西里 更新时间:2023-11-01 03:33:54 25 4
gpt4 key购买 nike

我的应用使用 GLKit 通过 OpenGL ES 渲染 3D 场景。

除一件事外,一切正常。当我在 iPad 中启动我的应用程序并显示后台应用程序栏(双击“主页”按钮)然后更改设备的方向时,场景更新错误(最后渲染的图像只是拉伸(stretch)以填充新矩形)。

我找到了原因。当后台应用程序栏出现时,GLKViewController's paused 自动设置为 YES(应用程序委托(delegate)接收 -applicationWillResignActive:)并且在此栏关闭之前不会进行渲染。

我在 Apple 指南 ( OpenGL ES Programming Guide for iOS / Implementing a Multitasking-aware OpenGL ES Application ) 中发现,在收到 -applicationWillResignActive: 后,应用程序应该停止 GL 渲染或将被终止。所以看起来一切正常,除了旋转后渲染不好:)

我检查了一些 OpenGL 游戏。当显示此栏时,它们也会“暂停”,但会以某种方式在设备旋转时正确更新暂停的场景。他们是如何做到这一点的?

最佳答案

tl;dr:可能你只需要设置 GLKViewcontentModeUIViewContentModeRedraw

首先,我认为您的应用程序实际上并没有进入后台,我认为它只是变得不活跃。 applicationWillResignActive之间的区别和 applicationDidEnterBackground委托(delegate)方法。假设应用程序仅处于非事件状态,请使用以下内容,以防它实际上被置于后台,然后参见下文。

苹果文档说当 applicationWillResignActive 时你应该“降低 OpenGL ES 帧率”被调用,并不是不允许 OpenGL ES 调用,这只会在应用程序进入后台后发生。

这意味着GLKitGLKView/GLKViewController在这方面可能有点过分了。要修复它,您需要确保:

  1. GLKViewcontentMode设置为 UIViewContentModeRedraw
  2. GLKViewdrawRect方法 确实绘制框架,即使应用程序处于非事件状态但框架已更改,但在应用程序处于事件状态时绘制框架(即使用 OpenGL ES 调用)背景。

但是,我的假设是 drawRect当应用程序在后台时甚至不会调用方法,因此您可能真的不必担心 glkView:drawInRect 中的 OpenGL ES 调用。委托(delegate)方法。但是,在您的情况下不会调用此函数的原因是 View 不会失效。不失效的原因有两个:

  1. GLKViewController 中的主框架循环paused 暂停使 View 定期失效属性(property)。
  2. GLKView contentMode可能是默认的“UIViewContetModeScaleToFill”

作为 GLKView drawRect方法可能甚至不看 paused属性,只需更改 contentMode可能已经足够了。


如果应用程序确实进入后台,我会提出以下解决方案。由于不允许在后台运行时使用 OpenGL ES 调用,因此解决方案非常简单:

在进入后台之前执行您需要执行的所有 OpenGL ES 调用以支持您想要的内容。

也就是说,在applicationWillResignActive执行以下操作:

  1. 暂停游戏循环(通过设置 GLKViewControllerpaused 来完成)
  2. 暂停渲染循环(通过设置 GLKViewControllerpaused 来完成)
  3. 获取当前方向状态的当前帧缓冲区
  4. 使用与旋转方向状态对应的帧缓冲区和视口(viewport)再次渲染当前游戏状态并获取该帧缓冲区

此外你还需要GLKViewcontentMode设置为 UIViewContentModeRedraw这样 drawRect方法实际上是在 View 的框架因方向更改而更改后调用的。

终于在GLKViewdrawRect方法你需要检查是否pausedYESNONO情况下正常渲染,在 YES案例采用保存在 applicationWillResignActive 中的帧缓冲区之一并使用常规 UIKit 将其绘制到 View 中电话。

我不确定这个骇人听闻的解决方案与 GLKit 集成的效果如何,您可能需要一些子类化。

关于iOS OpenGL ES 屏幕旋转,同时后台应用栏可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com