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

Unity 2D C# 大型Tilemap循环执行性能问题及优化方案

Unity 2D C# 大型Tilemap遍历性能优化方案

问题场景

  • 业务逻辑:Tilemap中瓦片需按照存储在Dictionary中的位置数据向相邻瓦片蔓延
  • 性能瓶颈:单次瓦片检查耗时极短,但全量遍历调用对应函数时CPU占用过高,引发运行卡顿
  • 当前临时方案:每次循环迭代结束后短暂等待,实现逻辑不合理,存在优化需求

可行优化方案

本方案参考Michael Urvan与akaBase的技术建议实现,通过分块(Chunk)分批处理的思路大幅降低单帧CPU占用,有效解决卡顿问题。

核心实现逻辑

  • 定时重置bool执行标记,触发遍历流程
  • Update生命周期中仅在标记为true时执行遍历,每次仅处理固定大小的瓦片分块
  • 记录当前遍历索引,供下一次Update调用接续执行
  • 全部分块遍历完成后重置标记与索引,等待下一轮触发

简化实现代码

{
    [SerializeField] private Tilemap tilemap;
    [SerializeField] private List<TileType> tileTypes;
    [SerializeField] private List<TileType> growthTileTypes;
    private Dictionary<Vector3Int, TileData> tileDataByPosition;
    private List<TileData> spreadingTileDatas;
    private Dictionary<TileBase, TileType> tileTypeByTile;
    private bool spreading;
    private spreadIndex = 0;
    private int chunkSize = 10;
    private void Awake()
    {
        // 初始化逻辑写在这里
        InvokeRepeating("ResetSpreading", 10, 10);
    }
    private void Update()
    {
        if (spreading == true)
        {
            Spread();
        }
    }
    private void Spread()
    {
        for (
            int index = spreadIndex;
            index < spreadingTileDatas.Count && index < spreadIndex + chunkSize;
            index++
        )
        {
           // 瓦片蔓延逻辑写在这里
        }
        spreadIndex += chunkSize;
        if (spreadIndex >= spreadingTileDatas.Count)
        {
            spreadIndex = 0;
            spreading = false;
        }
    }
}

内容的提问来源于stack exchange,提问作者Lucas Venturini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:05