[基本上,我正在编写将3D空间转换为JavaScript数组,以便可以将其导出到JSON文件的地图编辑器。
每张地图都有一个2D平面作为地面层(用户必须指定X和Y尺寸),然后要增加高度,用户可以按照X&Y网格在该2D平面顶部放置块(类似于Minecraft)。
我的想法是为每个Z层都有一个数组,并在其中填充有关哪些块放置在此处的信息。因为必须指定地图的X和Y大小,所以一个简单的数组就可以解决问题,因为要读取地图,您只需为每个Z层数组循环并用其内容填充地图即可,该内容就是另一个数组。创建由地面图层的X和Y大小定义的行。
我知道您可以填充layer[165] = grassBlock
之类的数组在声明它们之后,这将使索引165之前的所有内容为空,从而节省空间。但是以JSON格式,该数组在到达此索引之前不会有164个零或空吗?
这甚至是存储3D空间的最有效方法吗?我正在尝试最小化地图大小并尽可能加快加载时间。
如果您只有块/空,那么一位就足够了,您可以将单个Javascript类型的数组用于矩阵。
假设矩阵的大小为X
,Y
和Z
,则从坐标(x, y, z)
到数组索引的转换可以是:
index = (x*Y + y)*Z + z;
然后,映射可以存储为单个Uint8Array
对象,该对象初始化为长度(X*Y*Z + 7) >> 3
(每个字节将为您提供8位,但您需要舍入)。
要读/写一点,您最终可以使用
bit = (matrix[index >> 3] >> (index & 7)) & 1; // Read element
matrix[index >> 3] |= 1 << (index & 7); // Set element to 1
matrix[index >> 3] &= ~(1 << (index & 7)); // Clear element to 0
如果相反,您需要存储一个逻辑ID,并且不超过256个不同的值(包括“空”),则每个元素一个字节就足够了。 index
计算如上,但您可以将其用作X*Y*Z
大小,然后使用matrix[index]
简单地读取/写入元素。
不幸的是,JSON没有提供一种有效地发送/接收任意字节(非文本)的类型,您需要转换为base64编码并从中加载。