1

我和一个朋友正在制作一个游戏引擎,其中两个 AI 正在互相争斗。我们正在尝试以这样一种方式设置游戏引擎线程,即 AI 线程无法执行诸如减慢游戏速度或随意摧毁任何单位等操作。

我们遇到的问题是我们需要在游戏引擎和 AI 之间共享数据。直到现在我们使用synchronize,但是 AI 可以阻止变量并且游戏引擎无法继续进行。或者 AI 可以选择不同步并导致游戏崩溃,这也不是我们想要的。

我们一直在研究 Lock 的实现,但这似乎假设 AI 在使用之前会检查变量是否被锁定,而糟糕的 AI 当然无法做到这一点。

如果我们的数据被锁定,我们想做的是查看一个可预测的时间。如果它被锁定,我们将取消 AI 的资格。否则我们继续游戏。同步的问题是,继续是默认的,游戏引擎将等到变量被解锁并且它可能挂起。

问题

如何锁定变量/共享数据,以便您可以查看变量是否已锁定并强制锁定?还是有不涉及锁定的解决方案?

4

4 回答 4

2

保证这一点的唯一方法是让 AI 在一个中立区域共享信息,在该区域中两个系统都无法控制代码。通过这种方式,您可以使用同步或锁定或并发集合,但由于两个 AI 都无法访问包含此信息的代码,因此它们不会对彼此产生负面影响。我会确保锁定不会暴露并且由共享存储控制。

于 2013-07-15T11:07:22.460 回答
1

请我建议始终仅从同步/锁定/解锁上下文中读取/写入共享数据。

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

是的,你可以这样做。使用可重入锁。 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 ..检查最适合您要求的锁。

于 2013-07-15T11:08:48.803 回答
0

查看Lock接口及其实现: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

于 2013-07-15T11:08:22.133 回答
0

我不确定您的确切要求是什么;但是,您可以让与“游戏引擎”相关的所有内容仅在“游戏引擎”线程中完成。它是一个类似于 UI 线程的概念。在 UI 线程中,长时间运行的进程在后台线程中完成;但是,当需要更新 UI 时,后台线程需要将更改提交/发布到 UI 线程,然后由 UI 线程自行进行更改。

于 2013-07-15T11:39:45.133 回答