QualitySettingsPackage/Packages/com.bywaystudios.qualitytuner/Runtime/HardwareInfo.Android.cs
2026-04-28 17:03:25 +08:00

197 lines
7.9 KiB
C#

using System;
using System.Text.RegularExpressions;
using UnityEngine;
namespace Byway.Quality
{
internal static class HardwareInfoAndroid
{
// Build.VERSION_CODES.S (Android 12)
private const int ANDROID_VERSION_CODES_S = 31;
private static int _sdkVersion;
public static void SetAndroidHardwareStats(HardwareStats stats)
{
#if UNITY_EDITOR
if (Application.isEditor)
return;
#endif
var gpuName = stats.GpuName;
stats.GpuMajorSeries = ParseGpuMajorSeries(gpuName);
(stats.GpuMinorSeries, stats.GpuSeriesNumber) = stats.GpuMajorSeries switch
{
GpuMajorSeries.Adreno => ParseAdrenoGpuSeries(gpuName),
GpuMajorSeries.Mali => ParseMaliGpuSeries(gpuName),
GpuMajorSeries.Immortalis => ParseImmortalisGpuSeries(gpuName),
GpuMajorSeries.PowerVR => ParsePowerVRGpuSeries(gpuName),
GpuMajorSeries.Xclipse => ParseXclipseGpuSeries(gpuName),
GpuMajorSeries.Maleoon => ParseMaleoonGpuSeries(gpuName),
_ => (GpuMinorSeries.Unknown, 0)
};
stats.SocName = GetSocName();
}
public static GpuMajorSeries ParseGpuMajorSeries(string gpuName)
{
// parse GPU series by StartsWith
return gpuName switch
{
{ } when gpuName.StartsWith("Adreno", StringComparison.Ordinal) => GpuMajorSeries.Adreno,
{ } when gpuName.StartsWith("Mali", StringComparison.Ordinal) => GpuMajorSeries.Mali,
{ } when gpuName.StartsWith("ARM Immortalis", StringComparison.Ordinal) => GpuMajorSeries.Immortalis,
{ } when gpuName.StartsWith("PowerVR", StringComparison.Ordinal) => GpuMajorSeries.PowerVR,
{ } when gpuName.StartsWith("Samsung Xclipse", StringComparison.Ordinal) => GpuMajorSeries.Xclipse,
{ } when gpuName.StartsWith("Maleoon", StringComparison.Ordinal) => GpuMajorSeries.Maleoon,
_ => GpuMajorSeries.Unknown
};
}
public static (GpuMinorSeries, int) ParseAdrenoGpuSeries(string gpuName)
{
// parse Adreno GPU series number by regex
// ex: Adreno (TM) xxx
var match = Regex.Match(gpuName, @"Adreno \(TM\) (\d+)");
if (match.Success)
if (int.TryParse(match.Groups[1].Value, out var number))
return (number / 100) switch
{
1 => (GpuMinorSeries.Adreno100, number),
2 => (GpuMinorSeries.Adreno200, number),
3 => (GpuMinorSeries.Adreno300, number),
4 => (GpuMinorSeries.Adreno400, number),
5 => (GpuMinorSeries.Adreno500, number),
6 => (GpuMinorSeries.Adreno600, number),
7 => (GpuMinorSeries.Adreno700, number),
8 => (GpuMinorSeries.Adreno800, number),
9 => (GpuMinorSeries.Adreno900, number),
_ => (GpuMinorSeries.Unknown, number)
};
return (GpuMinorSeries.Unknown, 0);
}
public static (GpuMinorSeries, int) ParseMaliGpuSeries(string gpuName)
{
// parse Mali GPU series number by regex
// ex: Mali-Gxx, Mali-Txxx
var match = Regex.Match(gpuName, @"Mali-([GT]?)(\d+)");
if (match.Success)
if (int.TryParse(match.Groups[2].Value, out var number))
return match.Groups[1].Value switch
{
"G" => (GpuMinorSeries.MaliG, number),
"T" => (GpuMinorSeries.MaliT, number),
"" => (GpuMinorSeries.Mali, number),
_ => (GpuMinorSeries.Unknown, number)
};
return (GpuMinorSeries.Unknown, 0);
}
public static (GpuMinorSeries, int) ParseImmortalisGpuSeries(string gpuName)
{
// parse ARM Immortalis GPU series number by regex
// ex: ARM Immortalis-G925 MP16
var match = Regex.Match(gpuName, @"Immortalis-G(\d+)");
if (match.Success)
if (int.TryParse(match.Groups[1].Value, out var number))
return (GpuMinorSeries.ImmortalisG, number);
return (GpuMinorSeries.Unknown, 0);
}
public static (GpuMinorSeries, int) ParsePowerVRGpuSeries(string gpuName)
{
// parse PowerVR GPU series number by regex
// ex: PowerVR Rogue GExxxx, PowerVR Rogue G?xxxx
var match = Regex.Match(gpuName, @"PowerVR Rogue (G[A-Z])(\d)(\d+)");
if (match.Success)
if (int.TryParse(match.Groups[2].Value + match.Groups[3].Value, out var number))
return (match.Groups[1].Value + match.Groups[2].Value) switch
{
"GX6" => (GpuMinorSeries.PowerVR6XT, number),
"GE8" => (GpuMinorSeries.PowerVR8XE, number),
"GM9" => (GpuMinorSeries.PowerVR9XM, number),
_ => (GpuMinorSeries.Unknown, number)
};
// parse PowerVR B-Series BXM series
// ex: PowerVR B-Series BXM-8-256, PowerVR B-Series BXM-4-64
match = Regex.Match(gpuName, @"BXM-(\d+)-(\d+)");
if (match.Success)
if (int.TryParse(match.Groups[1].Value, out var bxmNumber))
return (GpuMinorSeries.PowerVRBXM, bxmNumber);
// parse PowerVR D-Series DXT series
// ex: PowerVR D-Series DXT-24-1024
match = Regex.Match(gpuName, @"DXT-(\d+)-(\d+)");
if (match.Success)
if (int.TryParse(match.Groups[1].Value, out var dxtNumber))
return (GpuMinorSeries.PowerVRDXT, dxtNumber);
return (GpuMinorSeries.Unknown, 0);
}
public static (GpuMinorSeries, int) ParseXclipseGpuSeries(string gpuName)
{
// parse Samsung Xclipse GPU series number by regex
// ex: Samsung Xclipse xxx
var match = Regex.Match(gpuName, @"Samsung Xclipse (\d+)");
if (match.Success)
if (int.TryParse(match.Groups[1].Value, out var number))
return (GpuMinorSeries.Xclipse, number);
return (GpuMinorSeries.Unknown, 0);
}
public static (GpuMinorSeries, int) ParseMaleoonGpuSeries(string gpuName)
{
// parse Huawei Maleoon GPU series number by regex
// ex: Maleoon xxx
var match = Regex.Match(gpuName, @"Maleoon (\d+)");
if (match.Success)
if (int.TryParse(match.Groups[1].Value, out var number))
return (GpuMinorSeries.Maleoon, number);
return (GpuMinorSeries.Unknown, 0);
}
public static string GetSocName()
{
if (GetAndroidSdkVersion() < ANDROID_VERSION_CODES_S)
return "";
try
{
using var buildClass = new AndroidJavaClass("android.os.Build");
var socModel = buildClass.GetStatic<string>("SOC_MODEL");
return socModel;
}
catch (Exception e)
{
Debug.LogException(e);
return "";
}
}
private static int GetAndroidSdkVersion()
{
#if UNITY_EDITOR
if (Application.isEditor)
return 0;
#endif
#if UNITY_ANDROID
if (_sdkVersion != 0)
return _sdkVersion;
using var versionCls = new AndroidJavaClass("android.os.Build$VERSION");
_sdkVersion = versionCls.GetStatic<int>("SDK_INT");
return _sdkVersion;
#else
return 0;
#endif
}
}
}