Unity游戏运行越久帧率大幅下降,点击Scene标签页精灵可恢复问题排查
问题解答
1. 帧率随运行时间大幅下降的原因
核心原因是代码存在严重的资源泄漏,叠加低效率API的持续调用,性能消耗不断累积:
- 你创建的
Texture2D对象仅将托管引用置为null,没有调用DestroyImmediate释放对应的原生显存资源。每次截图都会残留一个500*500的ARGB32纹理,显存占用持续走高,Unity渲染管线的压力随运行时间越来越大。 - 双层循环调用
GetPixel逐像素读取纹理数据,500*500分辨率下单次就有25万次低效率API调用,CPU开销随截图次数持续累积。 EncodeToPNG生成的字节数组、同步IO写文件的操作,都会持续占用托管内存、阻塞主线程,GC压力随运行时间越来越高,最终导致帧率骤降。
2. 选中Scene窗口精灵后帧率回升的原因
选中Scene视图内的对象时,Unity Editor会触发内部的孤儿资源清理逻辑+强制全量垃圾回收,直接释放了你之前泄漏的所有显存、内存资源,资源压力瞬间消失,帧率自然恢复正常水平。
3. 选中Scene精灵时触发的操作说明
选中操作确实会触发垃圾回收,同时还会执行以下核心逻辑:
- 触发Editor全局资源引用扫描,销毁所有没有被任何GameObject、材质、组件引用的孤立原生资源(你泄漏的Texture2D就是在这个阶段被清理的)
- 执行全量
GC.Collect回收所有未被引用的托管内存,包括你之前EncodeToPNG生成的未释放字节数组 - 清空渲染线程的冗余命令队列,重置渲染状态
代码修复建议
你可以按以下优先级调整代码解决问题:
- 手动销毁不再使用的Texture2D资源,在
renderResult = null;前添加一行DestroyImmediate(renderResult); - 替换逐像素读取逻辑:调用
renderResult.GetPixels()一次性读取所有像素到数组中再遍历,性能可以提升数十倍 - 将
EncodeToPNG、File.WriteAllBytes逻辑移到子线程执行,避免阻塞主线程 - 多次截图的场景下可以复用Texture2D对象,避免频繁分配释放资源
内容的提问来源于stack exchange,提问作者narnia649
相关产品推荐
相关产品推荐

