gpt4 book ai didi

cocoa - 正确关闭 CVDisplayLink

转载 作者:行者123 更新时间:2023-12-03 16:19:42 27 4
gpt4 key购买 nike

我正在编写一个 Cocoa OpenGL 应用程序,并使用 CVDisplayLinkthis technical note 运行我的主循环。 。它对于运行循环效果很好。

问题是,有时当我退出时,我的应用程序退出后,我的显示链接回调将在其自己的线程上调用。这会导致我的渲染代码在我调用任何 OpenGL 函数(在本例中为 glClear)时被调用并崩溃,因为我的上下文不再存在。

我的 NSView 的 dealloc 函数中有 CVDisplayLinkRelease(displayLink); ,但它似乎从未被调用,我假设是因为 ARC。有什么办法可以确保我的显示链接在我查看之前被销毁吗?

编辑:我没有注意到崩溃实际上是由我的断言触发的。每次进行 OpenGL 调用后,我都会对 glGetError 进行断言,以确保我可以及早发现错误。调用 glClear[[view openGLContext]lushBuffer]; 后,我收到错误 1286,即 GL_INVALID_FRAMEBUFFER_OPERATION

这在逻辑上是有意义的,因为我的窗口和 View 正在被释放,但这对解决问题没有帮助。我不想忽略这些错误,因为它们显然可能发生在比这更多的情况下。我仍然需要找到“正确”的方法来确保我的显示链接在我查看之前关闭。

最佳答案

当应用程序终止时,其自动释放池中的任何内容都不会被释放 - 应用程序只需退出并让操作系统清理内存。由于没有任何内容被释放,因此没有任何内容会收到 dealloc 消息。

这意味着两件事:

  • 您不应将文件、连接或其他不单独驻留在内存中的任何内容的生命周期与对象的生命周期联系起来。
  • 您应该确保在终止和释放时结束这些事物的生命周期。

有两种方法可以处理终止。我通常在单窗口应用程序中执行此操作的方式是让我的应用程序的委托(delegate)不做任何其他事情,并直接拥有我的主窗口 Controller 。另一种方法是将您自己添加为 NSApplicationWillTerminate 通知的观察者,并通过例如停止显示链接等方式对其进行响应。

如果清理的任何部分可能需要一些时间,您的应用程序的委托(delegate)应通过返回 NSTerminateLater 来响应 applicationShouldTerminate:,并且您应该向应用程序发送 replyToApplicationShouldTerminate: 当您完成所需操作时的消息。

原始问题的另一个解决方案(在您有机会关闭链接之前调用 CVDisplayLink 回调)完全相反:启用 sudden termination 。启用该功能后,您的应用程序将通过向自身发送 SIGKILL 退出(通过命令行调用 kill -9 更为人所知),这意味着您的每个线程 < em>将立即停止。

当然,如果您确实有任何需要清理的内容(锁定文件、网络连接等),那么您应该在这些内容的生命周期内禁用突然终止,并为在此期间定期终止做好准备.

关于cocoa - 正确关闭 CVDisplayLink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11251913/

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