Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使计时器准确?(Flash/ActionScript 3.0)_Flash_Actionscript 3_Actionscript_Timer - Fatal编程技术网

如何使计时器准确?(Flash/ActionScript 3.0)

如何使计时器准确?(Flash/ActionScript 3.0),flash,actionscript-3,actionscript,timer,Flash,Actionscript 3,Actionscript,Timer,我使用以下方法以X次/分钟的速度发送声音(X通过bpm确定,bpm是一个NumericStepper对象) 根据这个说法,声音不是很好。我能做些什么来解决我陷入的这个问题吗 我得到的输出文件的路径:Hum延迟值不应该是 60000 / bpm.value // with BPM = 80 we have 60000/80 = 750 而不是 60 / (bpm.value * 1000) // with BPM = 80 we have 60/80000 = 0.00075 由于文件中描述了

我使用以下方法以X次/分钟的速度发送声音(X通过bpm确定,bpm是一个NumericStepper对象)

根据这个说法,声音不是很好。我能做些什么来解决我陷入的这个问题吗


我得到的输出文件的路径:

Hum延迟值不应该是

60000 / bpm.value
// with BPM = 80 we have 60000/80 = 750
而不是

60 / (bpm.value * 1000)
// with BPM = 80 we have 60/80000 = 0.00075
由于文件中描述了时间延迟值:

延迟:数字-计时器之间的延迟 事件,以毫秒为单位。延迟较低 不超过20毫秒 推荐。定时器频率为 限制为每秒60帧, 意味着延迟低于16.6秒 毫秒会导致运行时问题

我想750毫秒比0.00075毫秒更合适

尽管如此,当我测试您的SWF并将BPM设置为60时,它每秒钟听起来都没有问题,所以我猜BPM.value不是它看起来的样子


无论如何,当我在两个选项卡(或窗口)上打开您的swf和“metronomeonline”网站,并将它们设置为同一BPM时,我觉得它们听起来是同步的。

可能会对您有所帮助

问题
计时器类的两个事件之间的延迟取决于许多因素(fps、内存、播放的电影剪辑结束,即)。设置为timer类的property delay的超时值只是近似值,因此需要有一种方法来提高计时器的准确性

解决方案
我提高精度的解决方案是扩展timer类,并根据自定义属性“精确”强制计时器进行更多的循环。这样,定时器两个事件之间的延迟将设置为延迟-+精确/2。因为事件的上升取决于许多因素,所以两个事件之间的延迟是从:延迟-准确/2到flash player的下一个触发事件


您是否尝试禁用卷转换?每次调用正在调用的函数flash.media.SoundMixer时,都应该创建一个对象,并在函数外部实例化该对象,就像metroTransform一样。这里只是一个猜测,但是如果你使用的是非常低的帧速率,可以尝试提高帧速率。这里有很多问题。第一个也是最致命的一个问题是Flash有一个无法治愈的声音延迟问题,所以即使你的代码是完美的,你仍然无法保证声音完全按照提示播放@Valkie有你一半的答案,但另一半只是你永远无法真正“治愈”延迟问题的症状。你听了一段时间了吗?此外,当bpm高于130130 BTM约为460毫秒时,问题会变得最严重,因此它远高于20毫秒的限制,应该不是问题。然而,AS3中的计时器和几乎所有语言中的计时器一样,都是基于主循环的,循环的计时时间比其他语言要长(出于技术原因)。。。这就是为什么很难有一个非常高精度的计时器的原因,对于像AS3那样在其他语言之上运行的语言来说尤其如此。我认为时间事件是正常的。验证计时器事件是否正常的最好方法是,不要将显示计数器重置为5,然后将给定的BTM(比如180)设置一个相对“长”的时间(比如5分钟,因此很容易用手表计数),最后将计数器值除以总时间(以分钟为单位)。因此,您将知道它是否被触发了足够的时间(5分钟,180 BPM,应该是900次)。结果越接近预期结果,计时器事件越精确。。。如果它足够精确,这意味着问题来自于没有一直播放的声音。你在每个tic播放的声音有多长(以毫秒为单位)?当你调用下一个
metro.play()时,你的声音可能还没有结束并重置(我不记得AS3中声音是如何工作的,现在我没有任何东西要测试)。
60 / (bpm.value * 1000)
// with BPM = 80 we have 60/80000 = 0.00075