我正在创建一个小行星克隆,但还有一些铃声和口哨。
截至目前,我有一个ArrayList<Asteroid>
可以屏幕上显示所有小行星。每个人都有Vector
与之关联,并扩展了我的基因GameObject
类,它处理绘图和更新以及每个游戏对象的共同点。
每当我摧毁一颗小行星时,我会创建一个新的Asteroid
对象并将其添加到ArrayList<Asteroid>
...当发生这种情况时会出现明显的延迟,因为我还会创建爆炸粒子和我认为这是GC。
我的想法是不要动态创建新对象,我可以预先创建它们的池并重新使用它们。
这是正确的想法吗?那么最有组织,最有效的方法是什么呢?
任何其他想法也会很棒。只是试图减少所有这些对象的创建,因为它肯定会导致明显的滞后。谢谢!
答案 0 :(得分:5)
创建一个对象池并重用它们是个好主意。另外我认为你可以从ArrayList
切换到Vector
,因为Vector是针对随机索引进行优化的,你在使用池时会做很多事情。
既然你说每次摧毁一颗小行星,你都会添加一颗新的小行星,似乎你使用了恒定数量的小行星。因此,您可以使用一定数量的成员创建池。
答案 1 :(得分:5)
(1)考虑使用Flyweight模式设计您的对象。它是通常用于具有重复特征的对象的图案。这里有一个java代码示例:http://en.wikipedia.org/wiki/Flyweight_pattern
(2)如果您已经知道将要使用多少个对象,那么请考虑将对象创建和其他一些初始化过程包含到加载页面中。
答案 2 :(得分:4)
通常,Java非常擅长分配新对象和执行最近创建的对象的GC,所以我不会立即假设池化会改进很多东西。你确定你没有创造任何可能导致完整GC的“垃圾”(那种长时间暂停程序的GC)吗?
您可以通过启用“详细的GC日志记录”来验证它确实是GC导致您观察到的问题(Google为此提供了几个命令行参数,使JVM能够以不同的详细程度启用它)...
答案 3 :(得分:4)
我认为你的粒子效果是减速的罪魁祸首,而不是对象的创造。
游戏开发人员通常会竭尽全力确保他们的图形速度很快,但在脚本编写方面却会造成很多性能损失。这是有充分理由的:与计算物理和绘制图形的命中相比,游戏对象的创建和存储中的性能损失在大多数情况下都是微不足道的。
尝试减少粒子数量和图形复杂性(特别是如果它们具有 透明度 ;这种影响非常快速地累积到疯狂)。