背景:
我已经完成了一个游戏作为家庭作业。我们不得不做一个十六进制游戏。我决定使用2d节点矢量实现电路板,并使用2个矢量来跟踪节点邻居的x和y坐标。我用来确定胜利者的路径寻找算法类似于Dijkstra的算法。
我意识到使用2个向量的缺点是它们必须始终保持同步,但我问速度。我也意识到实现电路板的一种更快的方法是使用1d向量(我在完成程序的过程中实现了一半)。
问题:就原始速度而言,路径查找算法运行速度更快,使用2个向量来跟踪(x,y),或者如果使用对矢量实现算法运行速度会更快吗?
答案 0 :(得分:5)
选择更适合您需求的。 在软件设计的这个阶段,您不应该担心性能。 更重要的是选择最适合的数据结构。
在这样做时,性能优势可能已经在你身上了。
答案 1 :(得分:4)
aoeu说的没错:首先担心好的代表性。
其次,如果您担心游戏速度慢,请参阅个人资料。找到有问题的区域并担心这些。
那说,有点速度:
内存访问在顺序时最快。跳来跳去很糟糕。一个接一个地访问值是好的。
对的向量(更一般地说,结构的向量,VoS)或一对向量(向量的结构,SoV)是否更快的问题完全取决于您的访问模式。您是否一起访问坐标对,还是首先处理所有x然后处理所有y值?答案很可能会显示更快的数据布局。
那说,“最有可能”意味着蹲下。个人资料,个人资料,个人资料。
答案 2 :(得分:0)
我的直觉告诉我,对的矢量会更快,但你可能需要测试它。创建一个测试程序,将两百万个点插入两种格式和更快的时间。然后,以更快的速度提取存储数据的时间。
答案 3 :(得分:0)
首先,aoeu是重点。
其次,关于一般的优化:
优化的第一步是测量,否则您没有基线来比较改进。
下一步是使用某种分析器来查看你的代码在周期/内存/其他方面的用途,它可能不在你想象的地方。
当你完成这两项工作后,你就可以开始以正确的方式优化代码的正确部分。
答案 4 :(得分:0)
除了我的评论。如果你的实现在游戏进行时运行较慢(我猜它的AI部分),那么可能是因为你在每次移动后都在运行Dijkstra。随着游戏越来越大,游戏越来越大,人工智能的性能也越来越差。
建议使用disjoint-set
方法而不是Dijkstra
来确定获胜者。 disjoint-set
优于Dijkstra的优势在于它不仅使用更少的内存,而且随着游戏的进行不会变慢,因此您可以在每个玩家移动后运行它。 Disjoint-set - Wikipedia,Union-find - princeton
我意识到改变一个项目关键部分的实现是一项艰巨的任务,因为它几乎需要DO IT ALL OVER AGAIN
,但这只是一个建议,如果你担心AI的速度,那绝对值得研究。还有其他方法可以实现AI,例如minMAX tree,Alphabeta pruning(这是对minmax树的改进)
胃肠。