c# - 二维程序世界生成的动态多维数组

标签 c# performance mobile procedural-generation

目标
我正在构建一个世界生成器,当相机接近已经存在的边缘时,它应该能够动态地将“体素”添加到某种列表中。每个体素都应尽可能高效地访问,因为每帧都需要访问数千个列表中的几百个体素。

我考虑过的方法
1) 我的第一个想法是体素的多维数组,它的索引是体素的 x 和 y 坐标: Voxels[,] voxels = new Voxel[128,128];

优点:假设我知道我的体素坐标,这应该非常快:Voxel myVoxel = voxels[x, y];

缺点:我要么必须限制世界大小,要么每次我想生成新地形时都必须完全重新创建数组...

2) 为了解决这个问题,我想我可以将 x 和 y 值存储在一个字符串中,并将它们用作字典中的键。 Dictionary<string, Voxel> voxels = new Dictionary<string, Voxel>(); Voxel myVoxel = voxels[x + "," + y];
然后添加到列表中就像调用 .Add(); 一样简单。方法。

问题
1) 从数组中提取数据的效率与字典有何不同。在我看来,数组会快很多,因为我假设字典必须遍历每个键来检查相等性(如果我错了请原谅我的无知)

2) 如果一个数组真的那么可以更快地从中提取,那么每秒将多次销毁和重新创建一个包含数十万个项目的数组(取决于 block 大小)值得吗?

请注意,目标平台是手机,并非生成的每个体素都将存储在 ram 中,因此列表永远不会变得危险地大。仍然需要进行测试以确定具体尺寸,但概念就在那里......

提前致谢

最佳答案

对于您的问题,


1) 如果知道元素在数组中的索引,则数组最快(O(1) 时间)。例如,如果您使用的是世界位置,则可以使用每个体素的世界位置坐标的底部作为它们在 3D 数组中的索引。基本上,当您从 3D 数组生成世界时,使用索引作为世界位置,然后您将能够在恒定时间内使用 Math.floor(worldPosition) 在您的 3D 中找到它们的索引数组 - 这是最快的。

当您在不知道索引的情况下搜索未排序的数据结构时,字典比数组更快。参见 here对于一张图片(未排序列表的字典查找是 O(1),而数组查找是 O(n))。


2) 您可能需要使用多线程才能使其正常运行。例如,您可以使用不同的线程为 3D 数组的每个四分之一生成数据,然后将这些线程与主线程连接起来以生成对象。只要在将线程加入主线程后生成对象并且仅使用其他线程生成 3D 数组(如果您使用的是 Unity,则您不能在其他线程中使用任何 Unity 库函数)。


此外,如果您使用的是 Unity,我强烈建议您查看 Sebastian Lague 关于地形生成的视频以获得其他最佳实践 https://www.youtube.com/watch?v=wbpMiKiSKm8&list=PLFt_AvWsXl0eBW2EiBtl_sxmDtSgZBxB3

关于c# - 二维程序世界生成的动态多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55127947/

相关文章:

c# - Restsharp:反序列化具有比某些类更少/更多字段的 json 对象

SQL Server 选择查询锁定插入。为什么?

Java 逐行方法/函数分析 - 分析器和/或 Eclipse 插件

php - 如何让 Mysql 查询(多连接)更快更高效

html - 为什么打开一个宽度为480px的网站会有空白?

android - 修改 Android 上另一个应用的通知

c# - 是否可以在多个级别上传递委托(delegate)?

c# - Elasticsearch.net v. 2.3+ 库 (c#) 中多字段映射的替代方案?

c# - 在 Asp.net Core 中使用 Ajax 验证表单

java - 如何保护移动应用程序的 API REST? (如果嗅探请求为您提供 "key")