2013-07-15 20 views
1

我和一個朋友正在製作一個遊戲引擎,其中兩個AI正在互相攻擊。我們嘗試設置遊戲引擎線程,使得AI線程無法做任何事情,例如減慢遊戲速度或隨意破壞任何單位等。共享數據並強制線程間鎖定

我們遇到的問題是我們需要共享遊戲引擎和AI之間的數據。到目前爲止,我們使用了synchronize,但AI可以阻止變量,遊戲引擎不能再繼續。或者AI可以選擇不同步並使遊戲崩潰,這也不是我們想要的。

我們一直在研究Lock的實現,但是這似乎假設AI會在使用前檢查變量是否被鎖定,這是一個不好的AI當然無法做到的事情。

如果我們的數據被鎖定,我們想要做的就是查看可預測的時間。如果它被鎖定,我們將取消AI的資格。否則,我們繼續遊戲。同步的問題在於進程是默認的,並且遊戲引擎將等待,直到變量被解鎖並且可能掛起。

問題

如何鎖定在這樣一種方式,你可以看到,如果變量被鎖定,並強制鎖定變量/股的數據?或者有沒有解決方案不涉及鎖定?

+1

請參閱[java.util.concurrent.atomic](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html),它可能會提供足夠的功能滿足您的要求。 – hmjd

+0

看看http://www.cs。utah.edu/flux/janos/janosvm.html。我不知道該項目是否是最新的,但我認爲你可能會覺得它很有用。 –

+0

_哇,謝謝大家的所有答案,我們正在研究他們._ – Tommos

回答

2

保證這一點的唯一方法是AI在中性區域共享信息,而這兩個系統都不能控制代碼。這樣你就可以使用synchronized或Lock或者一個併發的集合,但是由於AI不能訪問持有這些信息的代碼,所以它們不會對另一個產生負面影響。我會確保鎖定不被公開,並由共享商店控制。

1

請我建議常做僅從同步/鎖定/解鎖環境 讀取/寫入共享數據。

What we would like to do is look at a predictable time if our data is locked. 

是的,你可以做到這一點。使用ReentrantLock。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

它阿比像

boolean tryLock(); // it will return true if lock available else false 

boolean tryLock(long time, TimeUnit unit) // same as above but will wait for the time 
    // you specify and and also can be interrupted. 

有喜歡ReadWriteLock中..Check哪個適合您需求的鎖的多種調味劑。

0

我不確定你確切的要求是什麼;但是,您可以讓所有與「遊戲引擎」相關的內容僅在「遊戲引擎」線程中完成。這與UI線程類似。在UI線程中,長時間運行的進程在後臺線程中完成;但是當需要更新UI時,後臺線程需要將更改提交/發佈到UI線程,然後進行更改。