有些項目需要根據(jù)設(shè)備性能自動修改Quality的設(shè)置,如何判斷設(shè)備性能已經(jīng)在上一篇中講過了。這一篇把判斷設(shè)備性能和設(shè)置質(zhì)量放到一起去,形成靜態(tài)類工具。
調(diào)用方式如下:
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
Debug.Log(DevicePerformanceUtil.GetDevicePerformanceLevel());
//根據(jù)設(shè)備配置自動設(shè)置質(zhì)量
DevicePerformanceUtil.ModifySettingsBasedOnPerformance();
//手動設(shè)置質(zhì)量
//DevicePerformanceUtil.SetQualitySettings(QualityLevel.Low);
}
}
工具腳本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 硬件設(shè)備性能適配工具
/// </summary>
public static class DevicePerformanceUtil
{
/// <summary>
/// 獲取設(shè)備性能評級
/// </summary>
/// <returns>性能評級</returns>
public static DevicePerformanceLevel GetDevicePerformanceLevel()
{
if (SystemInfo.graphicsDeviceVendorID == 32902)
{
//集顯
return DevicePerformanceLevel.Low;
}
else //NVIDIA系列顯卡(N卡)和AMD系列顯卡
{
//根據(jù)目前硬件配置三個平臺設(shè)置了不一樣的評判標(biāo)準(zhǔn)(僅個人意見)
//CPU核心數(shù)
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
if (SystemInfo.processorCount <= 2)
#elif UNITY_STANDALONE_OSX || UNITY_IPHONE
if (SystemInfo.processorCount < 2)
#elif UNITY_ANDROID
if (SystemInfo.processorCount <= 4)
#endif
{
//CPU核心數(shù)<=2判定為低端
return DevicePerformanceLevel.Low;
}
else
{
//顯存
int graphicsMemorySize = SystemInfo.graphicsMemorySize;
//內(nèi)存
int systemMemorySize = SystemInfo.systemMemorySize;
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
if (graphicsMemorySize >= 4000 && systemMemorySize >= 8000)
return DevicePerformanceLevel.High;
else if (graphicsMemorySize >= 2000 && systemMemorySize >= 4000)
return DevicePerformanceLevel.Mid;
else
return DevicePerformanceLevel.Low;
#elif UNITY_STANDALONE_OSX || UNITY_IPHONE
if (graphicsMemorySize >= 4000 && systemMemorySize >= 8000)
return DevicePerformanceLevel.High;
else if (graphicsMemorySize >= 2000 && systemMemorySize >= 4000)
return DevicePerformanceLevel.Mid;
else
return DevicePerformanceLevel.Low;
#elif UNITY_ANDROID
if (graphicsMemorySize >= 6000 && systemMemorySize >= 8000)
return DevicePerformanceLevel.High;
else if (graphicsMemorySize >= 2000 && systemMemorySize >= 4000)
return DevicePerformanceLevel.Mid;
else
return DevicePerformanceLevel.Low;
#endif
}
}
}
/// <summary>
/// 根據(jù)手機(jī)性能修改項目設(shè)置
/// </summary>
/// <param name="lowQuality">QualitySettings中對應(yīng)Low的等級</param>
/// <param name="midQuality">QualitySettings中對應(yīng)Mid的等級</param>
/// <param name="highQuality">QualitySettings中對應(yīng)High的等級</param>
public static void ModifySettingsBasedOnPerformance(int lowQuality, int midQuality, int highQuality)
{
DevicePerformanceLevel level = GetDevicePerformanceLevel();
switch (level)
{
case DevicePerformanceLevel.Low:
QualitySettings.SetQualityLevel(lowQuality, true);
break;
case DevicePerformanceLevel.Mid:
QualitySettings.SetQualityLevel(midQuality, true);
break;
case DevicePerformanceLevel.High:
QualitySettings.SetQualityLevel(highQuality, true);
break;
}
}
/// <summary>
/// 根據(jù)機(jī)型配置自動設(shè)置質(zhì)量
/// </summary>
public static void ModifySettingsBasedOnPerformance()
{
DevicePerformanceLevel level = GetDevicePerformanceLevel();
switch (level)
{
case DevicePerformanceLevel.Low:
SetQualitySettings(QualityLevel.Low);
break;
case DevicePerformanceLevel.Mid:
SetQualitySettings(QualityLevel.Mid);
break;
case DevicePerformanceLevel.High:
SetQualitySettings(QualityLevel.High);
break;
}
}
/// <summary>
/// 根據(jù)自身需要調(diào)整各級別需要修改的設(shè)置,可根據(jù)需求修改低中高三種方案某一項具體設(shè)置
/// </summary>
/// <param name="qualityLevel">質(zhì)量等級</param>
public static void SetQualitySettings(QualityLevel qualityLevel)
{
switch (qualityLevel)
{
case QualityLevel.Low:
//前向渲染使用的像素?zé)舻淖畲髷?shù)量,建議最少為1
QualitySettings.pixelLightCount = 2;
//你可以設(shè)置使用最大分辨率的紋理或者部分紋理(低分辨率紋理的處理開銷低)。選項有 0_完整分辨率,1_1/2分辨率,2_1/4分辨率,3_1/8分辨率
QualitySettings.masterTextureLimit = 1;
//設(shè)置抗鋸齒級別。選項有?? 0_不開啟抗鋸齒,2_2倍,4_4倍和8_8倍采樣。
QualitySettings.antiAliasing = 0;
//是否使用粒子軟融合
QualitySettings.softParticles = false;
//啟用實時反射探針,此設(shè)置需要用的時候再打開
QualitySettings.realtimeReflectionProbes = false;
//如果啟用,公告牌將面向攝像機(jī)位置而不是攝像機(jī)方向。似乎與地形系統(tǒng)有關(guān),此處沒啥必要打開
QualitySettings.billboardsFaceCameraPosition = false;
//設(shè)置軟硬陰影是否打開
QualitySettings.shadows = ShadowQuality.Disable;
//設(shè)置垂直同步方案,VSyncs數(shù)值需要在每幀之間傳遞,使用0為不等待垂直同步。值必須是0,1或2。
QualitySettings.vSyncCount = 0;
break;
case QualityLevel.Mid:
QualitySettings.pixelLightCount = 4;
QualitySettings.antiAliasing = 2;
QualitySettings.softParticles = false;
QualitySettings.realtimeReflectionProbes = true;
QualitySettings.billboardsFaceCameraPosition = true;
QualitySettings.shadows = ShadowQuality.HardOnly;
QualitySettings.vSyncCount = 2;
break;
case QualityLevel.High:
QualitySettings.pixelLightCount = 4;
QualitySettings.antiAliasing = 8;
QualitySettings.softParticles = true;
QualitySettings.realtimeReflectionProbes = true;
QualitySettings.billboardsFaceCameraPosition = true;
QualitySettings.shadows = ShadowQuality.All;
QualitySettings.vSyncCount = 2;
break;
}
}
}
public enum DevicePerformanceLevel
{
Low,
Mid,
High
}
public enum QualityLevel
{
Low,
Mid,
High
}