粒子性能持续监测

最近受到 UWA 的启发,有一个非常不错的粒子性能持续检测的思路,这里需要使用使用 UWA 的 GOT,后续的完全自动化,需要使用 UWA 的 Pipeline

最终结果呈现如下,这里的每个间隔代表了每个特效的实际渲染耗时,可以非常直观的看到,到底哪个特效存在问题

目标 & 背景

  • 测试项目完全与客户端工程隔离
  • 美术资源完全复用

前两项是为了隔离美术工程和客户端工程,一般来说,美术不应该接触到项目的代码,一方面是保护项目源码,另一方面也是在保护美术自己

项目仓库划分

为了解决美术代码隔离这件事,我们将工程拆为 ArtClient 以及 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 的内容,挨个自动化,从一些日常重复性很高的工作彻底解放出来,而且游戏开发过程中,对资源的管控是一些非常细致的,这种基于真机测试的自动化,无疑是一个特别有效且直观的武器