【发布时间】:2017-08-30 02:07:48
【问题描述】:
我在 Java 中实现了一个有点类似于 this one 的游戏,目前发现我的粒子数量达到了大约 80k 的上限。我的游戏板是对“粒子”对象的引用的二维数组,每个对象都必须每帧更新。不同种类的“粒子”具有不同的行为,可能会根据风或相邻粒子等环境条件移动或改变其状态。
一些可能生效的“规则”:
- 如果熔岩类型的粒子与水类型的粒子相邻,则两者都会消失,并且熔岩会被黑曜石取代
- 如果气体粒子与熔岩、火、余烬等粒子相邻,则会点燃,并产生火焰和烟雾
- 如果足够数量的尘埃颗粒相互堆叠,那些处于较低水平的尘埃颗粒,就像在压力下一样,可能会变成沉积岩
我四处搜索,但找不到任何似乎特别适合加快任务速度的算法或数据结构。似乎某种记忆可能有用?四叉树在这里有用吗?我已经看到它们在与Hashlife 算法有些相似的康威生命游戏中使用。或者,是不是我不能做太多的事情来提高速度?
【问题讨论】:
-
这听起来像是 GPU 非常适合解决的问题。我对 GPU 编程知之甚少,但mikeinnes.github.io/2017/08/24/cudanative.html 建议它可能比你想象的更容易进入。
-
Hashlife 依赖于计算的局部性,而您几乎没有告诉我们您的规则。
-
@maaartinus 我添加了一些关于规则的信息
-
@paleto-fuera-de-madrid 我猜,hashlife 与前两个规则兼容(仅限本地交互),但与最后一个规则不兼容。我也对使用 memoization 持怀疑态度,因为可能性要大得多。如果您可以在CR 上发布整个代码,您可以在那里获得相当多的帮助(如果您愿意,请给我留言)。即使是微小的改进也可以为您带来不错的速度因素。
-
@maaartinus 好的。我会去做的。我该如何“给你留个便条”?
标签: java algorithm optimization data-structures cellular-automata