【发布时间】:2012-07-09 00:49:28
【问题描述】:
我想知道管理大型 3d 数组的最佳方法是:
x = 1000 y = 1000 z = 100
=> 100000000 个对象
每个单元格都是一个包含一定数量数据的对象。
即使所有数据都折叠起来,简单的方法也非常冗长(我第一次尝试了对象数组的数组)
class Test
def initialize
@name = "Test"
end
end
qtt = 1000*1000*100
Array.new(qtt).each { |e| e = Test.new }
我在某处读到数据库对于这种情况可能是一件好事。
您对此有何看法?
我想做什么?
这个“矩阵”代表一个世界。每个元素都是一个 1mx1mx2m 的方块,可能是不同的类型(水、泥、石头……)有些方块也可能是空的。
但是用户应该能够在任何地方移除方块并改变周围的一切(如果他们后面有水,它会从洞中流过。
事实上,我想做的不是 Minecraft 成为 DwarfFortress 的一个非常小的克隆 (http://www.bay12games.com/dwarves/)
其他有趣的事情
在我的模型中,地面处于 10 级。这意味着在大多数情况下 [0,10] 是空旷的天空。 在这些图层上只能存在丘陵和部分山脉。
地下基本上是未知的,没有挖掘。所以我们不应该为未使用的块添加实例。
我们应该从一开始就在模型中添加:宝石、金子、水,它们可以存储而无需存储相邻的石头/情绪/土块。
游戏开始时,80%的立方体不需要加载到内存中。
每次我们挖掘我们都会创建新的块:我们挖掘的空块和周围的块。
我们应该索引的唯一内容是:
- 地下河流
- 地下湖泊
- 熔岩河流
【问题讨论】:
-
一切都取决于你想做什么!如果你想要一些持久性,所以是的 DB 可能是一件好事,如果你只是想做简单的工作,也许你应该把它们包装在一个班级。这个问题有点太模糊了。
-
你能把你的问题说得更清楚吗?如果您真的需要大量数据的高性能,您需要一种不同的语言。
-
我添加了更多关于我想做的事情的信息。
-
你能举例说明你的方法在做什么吗?如果方法在整个矩阵上运行并触及每个单元格,那么这确实是一个大问题。但是,如果您的单元格中有许多相似的对象,并且您不需要每个对象都有自己的特定字符,那么您可以使用一些设计模式来加快速度。无论如何,对于这种大小的数据,幼稚的方法是行不通的。
-
例如,每滴水都会腐蚀相邻的立方体,因此受影响的立方体的硬度会降低。这将在水块的所有边界上计算(不是经常,但它会)。最常见的事件是角色挖掘并移除立方体时:我必须控制周围的所有立方体。这更像是一种“级联效应”,肯定不会一次对所有董事会产生影响。