好的,我已经阅读了有关为什么使用NSRunLoop而不是NSTimer调用来运行游戏循环并保持良好的帧速率更好的想法的文章。
但我在任何讨论中都没有看到的是在哪里创建NSRunLoop。
这应该放在didFinishLoading的末尾吗?
答案 0 :(得分:2)
当您调用NSApplicationMain
时,会自动为您生成运行循环。您可以使用以下任一方法访问runloop:
runloop = [NSRunLoop mainRunLoop];
runloop = [NSRunLoop currentRunLoop];
您链接的论坛中的代码如下所示:
// Yield to system calls (touches, etc.) for one ms.
while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, NO) == kCFRunLoopRunHandledSource);
CFRunLoopRunInMode
上的文档:
SInt32 CFRunLoopRunInMode ( CFStringRef mode, CFTimeInterval seconds, Boolean returnAfterSourceHandled );运行当前线程的CFRunLoop 对象在特定模式下。
参数
模式
运行循环模式 跑。 ...
秒
运行时间的长短 运行循环。 ...
returnAfterSourceHandled
旗帜 指示运行循环是否应该 处理完一个源后退出。 ...
这意味着CFRunLoopRunInMode
获取当前线程的运行循环并处理所有等待的输入。 (喜欢接触......)。
while(… == kCFRunLoopRunHandledSource)
确保处理所有事件。
只需按原样使用代码即可。
答案 1 :(得分:1)
基本上,NSRunLoop是
<强> 事件驱动模式 强>
此OpenSource项目
除了使用 IO Multiplexing 实施NSRunLoop之外,还有一些Runloop-Relative Fundation API,例如 执行选择器 (或延迟一些)在其他线程上, 计时器 , URLConnection 等