好的,我已经阅读了有关为什么使用 NSRunLoop 而不是 NSTimer 调用来运行游戏循环并保持良好的帧速率的文章。
但是我在任何讨论中都没有看到在哪里创建 NSRunLoop。
应该把它放在 didFinishLoading 的末尾吗?
调用时会自动为您生成运行循环NSApplicationMain
。您可以使用以下任一方法访问运行循环:
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 模式, CFTimeInterval 秒, 布尔返回AfterSourceHandled );在特定模式下运行当前线程的 CFRunLoop 对象。
参数
模式
要运行的运行循环模式。…</p>
秒
运行运行循环的时间长度。…</p>
returnAfterSourceHandled
一个标志,指示运行循环是否应在处理一个源后退出。…</p>
这意味着CFRunLoopRunInMode
获取当前线程运行循环并处理所有等待的输入。(喜欢触摸......)。
while(… == kCFRunLoopRunHandledSource)
确保处理所有事件。
只需按原样使用代码,这是可行的。
本质上,NSRunLoop 是一个
事件驱动模式
这个开源项目
除了使用IO Multiplexing实现 NSRunLoop 之外,还有一些 Runloop-Relative Fundation API,例如在其他线程、Timer、URLConnection等上执行选择器(或延迟一些时间)