Java Libgdx如何存储用于冲突检测的数据

Java Libgdx如何存储用于冲突检测的数据,java,garbage-collection,libgdx,collision-detection,Java,Garbage Collection,Libgdx,Collision Detection,我正在使用libgdx scene2d开发一个游戏。我的所有对象都是Actor的子类(我们称它们为GameObject),因此它们都有位置和大小,但都在单独的字段中(float x;float y;float height;float width;)。对于碰撞检测,我使用了一些自制的方法,但也使用了一些Intersector的方法。Intersector方法需要位置和大小的Vector2参数。因此,我必须在Actors字段中创建Vector2对象,每个渲染周期。这不利于垃圾收集。我唯一能避免这种

我正在使用libgdx scene2d开发一个游戏。我的所有对象都是
Actor
的子类(我们称它们为
GameObject
),因此它们都有位置和大小,但都在单独的字段中(
float x;float y;float height;float width;)
。对于碰撞检测,我使用了一些自制的方法,但也使用了一些
Intersector
的方法。
Intersector
方法需要位置和大小的
Vector2
参数。因此,我必须在
Actor
s字段中创建
Vector2
对象,每个渲染周期。这不利于垃圾收集。我唯一能避免这种情况的方法是在我的
GameObject
s中设置
Vector2位置和
Vector2大小。但是我有多余的数据,我需要重写getter和setter方法来更新
Vector2
Actor
s数据(绘图所需)。还有其他更好的方法吗?冗余数据比垃圾问题好吗?或者我应该复制
Intersector
s方法并编辑它们以使用
float x
float y
而不是
Vector2

冗余数据非常糟糕,因为冗余会导致时间和内存开销以及编程错误。修改第三方方法是不好的,因为我的意思是在它升级时重新进行。不知何故,所有的解决方案都是不好的,但你应该始终衡量它。垃圾真的是个问题吗

如果可能的话,我会在任何地方使用
Vector2
。您还可以回收现有向量并用数据填充它。这消除了垃圾问题,但仍然存在复制成本


最终的解决方案取决于你。我怀疑是否有人能肯定地说什么对你最好。

LibGdx有一个很好的
Pools
类,那么你为什么不使用它呢

以下是一个例子:

Vector2 position = Pools.obtain(Vector2.class);
// use your Vector2 for something
Pools.free(position);
您将不会有任何冗余数据,它仍然会比在每个帧上不必要地分配对象更快、更可预测


我的2美分:

我同意过早优化是个坏主意,但根据我的经验,在开发某些类型的应用程序时,采用某些设计方法是有益的

具体来说,我认为在制作游戏时避免在每个帧上分配不必要的对象是一个好主意,特别是对于Android等平台


这些分配现在可能不是问题,或者对于某些特定的设备来说,但它可能会回来咬你的屁股,你可能会被迫对代码做一些非琐碎的更改-这发生在我身上。

实际上垃圾没有问题,因为我刚开始游戏,唯一需要检测碰撞的物体是墙壁、我的玩家和子弹(大概20颗左右)。但后来当我添加敌人,也可以射击,我认为这可能是一个问题。修改第三方更像是创建我自己的“MyIntersector”类,使用我需要的方法,使用libgdx Intersector算法。冗余数据会存在于每一个物体中,所以对于那些射出子弹的敌人来说,冗余数据可能会很多。在这种情况下,你有什么建议?在看到任何真正的问题之前,我不会做任何丑陋的解决方案。大量垃圾是有害的,但垃圾只在短时间内存在是非常有害的(GC成本随着幸存对象的增加而增加)。交叉点问题对于自制的解决方案来说足够简单,所以很好。我现在排除的唯一解决方案是冗余——它太难看了。好吧,所以我现在不修改我的冲突检测,如果我遇到gc问题,我将编写自己的冲突检测。我已经看到,唯一真正需要矢量2的方法是圆线段相交,我只用于玩家对墙和敌人对墙。所以我认为垃圾不会太多。至少我希望:P非常感谢+1@斯普林芭:很好。还有别忘了子弹。@Springrbua:甚至在你知道会有子弹之前还是游戏D类似的想法也发生在我身上,但请确保池几乎总是事与愿违的(真正巨大的对象,难以计算的东西,以及数据库连接分离)。感谢这个解决方案!我想我会继续我现在的代码。但如果我遇到问题,我会试试这个。这不会是一个很大的代码更改,因为我只需要将“newvector2()”替换为“Pools.get(Vector2.class)”。谢谢!考虑到
Vector2
只需要16个字节,而
Pools.get(Vector2.class)
需要为类找到正确的列表(散列)并获取对象,这对我来说似乎非常昂贵。但我几乎没有安卓系统的经验,所以它不能说太多;无论如何,即使它比分配和收集花费更多的时间,它仍然有意义,因为它可以避免GC暂停。