PGRData/Script/matrix/xmanager/XHardwareManager.lua

540 lines
16 KiB
Lua
Raw Permalink Normal View History

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")
2024-09-01 20:49:41 +00:00
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