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
相关产品推荐
相关产品推荐

