0

我正在寻找一个等效的 cocos2d update:(ccTime)delta 函数,以便在没有 cocos2d 的情况下使用。我需要每秒尽可能多地执行检查。有没有我可以使用的尽可能频繁调用的像这样或 drawRect 的本机函数?

伪代码:

timeElapsed += delta;
if (timeElapsed > beatTime)
{
    timeElapsed = 0;
    beat++;
    for (SoundBlock* block in blocks)
    {
        [block play];
    }
}

本质上,我想每秒尽可能多地执行这样的检查。

4

1 回答 1

1

您可能不想尽快检查某些内容,因为这会导致性能问题。

如果您想要显示更新的内容,您可以使用CADisplayLink。你可以用谷歌搜索例子,比如这个

如果您不需要将其链接到显示刷新,您可以设置一个NSTimer,或使用performSelector:withObject:afterDelay的变体。

如果您需要高分辨率计时器,请查看此技术说明

NSTimer 和 performSelector 的分辨率都在 50-100 毫秒左右,这对于声音播放来说是不够的。

我建议您使用带有 mach_wait_until() 的单独实时线程,如技术说明中所述。使用技术说明中清单 2BEATS_PER_SEC中的代码,每次using都会播放声音play_beat(),如下所示:

void play_beat_thread(int argc, const char * argv[])
{
    mach_timebase_info(&timebase_info);
    uint64_t time_to_wait = nanos_to_abs(10ULL * BEATS_PER_SEC);
    uint64_t next = mach_absolute_time();
    while (true)
    {
        next = next + time_to_wait;
        mach_wait_until(next);
        play_beat();
    }
}

如果您想获得有关高分辨率音频计时的更多建议,我建议您按照“如何在 iOS/OS X 上手动安排高分辨率音频播放”这一行重新构建这个问题。

于 2013-07-14T23:11:18.953 回答