Error[8]: Undefined offset: 2, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用“Timer”我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号音符的快速琶音来说是不可接受的.特别是第32条. 我已经读过’CADisplayLink’比’Timer’更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我用Timer实现了. 潜入CoreA 我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用“Timer”我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号音符的快速琶音来说是不可接受的.特别是第32条.

我已经读过’CAdisplaylink’比’Timer’更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我用Timer实现了.

潜入CoreAudio是实现我想要的唯一途径吗?还有其他方法可以实现更精确的计时吗?

解决方法 我在iPhone 7上测试了Timer和dispatchSourceTimer(又名GCD计时器)的1000个数据点,间隔为0.05秒.我期待GCD计时器明显更准确(假设它有一个专用队列),但我发现它们是可比较的,我的各种试验的标准偏差范围从0.2-0.8毫秒,最大偏差平均值约为2 -8毫秒.

当按照Technical Note TN2169: High Precision Timers in iOS / OS X中的概述尝试mach_wait_until时,我实现的计时器大约是我用Timer或GCD计时器获得的计数器的4倍.

话虽如此,我并不完全相信mach_wait_until是最好的方法,因为确定thread_policy_set的具体策略值似乎记录不清.但是下面的代码反映了我在测试中使用的值,使用了从How to set realtime thread in Swift?和TN2169改编的代码:

var timebaseInfo = mach_timebase_info_data_t()func configureThread() {    mach_timebase_info(&timebaseInfo)    let clock2abs = Double(timebaseInfo.denom) / Double(timebaseInfo.numer) * Double(NSEC_PER_SEC)    let period      = UInt32(0.00 * clock2abs)    let computation = UInt32(0.03 * clock2abs) // 30 ms of work    let constraint  = UInt32(0.05 * clock2abs)    let THREAD_TIME_CONSTRAINT_POliCY_COUNT = mach_msg_type_number_t(MemoryLayout<thread_time_constraint_policy>.size / MemoryLayout<integer_t>.size)    var policy = thread_time_constraint_policy()    var ret: Int32    let thread: thread_port_t = pthread_mach_thread_np(pthread_self())    policy.period = period    policy.computation = computation    policy.constraint = constraint    policy.preemptible = 0    ret = withUnsafeMutablePointer(to: &policy) {        
private func nanosToAbs(_ nanos: UInt64) -> UInt64 {    return nanos * UInt64(timebaseInfo.denom) / UInt64(timebaseInfo.numer)}private func startMachTimer() {    Thread.detachNewThread {        autoreleasepool {            self.configureThread()            var when = mach_absolute_time()            for _ in 0 ..< maxCount {                when += self.nanosToAbs(UInt64(0.05 * Double(NSEC_PER_SEC)))                mach_wait_until(when)                // do something            }        }    }}
.withMemoryRebound(to: integer_t.self,capacity: Int(THREAD_TIME_CONSTRAINT_POliCY_COUNT)) { thread_policy_set(thread,UInt32(THREAD_TIME_CONSTRAINT_POliCY),[+++],THREAD_TIME_CONSTRAINT_POliCY_COUNT) } } if ret != KERN_SUCCESS { mach_error("thread_policy_set:",ret) exit(1) }}

然后我可以这样做:

[+++]

注意,你可能想知道什么时候还没有通过(如果你的处理无法在规定的时间内完成,你想确保你的计时器没有积压),但希望这说明了这个想法.

无论如何,使用mach_wait_until,我获得了比定时器或GCD定时器更高的保真度,代价是cpu /功耗,如What are the do’s and dont’s of code running with high precision timers?所述

我很欣赏你对这一最后一点的怀疑,但我怀疑潜入CoreAudio并看看它是否可以提供更强大的解决方案是明智的.

总结

以上是内存溢出为你收集整理的ios – 如何在Swift中实现非常精确的计时?全部内容,希望文章能够帮你解决ios – 如何在Swift中实现非常精确的计时?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 3, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用“Timer”我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号音符的快速琶音来说是不可接受的.特别是第32条. 我已经读过’CADisplayLink’比’Timer’更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我用Timer实现了. 潜入CoreA 我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用“Timer”我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号音符的快速琶音来说是不可接受的.特别是第32条.

我已经读过’CAdisplaylink’比’Timer’更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我用Timer实现了.

潜入CoreAudio是实现我想要的唯一途径吗?还有其他方法可以实现更精确的计时吗?

解决方法 我在iPhone 7上测试了Timer和dispatchSourceTimer(又名GCD计时器)的1000个数据点,间隔为0.05秒.我期待GCD计时器明显更准确(假设它有一个专用队列),但我发现它们是可比较的,我的各种试验的标准偏差范围从0.2-0.8毫秒,最大偏差平均值约为2 -8毫秒.

当按照Technical Note TN2169: High Precision Timers in iOS / OS X中的概述尝试mach_wait_until时,我实现的计时器大约是我用Timer或GCD计时器获得的计数器的4倍.

话虽如此,我并不完全相信mach_wait_until是最好的方法,因为确定thread_policy_set的具体策略值似乎记录不清.但是下面的代码反映了我在测试中使用的值,使用了从How to set realtime thread in Swift?和TN2169改编的代码:

var timebaseInfo = mach_timebase_info_data_t()func configureThread() {    mach_timebase_info(&timebaseInfo)    let clock2abs = Double(timebaseInfo.denom) / Double(timebaseInfo.numer) * Double(NSEC_PER_SEC)    let period      = UInt32(0.00 * clock2abs)    let computation = UInt32(0.03 * clock2abs) // 30 ms of work    let constraint  = UInt32(0.05 * clock2abs)    let THREAD_TIME_CONSTRAINT_POliCY_COUNT = mach_msg_type_number_t(MemoryLayout<thread_time_constraint_policy>.size / MemoryLayout<integer_t>.size)    var policy = thread_time_constraint_policy()    var ret: Int32    let thread: thread_port_t = pthread_mach_thread_np(pthread_self())    policy.period = period    policy.computation = computation    policy.constraint = constraint    policy.preemptible = 0    ret = withUnsafeMutablePointer(to: &policy) {        
private func nanosToAbs(_ nanos: UInt64) -> UInt64 {    return nanos * UInt64(timebaseInfo.denom) / UInt64(timebaseInfo.numer)}private func startMachTimer() {    Thread.detachNewThread {        autoreleasepool {            self.configureThread()            var when = mach_absolute_time()            for _ in 0 ..< maxCount {                when += self.nanosToAbs(UInt64(0.05 * Double(NSEC_PER_SEC)))                mach_wait_until(when)                // do something            }        }    }}
.withMemoryRebound(to: integer_t.self,capacity: Int(THREAD_TIME_CONSTRAINT_POliCY_COUNT)) { thread_policy_set(thread,UInt32(THREAD_TIME_CONSTRAINT_POliCY),,THREAD_TIME_CONSTRAINT_POliCY_COUNT) } } if ret != KERN_SUCCESS { mach_error("thread_policy_set:",ret) exit(1) }}

然后我可以这样做:

[+++]

注意,你可能想知道什么时候还没有通过(如果你的处理无法在规定的时间内完成,你想确保你的计时器没有积压),但希望这说明了这个想法.

无论如何,使用mach_wait_until,我获得了比定时器或GCD定时器更高的保真度,代价是cpu /功耗,如What are the do’s and dont’s of code running with high precision timers?所述

我很欣赏你对这一最后一点的怀疑,但我怀疑潜入CoreAudio并看看它是否可以提供更强大的解决方案是明智的.

总结

以上是内存溢出为你收集整理的ios – 如何在Swift中实现非常精确的计时?全部内容,希望文章能够帮你解决ios – 如何在Swift中实现非常精确的计时?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
ios – 如何在Swift中实现非常精确的计时?_app_内存溢出

ios – 如何在Swift中实现非常精确的计时?

ios – 如何在Swift中实现非常精确的计时?,第1张

概述我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用“Timer”我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号音符的快速琶音来说是不可接受的.特别是第32条. 我已经读过’CADisplayLink’比’Timer’更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我用Timer实现了. 潜入CoreA 我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用“Timer”我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号音符的快速琶音来说是不可接受的.特别是第32条.

我已经读过’CAdisplaylink’比’Timer’更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我用Timer实现了.

潜入CoreAudio是实现我想要的唯一途径吗?还有其他方法可以实现更精确的计时吗?

解决方法 我在iPhone 7上测试了Timer和dispatchSourceTimer(又名GCD计时器)的1000个数据点,间隔为0.05秒.我期待GCD计时器明显更准确(假设它有一个专用队列),但我发现它们是可比较的,我的各种试验的标准偏差范围从0.2-0.8毫秒,最大偏差平均值约为2 -8毫秒.

当按照Technical Note TN2169: High Precision Timers in iOS / OS X中的概述尝试mach_wait_until时,我实现的计时器大约是我用Timer或GCD计时器获得的计数器的4倍.

话虽如此,我并不完全相信mach_wait_until是最好的方法,因为确定thread_policy_set的具体策略值似乎记录不清.但是下面的代码反映了我在测试中使用的值,使用了从How to set realtime thread in Swift?和TN2169改编的代码:

var timebaseInfo = mach_timebase_info_data_t()func configureThread() {    mach_timebase_info(&timebaseInfo)    let clock2abs = Double(timebaseInfo.denom) / Double(timebaseInfo.numer) * Double(NSEC_PER_SEC)    let period      = UInt32(0.00 * clock2abs)    let computation = UInt32(0.03 * clock2abs) // 30 ms of work    let constraint  = UInt32(0.05 * clock2abs)    let THREAD_TIME_CONSTRAINT_POliCY_COUNT = mach_msg_type_number_t(MemoryLayout<thread_time_constraint_policy>.size / MemoryLayout<integer_t>.size)    var policy = thread_time_constraint_policy()    var ret: Int32    let thread: thread_port_t = pthread_mach_thread_np(pthread_self())    policy.period = period    policy.computation = computation    policy.constraint = constraint    policy.preemptible = 0    ret = withUnsafeMutablePointer(to: &policy) {        
private func nanosToAbs(_ nanos: UInt64) -> UInt64 {    return nanos * UInt64(timebaseInfo.denom) / UInt64(timebaseInfo.numer)}private func startMachTimer() {    Thread.detachNewThread {        autoreleasepool {            self.configureThread()            var when = mach_absolute_time()            for _ in 0 ..< maxCount {                when += self.nanosToAbs(UInt64(0.05 * Double(NSEC_PER_SEC)))                mach_wait_until(when)                // do something            }        }    }}
.withMemoryRebound(to: integer_t.self,capacity: Int(THREAD_TIME_CONSTRAINT_POliCY_COUNT)) { thread_policy_set(thread,UInt32(THREAD_TIME_CONSTRAINT_POliCY),,THREAD_TIME_CONSTRAINT_POliCY_COUNT) } } if ret != KERN_SUCCESS { mach_error("thread_policy_set:",ret) exit(1) }}

然后我可以这样做:

注意,你可能想知道什么时候还没有通过(如果你的处理无法在规定的时间内完成,你想确保你的计时器没有积压),但希望这说明了这个想法.

无论如何,使用mach_wait_until,我获得了比定时器或GCD定时器更高的保真度,代价是cpu /功耗,如What are the do’s and dont’s of code running with high precision timers?所述

我很欣赏你对这一最后一点的怀疑,但我怀疑潜入CoreAudio并看看它是否可以提供更强大的解决方案是明智的.

总结

以上是内存溢出为你收集整理的ios – 如何在Swift中实现非常精确的计时?全部内容,希望文章能够帮你解决ios – 如何在Swift中实现非常精确的计时?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1114945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存