2012-06-21 134 views
-2

我被要求创建棋盘游戏AI(游戏与棋子非常相似)。到目前为止,我完成了NegaScout的一个基本实现,并且在5秒内,我可以深入到10个半层。游戏的类别在于EXPTIME-complete。换句话说,整个宇宙中的原子几乎比原子更多。 NegaScout帮助我减少这个数字,但我仍然需要处理大量可能的移动。棋盘游戏中的对象池AI

我的板子已经是静态的do/undo功能。但是,对于每一个新板的配置我需要生成所有允许的动作和它的成本,即使我的课是简单了很多时间:

public class Move 
{ 
    private final byte startIndex; 
    private final byte endIndex; 
    private byte endPawn; 
    public Move(final byte start,final byte end){startIndex = start; endIndex = end;} 
    public final void setEndPawn(byte pawn){endPawn = pawn;} 
    //OTHER FUNCTIONS.. (ONLY FOR DISPLAY/DEBUG) 
} 

所以,我有两个问题。

FIRST =对象池(移动)会提高我的性能吗?

秒= IF(FIRST),那么你能告诉我如何实现它?(链接&小的代码示例将是很感激!!)

+0

你是否已经研究对象池?我相信你会更快得到你的答案。 – Josh

+0

第一个问题的答案是肯定的,对象池总是用来提高性能。第二个问题的答案是否定的,我们不能告诉你,即使它可以在你的项目中实现,因为你已经发布了有限的代码片段 – ControlAltDel

+0

@Josh我不熟悉对象池,所以我问这个问题有在这个问题上比我更了解的人告诉我它是否可以适用于我的问题,并且就此而言,给我提供有关该主题的很好的参考。 –

回答

1

是对象池(上移)将提高我的表现?

为了提高性能,经常使用对象池* *。是否实际上成功提升性能完全是另一回事。

如果你在一个拥有大量内存和一个体面的垃圾回收器的平台上运行,那么丢弃一个对象并创建一个新对象往往会比尝试回收更快。这真的取决于初始化对象的代价。

如果您的平台运行缓慢或内存有限,则公式可能倾向于使用对象池。然而,缺点是内存池会让你的代码更复杂。此外,你需要防范池是一种内存泄漏。

总而言之,我建议不要实施内存池,除非你有一些很有说服力的分析数据。

参考:

+0

我的电脑是i5 3.2ghz/8gig ram/ubuntu 12.04/jdk 1.6。就像我到目前为止所说的那样,我选择了10次半场,并且在每个半场中平均有20次可能的移动,所以10^20可能的移动。这就是我现在可以给你的一切。如果你想获得更多的信息,它将需要更多的时间.. –

+0

这告诉我,内存不太可能成为一个问题。等式的其余部分取决于程序的细节。我的建议仍然是“首先介绍”。 –

+0

我会照你说的去做,并且介绍我的项目,我希望得到一个绝对的答案,但是像许多事情一样,这并不容易。谢谢你指出我解决一些潜在的问题! –