一位朋友和我正在制作一个游戏引擎,其中两个AI正在互相争斗。我们试图以这样的方式设置游戏引擎线程,即AI线程不能做任何事情,比如减慢游戏速度,或随意破坏任何单元等。
我们遇到的问题是我们需要在游戏引擎和AI之间共享数据。到目前为止,我们使用synchronize
,但AI可以阻止变量,游戏引擎不再继续。或者AI可以选择不同步和崩溃游戏,这也不是我们想要的。
我们一直在研究Lock的实现,但这似乎假设AI会在使用之前检查一个变量是否被锁定,而一个糟糕的AI当然无法做到。
我们想要做的是查看我们的数据被锁定时的可预测时间。如果它被锁定,我们将取消AI的资格。否则我们继续游戏。同步的问题是,进程是默认值,游戏引擎将等到变量解锁并且可能挂起。
问题
如何锁定变量/共享数据,以便查看变量是否被锁定并强制锁定?或者是否存在不涉及锁定的解决方案?
答案 0 :(得分:2)
保证这一点的唯一方法是让AI在中立区域共享信息,而中立区域中任何一个系统都无法控制代码。这样您就可以使用synchronized或Lock或并发集合,但由于AI都无法访问保存此信息的代码,因此它们不会对彼此产生负面影响。我会确保锁定不会暴露,并由共享存储控制。
答案 1 :(得分: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
它有像Api一样的
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的锁定。请检查最适合您的要求。
答案 2 :(得分:0)
查看界面锁定及其实施:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html
另外,请阅读 java.util.concurrent.locks 包的文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-summary.html
答案 3 :(得分:0)
我不确定您的具体要求是什么;但是,您可以将与“游戏引擎”相关的所有内容仅在“游戏引擎”主题中完成。它与UI线程类似。在UI线程中,长时间运行的进程在后台线程中完成;然而,当UI需要更新时,后台线程需要将更改提交/发布到UI线程,然后自己进行更改。