当前位置: 首页 > news >正文

ps个人网站设计江苏网页设计报价

ps个人网站设计,江苏网页设计报价,开发者选项怎么设置最流畅,河南网站建设的公司前言 在 Unity3D 游戏编程中,避免运行时动态分配(Runtime Dynamic Allocation)内存是优化性能的关键,尤其是在移动设备或性能敏感的场景中。动态分配会导致垃圾回收(GC)频繁触发,引发卡顿。以下…

前言

在 Unity3D 游戏编程中,避免运行时动态分配(Runtime Dynamic Allocation)内存是优化性能的关键,尤其是在移动设备或性能敏感的场景中。动态分配会导致垃圾回收(GC)频繁触发,引发卡顿。以下是避免内存动态分配的实用方法:

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

1. 使用对象池(Object Pooling)

  • 适用场景:频繁创建/销毁的对象(如子弹、敌人、特效等)。
  • 实现方法
public class ObjectPool : MonoBehaviour {public GameObject prefab;private Queue<GameObject> pool = new Queue<GameObject>();// 初始化时预生成对象void Start() {for (int i = 0; i < 10; i++) {GameObject obj = Instantiate(prefab);obj.SetActive(false);pool.Enqueue(obj);}}// 从池中获取对象public GameObject GetObject() {if (pool.Count == 0) {GameObject obj = Instantiate(prefab);pool.Enqueue(obj);}GameObject recycled = pool.Dequeue();recycled.SetActive(true);return recycled;}// 归还对象到池中public void ReturnObject(GameObject obj) {obj.SetActive(false);pool.Enqueue(obj);}
}

2. 预初始化与缓存

  • 缓存组件引用:避免在 Update 中频繁调用 GetComponent
private Rigidbody rb;
void Awake() {rb = GetComponent<Rigidbody>(); // 提前缓存
}

预分配集合容量:为ListDictionary等预设容量。

List<int> numbers = new List<int>(100); // 预分配100容量

3. 避免装箱(Boxing)和拆箱

  • 问题:值类型(如 int)转换为引用类型(如 object)会触发装箱。
  • 解决方案
    • 使用泛型集合(如 List<int> 而非 ArrayList)。
    • 避免将值类型作为 object 参数传递。

4. 使用结构体(Struct)替代类(Class)

  • 原理:结构体是值类型,分配在栈上,无GC开销。
  • 注意:结构体应尽量小巧(<16字节),避免作为参数频繁传递。

5. 避免 LINQ 和闭包(Closure)

  • 问题:LINQ 和闭包会隐式生成临时对象。
  • 替代方案:手动编写循环。
// 避免
var enemies = FindObjectsOfType<Enemy>().Where(e => e.IsAlive);
// 推荐
foreach (var enemy in FindObjectsOfType<Enemy>()) {if (enemy.IsAlive) { /* ... */ }
}

6. 优化字符串操作

  • 避免频繁拼接:使用 StringBuilder 代替 string +=
StringBuilder sb = new StringBuilder();
sb.Append("Score: ");
sb.Append(score);
string result = sb.ToString();

减少调试日志:在发布版本中禁用 Debug.Log

7. 重用数组和缓冲区

  • 复用数组:避免频繁创建新数组。
private Vector3[] reusableArray = new Vector3[100];
void Update() {// 复用已有的数组transform.GetPositionAndRotation(reusableArray, out Quaternion rotation);
}

使用ArrayPool<T>:通过System.Buffers共享临时数组。

using System.Buffers;
byte[] buffer = ArrayPool<byte>.Shared.Rent(1024);
// 使用后归还
ArrayPool<byte>.Shared.Return(buffer);

8. 避免 Unity API 的隐式分配

  • 常见问题
    • Camera.main:内部调用 FindGameObjectWithTag,改用缓存。
    • GameObject.name 或 tag:返回新字符串,改用 CompareTag
// 错误方式
if (gameObject.tag == "Player") { ... }
// 正确方式(无分配)
if (gameObject.CompareTag("Player")) { ... }

9. 使用非分配型 API

  • 替代方法
    • Physics.SphereCastNonAlloc 代替 Physics.SphereCastAll
    • GetComponentsInChildren<T>(List<T> results) 避免返回新数组。

10. 优化协程(Coroutine)

  • 避免频繁yield return new:缓存 WaitForSeconds 等对象。
private WaitForSeconds wait = new WaitForSeconds(1f);
IEnumerator Shoot() {while (true) {Fire();yield return wait; // 复用已创建的 WaitForSeconds}
}

11. 资源加载优化

  • 预加载资源:使用 Resources.Load 或 Addressables 提前加载。
  • 避免重复加载:缓存已加载的资源(如材质、音效)。

分析工具

  • Unity Profiler:通过 CPU Usage 面板查看 GC Alloc 列。
  • Memory Profiler:分析堆内存分配来源。

总结

通过对象池、预分配、缓存、结构体替代类、避免装箱和LINQ等策略,可显著减少动态内存分配。关键是在高频逻辑(如 Update)中彻底消除分配,而非单纯减少频率。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

http://www.dtcms.com/a/431598.html

相关文章:

  • 机器视觉检测中,二值化的含义以及阈值
  • 设计发明的网站域名怎么进入网址
  • 东城网站建设公司黄骅贴吧新鲜事
  • 28.CSS 3D 玻璃形态动画效果
  • 51单片机串口中断
  • 调用链监控系统 - CAT
  • 白酒公司网站的建设阜宁网站制作费用
  • 太白 网站建设高州网站建设公司
  • 怎么搭建一个博客网站wordpress信息量几百万
  • 用 【C# + Winform + MediaPipe】 实现人脸468点识别
  • C++查缺补漏《4》_时间复杂度、空间配置器和内存池、排序总结、右值引用和移动语义、函数出参和入参、类中的deafult和delete
  • wordpress 仿百度谷歌排名优化
  • 跟我学C++中级篇—non-transient异常
  • NSIS下载安装使用教程(附安装包,非常详细)
  • 怎样下载网站模板济南seo优化外包服务公司
  • 申请手机网站网站怎么做图片动态图片不显示
  • 【导航】沁恒微 RISC-V 蓝牙 入门教程目录 【快速跳转】
  • DoFoto AI 1.270.80 | 支持AI抠图、AI消除、AI照片转漫画等功能,比美图秀秀更好用
  • dt9205a数字万用表使用说明
  • 信息系统项目的质量管理(AI地铁车辆管理)
  • 爱站seo查询做外贸网站需要什么卡
  • C语言-深度剖析数据在内存中的存储
  • AI时代,我们仍然需要真实的人吗?
  • jsp网站开发实例标题栏ck播放器整合WordPress
  • 网站设计色彩搭配做网站要求高吗
  • 一级造价工程师报考条件及科目四川seo策略
  • 网站主题类型百度统计平台
  • 青岛知名网站建设哪家好成都网站建设成都网络公司
  • wordpress生成网站模版百度app官方下载
  • 基于Napcat+Koshi的QQ群AI大模型机器人部署-幽络源