目标
我正在构建一个世界生成器,该生成器应该能够将"体素"动态添加到某种列表中,因为摄像机接近已经存在的边缘。每个体素应尽可能有效地访问,因为每帧都需要访问数千个列表中的几百个体素。
我考虑过的方法
1)我的第一个想法是多维体元的数组,索引是Voxel的X和Y坐标: Voxels[,] voxels = new Voxel[128,128];
PROS:从假设我知道我的体素的坐标:Voxel myVoxel = voxels[x, y];
cons:我要么必须限制世界大小,要么我每次要生成新的地形时都必须完全重新创建数组...
2)要解决此问题,我认为我可以存储X&amp;y值在字符串中,并将其用作字典中的键。Dictionary<string, Voxel> voxels = new Dictionary<string, Voxel>();
Voxel myVoxel = voxels[x + "," + y];
然后添加到列表中就像调用.add()一样简单;方法。
问题
1)从数组中拉出的效率与字典有何不同。在我的脑海中,阵列将更快地乘坐,因为我认为词典必须遍历每个钥匙以检查平等(如果我错了,请对不起)
2)如果数组确实是 每秒多次销毁和重新创建数十万个以上的数组(取决于块的大小)值得吗?
请注意,目标平台是手机,并不是生成的每个体素都会存储在RAM中,因此该列表永远不会变得危险。仍需要进行测试以确定特定尺寸,但是该概念存在...
预先感谢
对于您的问题,
1) 如果您知道数组中元素的索引,则数组最快(O(1)时间)。例如,如果您使用世界位置,则可以将每个体素的世界位置坐标的地板用作3D阵列中的索引。基本上,当您从3D阵列生成世界时,将索引用作世界位置,然后您可以在3D中使用 math.floor(worldposition) math.floor(worldposition)在3D中找到其索引。数组 - 这是最快的。
词典在不知道索引的情况下搜索未分类的数据结构时比数组快。请参阅此处的图片(未排序列表的字典查找是O(1),并且数组查找为O(n))。
2)您可能需要使用多线程才能运行良好。例如,您可以使用不同的线程为3D数组的每个季度生成数据,然后与主线程一起将线程重新连接以生成对象。只要您加入主线程返回线程后,只要您生成对象,并且仅使用其他线程生成3D数组(如果您使用Unity,然后您不能在其他线程中使用任何统一库函数)。
此外,我强烈建议您使用Unity https://wwwww.youtube.com/watch?v=wbpmikiskm8&am8&list=plftfft_avwsxxl0ebwsxl0ebw2eibtl_ssxmdtsgzbxbxbxbxbxbxbxbxbxbb3duppppmbmdtsgzbxbxb3dud/>