项目中针对高中低端机型需做不同的适配,如低端机型不开启全屏泛光,降低阴影质量,关闭抗锯齿效果等等。首先我在项目中用到的测试机都安装上安兔兔并进行跑分,当然这个跑分不是给游戏用,而是我们先确定手机是什么级别的机型,在游戏刚启动时对机型进行一次“评分”,根据我们测试机的跑分及评分来决定评分多少为高中低机型的“分数线”。
型号 | 安兔兔 | 耗时(MS) | 次数 | 评分 | 建议 |
Mac pro | 9999999 | 19 | 3300 | 172 | 高 |
1+5 | 17万 | 19 | 2440 | 125 | 高 |
华为P10 Plus | 117171 | 20 | 1560 | 77 | 高 |
SM-G9350 | 103096 | 19 | 1560 | 78 | 高 |
魅族MX6 | 68368 | 20 | 1190 | 59 | 中 |
小米MDE40 | 63243 | 20 | 1250 | 60 | 中 |
华为MT7-TL10 | 57000 | 20 | 1130 | 56 | 中 |
OPPO A33t | 27486 | 20 | 990 | 47 | 低 |
三星Note8 | 22885 | ||||
红米Note增强 | 21084 | 21 | 940 | 43 | 低 |
红米SC | 11314 | 24 | 580 | 24 | 低 |
<70 | 中 | ||||
<50 | 低 |
根据游戏设定的高中低品质在机型上的表现来决定分数线,举个例子 OPPO A33t 品质设定为中跑起来就不流畅了,那它就是适用低品质。
机型性能评分的思路是在游戏启动时在不可见的区域在规定的时间内循环绘制一个模型,我用的是模型2000面左右的,根据绘制次数与绘制时间计算一个分数,并采样多次计算一个平均值,这个平均值就是我们要用到的性能评分。
上代码:
public class PerformanceTest : MonoBehaviour
{
public Mesh mesh;
public Material mat;
// Use this for initialization
void Start () {
}
public static Framework.QualitySetting.QualityLevelType QualityLevel = Framework.QualitySetting.QualityLevelType.Low;
[HideInInspector]
public float TestScore = 0;// 性能测试评分
private int _TotalDrawTimes = 0;
private long _TotalDrawMilliseconds = 0;
private int _State = 0;
private int _FrameCount = 0;
// Update is called once per frame
void OnPostRender()
{
switch (_State)
{
case 0:
{
UnityEngine.Debug.LogFormat("Performance test begin----------------");
_State = 1;
}
break;
case 1:
{
// set first shader pass of the material
mat.SetPass(0);
int draw_times = 0;
long milliseconds = 0;
Stopwatch sw = new Stopwatch();
for (int n = 0; n < 1000; ++n)
{
sw.Start();
for (int i = 0; i < 100; ++i)
{
Graphics.DrawMeshNow(mesh, new Vector3(0, 0, -10000), Quaternion.identity);
draw_times++;
}
sw.Stop();
milliseconds += sw.ElapsedMilliseconds;
if (milliseconds > 16)
{
break;
}
}
_TotalDrawTimes += draw_times;
_TotalDrawMilliseconds += milliseconds;
this.TestScore = 1.0f * _TotalDrawTimes / _TotalDrawMilliseconds;
_FrameCount++;
if (_FrameCount > 10)// 采样N帧数据
{
UnityEngine.Debug.LogFormat("Performance test draw mesh time(MS): {0}, draw times: {1}, score: {2}", _TotalDrawMilliseconds / 10, _TotalDrawTimes / 10, this.TestScore);
_State = 2;
}
}
break;
default:
{
// do nothing...
}
break;
}
}
}