OSX 上的 SDL + OpenGL:NSAutoreleaseNoPool()

Posted

技术标签:

【中文标题】OSX 上的 SDL + OpenGL:NSAutoreleaseNoPool()【英文标题】:SDL + OpenGL on OSX: NSAutoreleaseNoPool() 【发布时间】:2011-02-17 16:51:32 【问题描述】:

我正在使用 OpenGL 和 SDL 编写一些跨平台代码,但在 Mac OSX 上立即遇到了问题。

作为参考,这里是 GitHub 上的代码库:https://github.com/GrooveStomp/platformer

我还将看到的错误推送到同一个 repo:https://github.com/GrooveStomp/platformer/blob/master/errors.txt

现在,从我所做的阅读来看,似乎 SDL 只是简单地包装了 Mac OSX 的 Objective-C Cocoa 层,我需要声明自己的 NSAutoreleasePool 来包装我的整个程序。对吗?

我刚看到这个链接:http://sourceforge.net/apps/wordpress/paintown/2010/12/26/sdl-and-osx/,作者从源代码安装,没有任何问题。我使用 Homebrew 安装,我认为这相当于作者的步骤 #3,因为我必须在构建时指定“-framework OpenGL”。

[编辑]

所以,NSAutoreleaseNoPool() 问题应该通过以下三个步骤来解决:

    main() 应该有这个签名:int main(int argc, char * argv[]) #include 在 main() 所在的源文件中。 与 -lSDLmain 链接

结果是 SDL 将使用 NSAutoreleasePool 和我的 main 包装它自己的 main()。但是,当我这样做时,我会收到此处显示的错误:

https://github.com/GrooveStomp/platformer/blob/master/make_errors.txt

【问题讨论】:

OSX 达尔文 10.6.0,SDL 1.2.14 【参考方案1】:

当您在没有 NSAutoreleasePool 的线程上发送 Objective-C 消息时,您会收到有关内存“Just Leaking”的消息。将整个程序包装在自动释放池中的问题是它永远不会被耗尽,并且您可能会耗尽内存。而是在事件循环开始时创建池,并在每次迭代结束时排出。这样做是正确的地方应该可以修复所有“Just Leaking”错误。

由于 NSAutorelasePool 对象不是普通对象,因此它们的正确使用与几乎所有其他 Cocoa 对象都有些不同。这是一个示例:


while(1)

    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    // Do your event processing

    [pool drain];

【讨论】:

好的,事实证明,与 -lSDLmain 链接,执行 #include 并具有“int main(int argc, char *argv[])” 的签名将导致 SDL 包装该程序的主程序带有一个使用 AutoRelease 池的 Objective-C 主程序。但是,我现在看到了很棒的新问题!我会更新我的帖子。 您的回答是正确的。问题是:我在 XCode 中使用了一些过时的技术来设置 SDL 项目,所以这对我来说不是“自动”发生的。

以上是关于OSX 上的 SDL + OpenGL:NSAutoreleaseNoPool()的主要内容,如果未能解决你的问题,请参考以下文章

当 OSX 不再支持 OpenGL 时,SDL 是不是仍会正式支持 OSX?

当动态图形设备切换处于活动状态时,OS X 上的 SDL/OpenGL 出现无数警告

在 Mac osx 下将 OpenGL 链接到 Qt Creator

使用 SDL2 指定 OpenGL 版本

OSX 上的 glDrawElements 具有高 CPU 使用率

OSX OpenGL 深度模板组合