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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:57:02