XHardwareManager = XHardwareManager or {} local XQualityManager = CS.XQualityManager.Instance local XRenderQuality = { Lowest = 0, Low = 1, Middle = 2, High = 3, Highest = 4 } --ios默认高档配置,其他需要指定的在这里写 local IOS_TABLE = { ["iPad11,1"] = XRenderQuality.Highest, ["iPad11,2"] = XRenderQuality.Highest, ["iPad11,3"] = XRenderQuality.Highest, ["iPad11,4"] = XRenderQuality.Highest, ["iPad8,1"] = XRenderQuality.Highest, ["iPad8,2"] = XRenderQuality.Highest, ["iPad8,3"] = XRenderQuality.Highest, ["iPad8,4"] = XRenderQuality.Highest, ["iPad8,5"] = XRenderQuality.Highest, ["iPad8,6"] = XRenderQuality.Highest, ["iPad8,7"] = XRenderQuality.Highest, ["iPad8,8"] = XRenderQuality.Highest, ["iPad7,1"] = XRenderQuality.Highest, ["iPad7,2"] = XRenderQuality.Highest, ["iPad7,3"] = XRenderQuality.Highest, ["iPad7,4"] = XRenderQuality.Highest, ["iPad7,5"] = XRenderQuality.Middle, ["iPad7,6"] = XRenderQuality.Middle, ["iPad7,7"] = XRenderQuality.Highest, ["iPad6,11"] = XRenderQuality.Middle, ["iPad6,12"] = XRenderQuality.Middle, ["iPad6,1"] = XRenderQuality.Highest, ["iPad6,2"] = XRenderQuality.Highest, ["iPad6,3"] = XRenderQuality.Middle, ["iPad6,4"] = XRenderQuality.Middle, ["iPad6,5"] = XRenderQuality.Highest, ["iPad6,6"] = XRenderQuality.Highest, ["iPad6,7"] = XRenderQuality.Highest, ["iPad5,1"] = XRenderQuality.Middle, ["iPad5,2"] = XRenderQuality.Middle, ["iPad5,3"] = XRenderQuality.Middle, ["iPad5,4"] = XRenderQuality.Middle, ["iPad5,5"] = XRenderQuality.Middle, ["iPad4,1"] = XRenderQuality.Highest, ["iPad4,2"] = XRenderQuality.Highest, ["iPad4,3"] = XRenderQuality.Highest, ["iPad4,7"] = XRenderQuality.Highest, ["iPad4,8"] = XRenderQuality.Highest, ["iPad4,9"] = XRenderQuality.Highest, ["iPad3,1"] = XRenderQuality.Highest, ["iPad3,2"] = XRenderQuality.Highest, ["iPad3,3"] = XRenderQuality.Highest, ["iPad3,4"] = XRenderQuality.Highest, ["iPad3,5"] = XRenderQuality.Highest, ["iPad3,6"] = XRenderQuality.Highest, ["iPhone1,1"] = XRenderQuality.Low, ["iPhone1,2"] = XRenderQuality.Low, ["iPhone2,1"] = XRenderQuality.Low, ["iPhone3,1"] = XRenderQuality.Low, ["iPhone3,2"] = XRenderQuality.Low, ["iPhone3,3"] = XRenderQuality.Low, ["iPhone4,1"] = XRenderQuality.Low, ["iPhone5,1"] = XRenderQuality.Low, ["iPhone5,2"] = XRenderQuality.Low, ["iPhone5,3"] = XRenderQuality.Low, ["iPhone5,4"] = XRenderQuality.Low, ["iPhone6,1"] = XRenderQuality.Low, ["iPhone6,2"] = XRenderQuality.Low, ["iPhone7,2"] = XRenderQuality.Middle, ["iPhone7,1"] = XRenderQuality.Middle, --iphone 6s ["iPhone8,1"] = XRenderQuality.Middle, ["iPhone8,2"] = XRenderQuality.Middle, ["iPhone8,4"] = XRenderQuality.High, --iphone 7 ["iPhone9,1"] = XRenderQuality.High, ["iPhone9,2"] = XRenderQuality.High, ["iPhone9,3"] = XRenderQuality.High, ["iPhone9,4"] = XRenderQuality.High, --iphone 8 ["iPhone10,1"] = XRenderQuality.High, ["iPhone10,4"] = XRenderQuality.High, --iphone 8 plus ["iPhone10,2"] = XRenderQuality.High, ["iPhone10,5"] = XRenderQuality.High, --iphone x ["iPhone10,3"] = XRenderQuality.High, ["iPhone10,6"] = XRenderQuality.High, --iphone xr ["iPhone11,8"] = XRenderQuality.Highest, --iphone xs ["iPhone11,2"] = XRenderQuality.High, --iphone xs max ["iPhone11,6"] = XRenderQuality.High, --??? ["iPhone11,4"] = XRenderQuality.Highest, ["iPhone11,1"] = XRenderQuality.Highest, ["iPhone11,3"] = XRenderQuality.Highest, ["iPhone11,5"] = XRenderQuality.Highest, ["iPhone11,7"] = XRenderQuality.Highest, ["iPhone11,9"] = XRenderQuality.Highest, ["iPhone12,1"] = XRenderQuality.Highest, ["iPhone12,2"] = XRenderQuality.Highest, ["iPhone12,3"] = XRenderQuality.Highest, ["iPhone12,4"] = XRenderQuality.Highest, ["iPhone12,5"] = XRenderQuality.Highest, ["iPhone12,6"] = XRenderQuality.Highest, ["iPhone12,7"] = XRenderQuality.Highest, ["iPhone12,8"] = XRenderQuality.Highest, ["iPhone12,9"] = XRenderQuality.Highest, } function XHardwareManager.CheckIOS() local iosName = CS.UnityEngine.SystemInfo.deviceModel XLog.Debug("IOS Model name:" .. tostring(iosName)) if not iosName or iosName == "" then return XRenderQuality.High end local quality = IOS_TABLE[iosName] if not quality then return XRenderQuality.High end return quality end --设置硬件相关分辨率 function XHardwareManager.SetHardwareResolution() local model = CS.UnityEngine.SystemInfo.deviceModel if not model then XQualityManager:SetHardwareScale(1) return end if model then --iphone x 设置一个0.9分辨率进去 if model == "iPhone10,3" or model == "iPhone10,6" or model == "iPhone11,6" then XQualityManager:SetHardwareScale(0.9) return end end XQualityManager:SetHardwareScale(1) end function XHardwareManager.CheckAndroid() return XHardwareManager.CheckGpuAndroid(CS.UnityEngine.SystemInfo.graphicsDeviceName) end function XHardwareManager.CheckGpuAdreno(tokens) local seriesNum for i = 1, #tokens do seriesNum = tonumber(tokens[i]) if seriesNum then if seriesNum == 540 then --835 return XRenderQuality.High end if seriesNum == 618 then --855+ return XRenderQuality.High end if seriesNum == 616 then --710 return XRenderQuality.High end if seriesNum < 400 then return XRenderQuality.Lowest elseif seriesNum <= 509 then return XRenderQuality.Lowest elseif seriesNum < 510 then return XRenderQuality.Low elseif seriesNum < 600 then return XRenderQuality.Middle else if seriesNum >= 600 and seriesNum < 700 then if seriesNum <= 627 then --616 return XRenderQuality.Middle else if seriesNum >= 640 then --640 return XRenderQuality.Highest else --630 return XRenderQuality.High end end elseif seriesNum >= 700 and seriesNum < 800 then --700系列都是高端 return XRenderQuality.Middle else --800 if seriesNum <= 900 then if seriesNum <= 806 then --800 ~ 806 return XRenderQuality.Middle else if seriesNum >= 820 then --820以上为最高端 return XRenderQuality.Middle else --806~820 return XRenderQuality.Middle end end else --未知系列默认返回高端机 return XRenderQuality.Middle end --默认返回中端机 -- return XRenderQuality.Middle end end end end XLog.Warning("XHardwareManager.CheckGpuAdreno: Getting quality fail, unknow device.") return XRenderQuality.Middle end function XHardwareManager.CheckGpuPowerVR(tokens) -- local tag = "XHardwareManager.CheckGpuPowerVR " -- -- XLog.Debug(tag .. "Begin") for i = 1, #tokens do local token = tokens[i] if token == "sgx" then -- XLog.Debug(tag .. "sgx") return XRenderQuality.Lowest end if token == "furian" then -- XLog.Debug(tag .. "furian") return XRenderQuality.Lowest end local quality = XHardwareManager.GetQualityByPowerVRSeriesNum(token) if quality then return quality end end XLog.Warning("XHardwareManager.CheckGpuAdreno: Getting quality fail, unknow device.") return XRenderQuality.Lowest end function XHardwareManager.GetQualityByPowerVRSeriesNum(token) -- local tag = "XHardwareManager.GetQualityByPowerVRSeriesNum " -- XLog.Debug(tag .. "token = " .. token) -- Precheck local char1 = string.byte(token, 1) local gByte = string.byte('g', 1) local isGSeries = char1 == gByte if not isGSeries then -- XLog.Debug(tag .. "isGSeries = false or nil, continue") return XRenderQuality.Low end -- Getting series number local seriesNum local char2 = string.byte(token, 2) local isNumberStartAt2 = char2 >= string.byte('0', 1) and char2 <= string.byte('9', 1) if isNumberStartAt2 then seriesNum = tonumber(string.sub(token, 2)) else seriesNum = tonumber(string.sub(token, 1)) end if not seriesNum then -- XLog.Debug(tag .. "series number = nil") return XRenderQuality.Low end -- XLog.Debug(tag .. "series number = " .. seriesNum) -- Return by series number if seriesNum > 0 then if seriesNum >= 9400 then -- XLog.Debug(tag .. "seriesNum >= 9400") return XRenderQuality.Middle elseif seriesNum >= 8300 then -- XLog.Debug(tag .. "seriesNum >= 8300") return XRenderQuality.Low else -- redmi 6 GE8320 Huawei Y5 2018 GE8100 -- XLog.Debug(tag .. "else") return XRenderQuality.Lowest end end end function XHardwareManager.GetMaliSeriesNumByToken(token, flag) -- local tag = "XHardwareManager.GetMaliSeriesNumByToken" -- XLog.Debug(tag .. "token = " .. token .. ", flag = " .. tostring(flag)) local mpIndex = string.LastIndexOf(token, "mp") if mpIndex > 1 then -- XLog.Debug(tag .. "mpIndex > 1") -- 't/g' + number + mp local startIndex if flag then startIndex = 2 else startIndex = 1 end token = string.sub(token, startIndex, mpIndex - startIndex) -- XLog.Debug(tag .. "token = " .. token) else -- 't/g' + number if flag then token = string.sub(token, 2) end -- XLog.Debug(tag .. "token = " .. token) end local result = tonumber(token) -- if result then -- XLog.Debug(tag .. "tonumber(token) = " .. result) -- else -- XLog.Debug(tag .. "tonumber(token) = nil") -- end return result end function XHardwareManager.GetQualityByMaliSeriesNum(seriesNum, gFlag, tFlag) -- local tag = "XHardwareManager.GetQualityByMaliSeriesNum : " -- XLog.Debug("mali series number = " .. seriesNum) if seriesNum <= 0 then return XRenderQuality.Middle end -- G series if gFlag then -- XLog.Debug("Mali G series " .. seriesNum) if seriesNum >= 76 then -- XLog.Debug("seriesNum >= 76") return XRenderQuality.High elseif seriesNum >= 72 then -- MP value -- XLog.Debug("seriesNum >= 72") --G72 return XRenderQuality.Middle elseif seriesNum >= 71 then -- MP value return XRenderQuality.Middle elseif seriesNum >= 52 then --kirin 810 return XRenderQuality.High else -- huawei Lite G51 G71 return XRenderQuality.Middle end end -- T series Opengl ES 3.1 if tFlag then -- XLog.Debug("Mali T series " .. seriesNum) if seriesNum >= 780 then -- MTK MP NightMare -- XLog.Debug("seriesNum >= 780") return XRenderQuality.Middle else -- 720 760 return XRenderQuality.Low end end -- Other series -- XLog.Debug(tag .. "Mali other series name: " .. seriesNum) if seriesNum < 600 and seriesNum >= 200 then -- XLog.Debug("seriesNum < 600 and seriesNum >= 200") return XRenderQuality.Low else -- XLog.Debug(tag .. "else") return XRenderQuality.Middle end end function XHardwareManager.CheckGpuMali(tokens) -- local tag = "XHardwareManager.CheckGpuMali " -- XLog.Debug("check gpu mali " .. tag .. " #tokens = " .. #tokens) -- Format : arm mali 'g/t'number for i = 2, #tokens do local token = tokens[i] -- Getting flags local firstCharByte = string.byte(token, 1) local tByte = string.byte('t', 1) local gByte = string.byte('g', 1) local tFlag = firstCharByte == tByte local gFlag = firstCharByte == gByte local flag = tFlag or gFlag -- Getting series number local seriesNum = XHardwareManager.GetMaliSeriesNumByToken(token, flag) if not seriesNum then goto continue end -- XLog.Debug(tag .. "seriesNum = " .. seriesNum) -- Getting quality local quality = XHardwareManager.GetQualityByMaliSeriesNum(seriesNum, gFlag, tFlag) if quality then -- XLog.Debug(tag .. "quality = " .. quality) return quality end ::continue:: end XLog.Error("XHardwareManager.CheckGpuMali: Getting quality fail, unknow device.") return XRenderQuality.Middle end function XHardwareManager.CheckGpuTegra(tokens) -- local tag = "XHardwareManager.CheckGpuTegra " for i = 1, #tokens do local text = tokens[i] if text == "k1" then -- XLog.Debug(tag .. "text == \"k1\"") return XRenderQuality.Lowest end if text == "x1" then -- XLog.Debug(tag .. "text == \"x1\"") return XRenderQuality.Low end end -- XLog.Debug(tag .. "else") XLog.Error("XHardwareManager.CheckGpuTegra: Getting quality fail, unknow device.") return XRenderQuality.Middle end function XHardwareManager.CheckGpuAndroid(gpuName) XQualityManager.IsSimulator = false if not gpuName or gpuName == "" then XLog.Error("XHardwareManager.CheckGpuAndroid: Getting quality fail, gpuName is nil.") return XRenderQuality.Middle end -- XLog.Debug("XHardwareManager.CheckGpuAndroid : " .. gpuName) -- Pretreatment gpuName = string.lower(gpuName) local separators = { '\t', '\r', '\n', '+', '-', ':' } for i = 1, #separators do gpuName = string.gsub(gpuName, separators[i], ' ') end local tokens = string.Split(gpuName, ' ') local tokenLength = #tokens if not tokens or tokenLength == 0 then XLog.Error("XHardwareManager.CheckGpuAndroid: Split gpu name fail.") return XRenderQuality.Middle end local token1 = tokens[1] local token2 = nil if tokenLength >= 2 then token2 = tokens[2] end local cpuName = string.lower(CS.UnityEngine.SystemInfo.processorType or "") -- XLog.Debug("XHardwareManager.CheckGpuAndroid : " .. cpuName) local deviceModel = CS.UnityEngine.SystemInfo.deviceModel if deviceModel and deviceModel ~= "" then deviceModel = string.lower(deviceModel) end --检查模拟器 if string.match(gpuName, "direct3d") or string.match(gpuName, "geforce") or string.match(gpuName, "gtx") or string.match(cpuName, "intel") or string.match(cpuName, "amd") or string.match(cpuName, "intel") or string.match(gpuName, "mumu") or string.match(gpuName, "nvidia") or string.match(deviceModel, "mumu") then XLog.Debug("XHardwareManager.SetAndroidSimulator") XQualityManager.IsSimulator = true return XRenderQuality.Highest end --检查手机 if string.match(token1, "vivante") then return XRenderQuality.Middle elseif token1 == "adreno" then return XHardwareManager.CheckGpuAdreno(tokens) elseif token1 == "powervr" or token1 == "imagination" or token1 == "sgx" or token1 == "rogue" then return XHardwareManager.CheckGpuPowerVR(tokens) elseif token1 == "arm" or token1 == "mali" or (tokenLength > 1 and token2 and token2 == "mali") then return XHardwareManager.CheckGpuMali(tokens) elseif token1 == "tegra" then return XHardwareManager.CheckGpuTegra(tokens) end XLog.Error("XHardwareManager.CheckGpuAndroid: Getting quality fail, unknow device, gpu name = \"" .. gpuName .. "\"." .. " cpuName=" .. cpuName) return XRenderQuality.Middle end