【发布时间】:2011-06-27 10:39:41
【问题描述】:
好的,所以在我的一个项目中,我试图改变它存储某些变量的方式,我有一个简单的对象数组。这些对象引用的类是:
class Blocks
{
public byte type = Block.Empty;
byte lastblock = Block.Zero;
}
我打算添加更多,在当前类中type是对象当前值是什么,lastblock是对象曾经是什么。
我这样创建数组:
blocks = new Blocks[width * depth * length];
for (int i = 0; i < ((width * length) * depth); i++)
{
blocks[i] = new Blocks();
}
我遇到的问题是,当我创建一个非常大的数组(对于那些不喜欢数学的人来说,512,512,512 或 134217728)时,数组会变得很大,超过 3.5 gig。
创建这个数组的旧方法有点简单,但更难扩展,它简单地创建了一个表示当前块的字节数组,并且在实际加载时似乎只使用 2 兆内存(我不要得到,因为 134217728 字节应该在 134 兆左右......对吗?)。对象引用会产生更多的内存使用,这让我感到困惑。
我做错了什么,还是应该回到原来的做法?我想要对象引用只是因为这意味着我的所有变量都在 1 个数组中,而不是在 4 个单独的数组中,这似乎似乎对系统更好。
编辑:
在尝试了几种不同的方法后,我发现改变了
class Blocks
到
struct Blocks
创造了一个不同的世界,感谢社区为将来使用提供欢迎提示,不幸的是我不想只在结构中添加两个字节并称之为完成,那是我停下来测试我的设计并缠绕的地方解决原来的问题。在向结构添加任何其他内容之后(至少在我的列表中的任何其他内容,意味着玩家对象引用或玩家名称字符串。)它会导致内存不足异常,这意味着我将无法毕竟使用这个系统。
但是知道如何做这件事在未来会很有帮助。为此,再次感谢您。
【问题讨论】:
-
如何获得内存使用次数?他们似乎是这样的。
-
Blocks 是引用类型有什么原因吗?对我来说,它似乎是一个很好的候选结构(不可变或不可变)。
-
对象引用会产生更多的内存使用,这让我感到困惑。 - 使用引用类型时会有相关的开销。这并不多,但是当您谈论数亿个对象时,它就会加起来。结构是其成员的大小。
-
我使用了 taskmanager(是的,我知道它不是有史以来最好的东西),当我运行原始代码时,程序使用量从 20 兆跃升至 ~3.6 兆(每个对象都有一些移动变量) -生病看看结构:D
-
关于您的更新:为什么每个块都需要引用玩家名称,或者更糟糕的是,嵌入在其数据结构中的玩家对象?这真是大材小用!