我喜欢制作游戏,现在第一次尝试使用移动设备。在那里,性能当然是一个比一台漂亮的PC更大的问题,我发现自己特别挣扎着武器(或者更具弹性)的类设计。 它们需要进行大量更新,大量销毁/创建,并且通常需要进行大量更新。
目前我以明显的方式做到这一点,每当我开火并在撞击时将其摧毁,我就会创造一个射弹物体。每一帧所有活动的射弹都会被检查是否与其他物体发生碰撞。 这两个步骤似乎肯定需要改进。关于如何有效处理这些对象的常用方法是什么?
总的来说,我正在寻找关于如何进行清洁和高性能课程设计的建议,到目前为止,我的谷歌搜索技巧都很薄弱。
我很乐意就此问题提出任何建议。
答案 0 :(得分:5)
当您在短时间内创建和销毁大量对象时,常见的方法是已经分配了一个实例池,您只需重新初始化即可。仅当池为空时才分配新实例。 Apple使用MapKit和表格视图等来做到这一点。研究这些接口可能对你有用。
答案 1 :(得分:3)
我不认为这是关于班级设计的。你的课很好;这是需要工作的算法。
他们需要进行大量更新,大量销毁/创建,并且通常需要进行大量更新。
不要破坏每个射弹,而应考虑将其放入死亡的射弹列表中。然后,当您需要创建一个新对象时,而不是分配一个新对象,从死区列表中拉出一个并重新初始化它。当您节省内存管理调用时,这通常会更快。
至于更新,你需要更新所有变化的东西 - 真的没办法了。
检查所有活动射弹的每一帧是否与其他物体发生碰撞。
首先 - 如果你检查每个对象,那么每对对象会被比较两次。通过仅比较更新列表中稍后出现的对象,您可以获得一半数量的检查。
#Bad
for obj1 in all_objects:
for obj2 in all_objects:
if obj1 hit obj2:
resolve_collision
#Good
for obj1 in all_objects:
for obj2 in all_objects_after_obj1:
if obj1 hit obj2:
resolve_collision
如何实现'all_objects_after_obj1'是特定于语言的,但是如果你有一个数组或其他随机访问结构来保存你的对象,你可以在obj1之后从1开始索引。
其次,点击检查本身可能很慢。当一个更简单的选项可以做时,确保你没有执行复杂的数学来检查碰撞。如果世界很大,那么空间数据库方案可以提供帮助,例如。网格图或四叉树,用于减少检查潜在碰撞对象的数量。但这通常很尴尬,并且在小游戏中获得的收益很少。
这两个步骤似乎肯定需要改进。
他们只是“看起来”?分析应用程序并查看慢速部件的位置。猜测性能并不是一个好主意,因为现代语言和硬件可能会令人惊讶。
答案 2 :(得分:0)
正如吉姆所写,你可以创建一个对象池并对其进行管理。如果您查看特定的设计模式,则Flyweight。希望它可以帮助您。