我正在寻找一个等效的cocos2d更新:(ccTime)delta函数,无需cocos2d即可使用。我需要尽可能多次执行检查。是否有像我这样的本机函数或drawRect尽可能频繁地调用?
伪代码:
timeElapsed += delta;
if (timeElapsed > beatTime)
{
timeElapsed = 0;
beat++;
for (SoundBlock* block in blocks)
{
[block play];
}
}
基本上,我想每秒多次执行这样的检查。
答案 0 :(得分:1)
您可能不希望尽快检查某些内容,因为这会导致性能问题。
如果您想要使用显示更新某些内容,可以使用CADisplayLink。你可以谷歌周围的例子,例如one。
如果您不需要将其关联到显示刷新,则可以设置NSTimer,或使用performSelector:withObject:afterDelay的变体。
如果您需要高分辨率计时器,请查看this technical note。
NSTimer和performSelector的分辨率都在50-100毫秒左右,这对于声音播放来说还不够。
我建议你使用一个单独的实时线程和mach_wait_until(),如技术说明中所述。使用技术说明中清单2 中的代码,使用BEATS_PER_SEC
每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上手动安排高分辨率音频播放的方式重新构建此问题。