2012-03-16 48 views
0

一個簡單的平局和移動模擬使用下列內容:簡單的模擬:快進和普通計時器

時鐘計時器。間隔:200ms運動計時器。時間間隔:1ms運動常量。值:2.

每次蜱移動定時器,圖像通過加入由移動常數移動。 (即picture.X = picture.X +移動常數)

問題是快速轉發。用戶可以隨時快速進行模擬。

如何更改這三個值(時鐘計時器,運動計時器,運動常數),以便在快速轉發運行期間提高仿真速度而不犧牲完整性?

回答

2

如果用於快速轉發的整數倍數(1x,2x,3x,...)足夠多,則可以在定時器處理函數期間多次運行仿真函數。

雖然我不確定你在做什麼,但是同樣的原則適用於它所做的任何事情。

+0

時鐘計時器運行一個時鐘,反過來會評估圖片應該到達的時間。這就是爲什麼我擔心快速轉發時sim不會一樣。另外,我不能加速我的時鐘計時器,因爲它是最低的:1ms。我應該將運動常數改變爲什麼值? – helix 2012-03-16 13:44:59

+0

如果你只是多次運行模擬函數,你不需要加速定時器:而不是'picture.X + = movementConstant;'你會爲(int i = 0; i AKX 2012-03-16 13:49:05

+0

是的,我提出了一個超超簡化的版本,只是爲了提問。我會嘗試你的建議,沒有想到這一點。我希望額外的for循環不會太多,因爲sim會計算大量數據。謝謝。 編輯:它似乎工作,但時間不一致存在尤其是。對於更大的倍數。 (4x,5x ...)我會做一個深入的測試。 – helix 2012-03-16 14:51:28

1

您可以擁有與「實時」無關的「內部時間」。當系統以基礎速度運行時,這兩個同步增加(定時器的每個滴答聲 - 設置爲1 ms) - 內部時間增加1ms。
當您有2倍的加速倍數時,將2ms添加到內部時間爲每個時鐘滴答。

下一步,您必須根據內部的時間來計算位置,有可能像隱含

newposition = startposition + speed * time 
1

正如漢斯的功能,有一個「粒度」的時間和空間,然後通過跳過時間間隔來調度代理('ticks')然而,如果您需要更靈活和經過充分測試的調度,您可能需要借用ABM中的調度程序模擬軟件包,如Mason(用於Java)或Repast(Java或C++),或查看他們的開源調度程序類代碼並轉換爲其他語言。