Unity根據(jù)設(shè)備性能自動修改質(zhì)量設(shè)置Quality

有些項目需要根據(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
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上一篇中我們討論了GearVR設(shè)備的特點還有創(chuàng)建高效的GearVR游戲的方法。這一篇,我將聚焦于調(diào)試在這些設(shè)備上性...
    浪尖兒閱讀 1,539評論 0 2
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,831評論 28 54
  • 信任包括信任自己和信任他人 很多時候,很多事情,失敗、遺憾、錯過,源于不自信,不信任他人 覺得自己做不成,別人做不...
    吳氵晃閱讀 6,361評論 4 8
  • 步驟:發(fā)微博01-導(dǎo)航欄內(nèi)容 -> 發(fā)微博02-自定義TextView -> 發(fā)微博03-完善TextView和...
    dibadalu閱讀 3,396評論 1 3
  • 回這一趟老家,心里多了兩個疙瘩。第一是堂姐現(xiàn)在談了一個有婦之夫,在她的語言中感覺,她不打算跟他有太長遠(yuǎn)的計劃,這讓...
    安九閱讀 3,647評論 2 4

友情鏈接更多精彩內(nèi)容