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(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