粒子性能持续监测
粒子性能持续监测
最近受到 UWA 的启发,有一个非常不错的粒子性能持续检测的思路,这里需要使用使用 UWA 的 GOT,后续的完全自动化,需要使用 UWA 的 Pipeline
最终结果呈现如下,这里的每个间隔代表了每个特效的实际渲染耗时,可以非常直观的看到,到底哪个特效存在问题
目标 & 背景
- 测试项目完全与客户端工程隔离
- 美术资源完全复用
前两项是为了隔离美术工程和客户端工程,一般来说,美术不应该接触到项目的代码,一方面是保护项目源码,另一方面也是在保护美术自己
项目仓库划分
为了解决美术代码隔离这件事,我们将工程拆为 Art
,Client
以及 Res
三个仓库,Res
仓库会作为其他两个仓库的 submodule
共用
利用 git 已有的功能,处理起来就比较简单了,我们甚至可以在 Art
仓库额外增加一些禁止提交或者禁止改动的规则,但是在 Client
上则放开这些规则,需要额外做的仅是一些 Monobehaviour
的脚本拷贝一份,保证 meta 文件一致即可
具体实现参考
这里我们每加载一个特效,以当前特效的名字作为 Tag
统计,并渲染 150 帧,接着加载另一个特效,直到所有特效播放完毕后,自动上传报告到 GOT,实现的过程也很简单,具体可以参考如下代码
这里因为和主仓库分离了,所以部分代码不够严谨,仅供参考
namespace NAMESPACE
{
public class Init : MonoBehaviour
{
private void Awake()
{
Screen.sleepTimeout = SleepTimeout.NeverSleep;
Application.targetFrameRate = 30;
_RunAll().ForgetLog("Init");
}
private async UniTask _RunAll()
{
await YooAssetsEx.InitializeAsync(
#if UNITY_EDITOR
YooAssets.EPlayMode.EditorSimulateMode,
#else
YooAssets.EPlayMode.OfflinePlayMode,
#endif
AppConfig.channel_cdn_url,
new AddressLocationServices()
);
var svc = await YooAssetsEx.LoadAssetAsync<ShaderVariantCollection>("MyShaderVariants");
svc.WarmUp();
var infoes = YooAssets.GetAssetInfos("BuildIn");
UWAEngine.Start(mode: UWAEngine.Mode.Overview);
foreach(var info in infoes)
{
var go = await YooAssetsEx.InstantiateAsync(info.AssetPath, transform);
go.transform.position = Vector3.zero;
go.transform.rotation = Quaternion.identity;
go.transform.localScale = Vector3.one;
UWAEngine.Tag(go.name);
await UniTask.DelayFrame(150);
// 防止加载和卸载的过程统计进当前特效 tag 中
UWAEngine.Tag("Load&Release");
YooAssetsEx.ReleaseInstance(go);
}
UWAEngine.Stop();
UWAEngine.Upload(
result =>
{
if(result)
{
Application.Quit();
}
else
{
Log.Error("Upload error!");
}
},
"your account",
"your password",
"your project name",
999999
);
}
}
}
最后
按照这个思路,我们可以将很多真机 Benchmark
的内容,挨个自动化,从一些日常重复性很高的工作彻底解放出来,而且游戏开发过程中,对资源的管控是一些非常细致的,这种基于真机测试的自动化,无疑是一个特别有效且直观的武器
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果