本文地址:https://blog.csdn.net/t163361/article/details/135024136
针对工作中遇到的优化问题,记录一下,给大家优化自己的项目提供一些思路。
公司产品最近正给国内某大型赛事做支撑服务暴露出不少问题。
使用环境
Unity 2021.3.0f1
cpu i7 10750H
显卡 T1000 4G
内存 16G
问题分析解决
程序集成了EasyDecal插件。最近被大量使用,暴露出不少问题。
1.当创建多个EasyDecal对象时,最后一个会无法加载
2.在某些模型上添加特别慢 2000ms以上 记录一下,下次更新
3.修改大小时,会特别慢 2000ms以上 记录一下,下次更新
优化思路
问题一
- 先确认问题
开发电脑无法触发问题,测试电脑才会触发。 - 多次尝试(2天)后,终于找到比较容易触发的方法
- 通过观察发现问题出现概率和性能有关,速度越慢的电脑越容易触发
- 同时,功能加载的部分用的是Task,其中用到了CancellationTokenSource这个类,下面是部分调用代码
tokenSource = new CancellationTokenSource();var tasktoken = tokenSource.Token;var task = Task.Run(() =>{if(tasktoken.IsCancellationRequested)return;this.meshCutter.CutMesh(this.dynamicMesh);},tasktoken);task.GetAwaiter().OnCompleted(() =>{this.Parent.AddDynamicMesh(this.dynamicMesh, false);task.Dispose();tokenSource?.Cancel();});
5.通过加log,发现下面两个处理函数调用次数不匹配
this.meshCutter.CutMesh(this.dynamicMesh);
this.Parent.AddDynamicMesh(this.dynamicMesh, false);
AddDynamicMesh对应的CutMesh没有调用,这样方向就有了。
6.仔细看代码,偶然发现tokenSource是这么定义的
static CancellationTokenSource tokenSource = new CancellationTokenSource();
7.好嘛,全局通用,那肯定当性能比较卡,多次触发加载的时候会导致
tokenSource?.Cancel();
这句代码把最后一次加载给强制关闭掉。当然如果卡的厉害应该会出现多次加载被强制关闭的情况。
8.解决就比较简单了,把定义里面的static给删掉就好了
最终效果
问题解决。这个问题主要的时间花费在问题重现上了。当能有很容易的触发方式后,通过加log的方式,很快就确认问题了。