You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:42:03