1

好的,我已经阅读了有关为什么使用 NSRunLoop 而不是 NSTimer 调用来运行游戏循环并保持良好的帧速率的文章。

但是我在任何讨论中都没有看到在哪里创建 NSRunLoop。

应该把它放在 didFinishLoading 的末尾吗?

4

2 回答 2

2

调用时会自动为您生成运行循环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)确保处理所有事件。

只需按原样使用代码,这是可行的。

于 2009-05-28T16:23:56.887 回答
1

本质上,NSRunLoop 是一个

事件驱动模式

这个开源项目

https://github.com/wuyunfeng/LightWeightRunLoop

除了使用IO Multiplexing实现 NSRunLoop 之外,还有一些 Runloop-Relative Fundation API,例如在其他线程、TimerURLConnection等上执行选择器(或延迟一些时间)

于 2016-04-05T14:51:23.197 回答