一個簡單的平局和移動模擬使用下列內容:簡單的模擬:快進和普通計時器
時鐘計時器。間隔:200ms。 運動計時器。時間間隔:1ms。 運動常量。值:2.
每次蜱移動定時器,圖像通過加入由移動常數移動。 (即picture.X = picture.X +移動常數)
問題是快速轉發。用戶可以隨時快速進行模擬。
如何更改這三個值(時鐘計時器,運動計時器,運動常數),以便在快速轉發運行期間提高仿真速度而不犧牲完整性?
一個簡單的平局和移動模擬使用下列內容:簡單的模擬:快進和普通計時器
時鐘計時器。間隔:200ms。 運動計時器。時間間隔:1ms。 運動常量。值:2.
每次蜱移動定時器,圖像通過加入由移動常數移動。 (即picture.X = picture.X +移動常數)
問題是快速轉發。用戶可以隨時快速進行模擬。
如何更改這三個值(時鐘計時器,運動計時器,運動常數),以便在快速轉發運行期間提高仿真速度而不犧牲完整性?
如果用於快速轉發的整數倍數(1x,2x,3x,...)足夠多,則可以在定時器處理函數期間多次運行仿真函數。
雖然我不確定你在做什麼,但是同樣的原則適用於它所做的任何事情。
您可以擁有與「實時」無關的「內部時間」。當系統以基礎速度運行時,這兩個同步增加(定時器的每個滴答聲 - 設置爲1 ms) - 內部時間增加1ms。
當您有2倍的加速倍數時,將2ms添加到內部時間爲每個時鐘滴答。
下一步,您必須根據內部的時間來計算位置,有可能像隱含
newposition = startposition + speed * time
正如漢斯的功能,有一個「粒度」的時間和空間,然後通過跳過時間間隔來調度代理('ticks')然而,如果您需要更靈活和經過充分測試的調度,您可能需要借用ABM中的調度程序模擬軟件包,如Mason(用於Java)或Repast(Java或C++),或查看他們的開源調度程序類代碼並轉換爲其他語言。
時鐘計時器運行一個時鐘,反過來會評估圖片應該到達的時間。這就是爲什麼我擔心快速轉發時sim不會一樣。另外,我不能加速我的時鐘計時器,因爲它是最低的:1ms。我應該將運動常數改變爲什麼值? – helix 2012-03-16 13:44:59
如果你只是多次運行模擬函數,你不需要加速定時器:而不是'picture.X + = movementConstant;'你會爲(int i = 0; i
AKX
2012-03-16 13:49:05
是的,我提出了一個超超簡化的版本,只是爲了提問。我會嘗試你的建議,沒有想到這一點。我希望額外的for循環不會太多,因爲sim會計算大量數據。謝謝。 編輯:它似乎工作,但時間不一致存在尤其是。對於更大的倍數。 (4x,5x ...)我會做一個深入的測試。 – helix 2012-03-16 14:51:28