我有一个3D游戏,其中对象存储在3D数组中。每个对象都是一个相对较大的struct
(几兆字节,准确地说是4,194,304字节)。
如果我将它们存储为原始值数组:gameObject objects[64][64][8]
,它们都存储在一个地方,但每个对象都被分配,无论是否使用它。
但是,如果我将数组分配为指针数组:gameObject *objects[64][64][8]
,则在需要之前不会分配未使用的对象(可能超过整个数组的一半),从而减少内存影响,但可能会更慢因为对象遍布内存
考虑性能和内存使用之间的权衡,哪种方法最好?我的担忧有效吗?
答案 0 :(得分:5)
[第二种方法]可能会更慢,因为对象遍布内存
由于每个对象的大小都是4MB,因此跨不同对象的引用位置几乎肯定不是问题。采用第二种方法。
如果你给我们的数字是正确的,一个完全填充的128x128x128 4MB对象阵列将需要大约8TB的RAM,这使得第一种方法在典型硬件上有些不可行。 ; - )
答案 1 :(得分:1)
您的更高性能选项是使用动态分配的数组,以便您可以将其大小调整为您拥有的元素的确切数量,并将它们存储为值数组。除非它很稀疏,在这种情况下我会同意你应该使用间接。
答案 2 :(得分:0)
在你的评论说你只需要500MB的RAM(你的问题现在说明了128GB的RAM ......)之后,可以比较这两个选项,因为两者都是可行的。
除非你唯一能做的就是访问每个对象的前几个字节,否则你真的不会因为动态分配它们而失去任何东西。第一种方法需要有非常不寻常的使用模式,明显要比第二种方法快。
由于您是唯一知道如何访问这些对象的人,因此您应该测量每个选项,看看第一个选项是否确实更快。