我被要求创建一个棋盘游戏的AI(这个游戏与跳棋非常相似)。到目前为止,我已经完成了一个基于位板的NegaScout基本实现,并且在5秒内可以搜索到10个半步的深度。该游戏的复杂度属于EXPTIME完全级别。换句话说,游戏中的可能移动数量几乎比整个宇宙中的原子还要多。NegaScout帮助我减少了这个数字,但我仍然需要处理大量的可能移动。
我的棋盘已经是静态的,具有执行/撤销功能。但是,对于每一个新的棋盘配置,我都需要生成所有允许的移动,这即使在我的类非常简单的情况下也需要花费大量的时间,例如:
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)}
因此,我有两个问题。
第一个问题 = 使用对象池技术(针对Move类)是否能提升我的性能?
第二个问题 = 如果第一个问题的答案是肯定的,那么你能告诉我如何实现它吗?(提供链接和小段代码示例将非常感谢!!)
回答:
使用对象池技术(针对Move类)是否能提升我的性能?
对象池技术通常被用来尝试提升性能。然而,是否真的能提升性能完全是另一回事。
如果你在一个内存充足且垃圾回收器性能良好的平台上运行,那么丢弃一个对象并创建一个新对象通常会比尝试回收利用更快。这真的取决于初始化一个对象的成本有多高。
如果你在一个性能较低或内存有限的平台上,情况可能会倾向于使用对象池技术。然而,缺点是内存池会使你的代码变得更加复杂。此外,你需要防止池成为一种内存泄漏的来源。
总的来说,我建议在你没有硬性的性能分析数据表明它可能有帮助之前,不要实施内存池技术。
参考资料: