Unity C#如何将Vector3列表存储为字符串 实现按索引取值降低内存占用
字符串存储方案实现代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; public class Container : MonoBehaviour { public string Bchanged; // 补充返回值类型为Vector3 public Vector3 GetBlockbyIndex(int index) { // 按换行分割字符串,过滤空内容 var numStrs = Bchanged.Split('\n').Where(s => !string.IsNullOrEmpty(s)).ToList(); // 每组对应3个数值,计算当前索引的起始位置 int startIndex = index * 3; // 转浮点数后构造Vector3 float x = float.Parse(numStrs[startIndex]); float y = float.Parse(numStrs[startIndex + 1]); float z = float.Parse(numStrs[startIndex + 2]); return new Vector3(x, y, z); } void AddBlock(Vector3 block) { // 三个分量分别追加换行符后拼到存储字符串末尾 Bchanged += $"{block.x}\n{block.y}\n{block.z}\n"; } }
- 注意:如果数据量较大,每次查询都拆分字符串会产生很高的性能开销,建议首次拆分后缓存数值数组,避免重复处理字符串。
更低内存的替代方案
你选择字符串存储的核心诉求是降低内存占用,但该方案实际会带来更高的内存开销和性能损耗:C#中字符串为UTF16编码,每个字符占2字节,加上字符串对象固定开销、拼接/拆分产生的GC垃圾,实际内存占用是直接存储数值结构的3~10倍,反而更容易引发卡顿。
推荐直接用float数组存储数据,三个元素对应一组Vector3,完全无额外开销:
public class Container : MonoBehaviour { // 预先分配足够容量,100万组Vector3仅占用12MB内存 private float[] _blockData = new float[3000000]; // 记录当前已存储的组数 private int _dataCount = 0; public Vector3 GetBlockbyIndex(int index) { int start = index * 3; return new Vector3(_blockData[start], _blockData[start+1], _blockData[start+2]); } void AddBlock(Vector3 block) { int start = _dataCount * 3; _blockData[start] = block.x; _blockData[start + 1] = block.y; _blockData[start + 2] = block.z; _dataCount++; } }
该方案读写性能是字符串方案的百倍以上,16GB内存设备可轻松承载千万级别的数据量,不会出现卡顿。
内容的提问来源于stack exchange,提问作者Sam Hedrick
相关产品推荐
相关产品推荐

