隨着時間的推移,計時器類似乎產生了很多錯誤,所以我想知道人們爲了更準確的計時器而想出了哪些其他解決方案。 謝謝!在AS3中追蹤時間的最準確的方法是什麼?
回答
我認爲這是不可能考慮到閃存架構。基本上,在閃光燈的每個步驟分爲以下步驟:(還有比這更,他們可能有不同的名稱,但總體讓我們說,它是如何工作):
- 輸入幀事件的執行。
- 照亮並執行其他事件(操作系統,定時器,輸入,東西)。
- 繪製到屏幕上。
因此,假設您的應用程序工作在20 FPS,每50ms一幀。您的輸入框架事件需要10ms,繪製屏幕需要10ms,因此在每個框架中,您只剩下30ms的時間來捕捉定時器事件。如果你的計時器是1ms,每幀20次,它將不得不等待輸入幀和繪圖完成。非常糟糕的是,考慮到所有這些階段可能需要更多時間,並且Flash有這種趨勢會不時出現,而沒有任何明顯的原因,所以你的情況更糟。
當然,我可能是錯的地方,但我不認爲這是可能做到這一點,除非你知道一些祕密的成分。
很明顯,你可以措施延遲不夠準確,所以我想你想火的延遲後事件和你的分辨率是不夠好。
是,Timer類是有點可怕。但是你可以使用一個技巧:
如果需要2ms的(例如)的延遲,只需使用一個while循環:
var startTime:Number = getTimer();
while(getTimer() < startTime + 2) {
// whee
}
doStuff();
它應該是不言而喻的doStuff
不會執行,直到後2MS。
很明顯,不要將此用於比幀長度更長的延遲,因爲這會導致玩家變得呆滯。使用計時器關閉,然後在足夠近的時候使用這個技巧。你會得到更好的解決方案。
如果您需要觸發多個事件,則需要提前對它們進行排序。
不能完全確定,你與你的問題會和情況各不相同,但很多在Flash中與時間相關的問題,可以通過以下操作來解決:
- 一些幀添加到您的主時間軸。通常,我加兩到三秒。
- 使主時間線在本節中循環。
- 創建一個只包含沉默的真實音頻文件(真正的音頻黑色)。一秒鐘的沉默通常很好。
- 將其導入到庫中。
- 將此添加到您填充區域的主時間線中。設置循環計數,以便始終播放。 確保您設置爲同步到流。
這有效地導致Flash Player兌現主時間軸的時間(因爲它的音頻已同步到流),而不是試圖跟上每個圖形幀。
通常我這樣做是爲了確保在動畫在不同的機器同樣的速度打球,但我還用它來修復wonkiness與計時器。
我已經遇到這個前段時間在AS2,但我發現AS3是一個LO *更可靠。
我和AS2做什麼設置定時器運行100ms左右小於否則它將只有一次。然後,我會把它放在前面描述的那個getTimer()循環中,直到它達到所需的時間,然後我會讓它做任何事情。在99%的案例中,這不是一個好主意。循環使用了大量的CPU,並且如果您的事件可能會延遲超過100毫秒,具體取決於CPU負載。
總而言之,在運行AS3最簡單的計時器測試後我發現,偏移量是相當一致的,當一個小的CPU負載相當可靠下運行。
儘可能的去解釋,它更多的意見,我的隨身攜帶用來計數的累計時間漂移的邏輯問題。
作者增加了所有的差異,所以假設getTimer在1000,2002,3002處發生事件。 兩次延遲2ms,這並不意味着第二個事件是4ms延遲,它是2ms晚了,與之前的事件相比,它相距1000毫秒,所以不會遲到。所以,雖然數學是有道理的,2 + 2 = 4,我真的不明白這是如何有用的任何方式。
當我跑我的測試: VAR延遲:INT = 1000;
var myTimer:Timer = new Timer(delay, 0);
function timerHandler($evt:TimerEvent){
trace(getTimer());
}
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
myTimer.start();
trace(getTimer());
我得到這個幾秒鐘,在運行一些視頻:
15011 16011 17011 18054 19054 20054 21054 22054 23057 24054 25054 26054 27054 28011 29011 30011 31011 ... 135047 136194 <- big one here 137246 - and here 138167 - 139242 - 140173 - 141016 <- back 142018 <- normalized 143018 144018 145019 146018 147018
有趣的是,看到這種 「正常化」。它有時會一直下降54ms,然後下降到27ms,然後下降到18ms等等,並在圍繞另一個值正常化之前停留一段時間。但是這個價值不是累積的,而是非常接近基數。即。偏移量不會繼續增加。如果您爲單次使用重複創建事件,則會看到累計差異。
- 1. 在iOS中跟蹤時間的最有效/最精確的方式是什麼?
- 2. 什麼是估算C++代碼時間性能的最準確方法
- 3. AS3語法:最準確
- 4. 「DateUTC」最準確的joda時間表示是什麼?
- 5. 在AS3中編程的正確方法是什麼?
- 6. 什麼是追蹤內存泄漏的最佳方式
- 7. 什麼是確定NSDate或時間戳的時間最快的方法?
- 8. 在AS3中確定Flash上下文的最佳方法是什麼?
- 9. 什麼是C++中最好,最準確的計時器?
- 10. 是什麼既則hitTest方法之間準確的區別
- 11. 在WinForms中使用時間的最佳方法是什麼?
- 12. 在python中跟蹤索引的正確方法是什麼?
- 13. 在Django中追蹤模型更改的最佳方式是什麼?
- 14. 什麼是追蹤JavaScript執行的好方法(但跳過jQuery)?
- 15. Android - 使用此GPS追蹤器功能的正確方法是什麼?
- 16. 追蹤累計終身銷售額的最有效方法是什麼?
- 17. 在Java中將美元兌換爲美分的最準確方法是什麼
- 18. 在scala中將org.joda.time.LocalDateTime轉換爲java.time.LocalDateTime的最準確方法是什麼?
- 19. 什麼是矩陣追蹤?
- 20. 返回邏輯錯誤的最標準/最正確的方法是什麼?
- 21. 在php/mysql中跟蹤時間衝突的正確算法是什麼?
- 22. 確定Azure VM啓動時間的正確方法是什麼?
- 23. Haxe(NME)中節奏遊戲的時間節拍最準確的方法是什麼?
- 24. 什麼是檢查時間是否在一定時間內的最佳方法?
- 25. 在Linux上測試網絡代碼的最準確的方法是什麼?
- 26. Python:播放聲音樣本的時間最準確的方法
- 27. 確保DbCommand.Cancel()方法運行正常的最準確方法是?
- 28. 最準確的方法檢測非箱子碰撞? (AS3)
- 29. 當準確性很重要時,在DynamoDB中存儲時間的最佳方式是什麼?
- 30. JSON,PHP,AS3不知所措:無法追蹤正確的值
你試圖實現什麼? Timer類如何不準確**? – sberry 2011-01-11 05:54:56