游戏加载本地图片生成Texture2D后是否需要手动释放Byte[]数组
结论
byte[] fileData属于.NET托管内存,默认不需要手动释放,当没有任何引用指向该数组时,会由C#垃圾回收器(GC)自动回收对应内存。但如果要加载大量无大小限制的用户图片,建议主动做优化,避免短时间内存峰值过高、大对象堆(LOH)碎片化导致内存占用居高不下的问题。
优化建议
- 加载完Texture2D后立刻解除
fileData的引用:加上fileData = null;,通知GC该对象可回收,避免不必要的内存驻留 - 不要频繁调用GC,建议批量加载完一组图片后,再调用一次
GC.Collect()主动回收堆积的托管内存,减少卡顿影响 - 更高优先级的优化方案:避免用
File.ReadAllBytes一次性读取整个大文件,要么改用Unity内置的UnityWebRequestTexture直接从本地路径加载纹理,内部底层会处理内存分配,不会在托管堆生成大体积byte[];要么用流式分批读取文件,减少大对象分配 - 额外注意:你创建的
Texture2D属于显存资源,GC无法自动回收,不用时必须手动调用Destroy(tex)释放,否则会出现更严重的内存泄漏问题
优化后代码示例
if (File.Exists(filePath)) { byte[] fileData = File.ReadAllBytes(filePath); Texture2D tex = new Texture2D(2, 2); tex.LoadImage(fileData); // 加载完成后立即置空,解除数组引用 fileData = null; // 后续业务逻辑使用tex,不再使用tex时调用 Destroy(tex) 释放显存 }
内容的提问来源于stack exchange,提问作者Jaimin
相关产品推荐
相关产品推荐

