[TUTORIAL] Identificar qual a melhor qualidade gráfica baseada no Hardware
Página 1 de 1
[TUTORIAL] Identificar qual a melhor qualidade gráfica baseada no Hardware
[TUTORIAL] Identificar automaticamente qual a melhor qualidade gráfica baseada no Hardware
Podemos fazer um sistema básico e avançado de identificação de hardware, na própria unity, se voce ir em Edit>Project Settings>Quality voce verá que existem já varias Qualidade de Gráficos, provavelmente(Fastest, Fast, Simple, Good, Beautiful, Fantastic), e voce pode até mesmo personalizar e modificar os componentes da qualidade, como Shadows, Anti Aliasing, Qualidade de texturas e etc.
Na minha unity eu modifiquei os nomes delas por (Minimun, Very Low, Low, Medium, High, Ultra High) e modifiquei um pouco as configurações do Ultra High e High.
Primeiro para conseguir pegar informação dos Hardwares voce tem que utilizar o SystemInfo, ele vai ser o principal componente que vamos usar aqui para conseguir pegar informações dos hardware, o que suporta e o que nao suporta, qual a CPU, quantos Cores, Frequencia, qual a GPU, memória, modelo, Id, enfim. Primeiro vamos fazer detectar qual a CPU(e suas configurações) e GPU(e suas configurações) presente na máquina.
Pronto, com isso ao dar Start já podemos detectar as informações mais importantes da nossa CPU e GPU.
Bom, agora vem a parte mais chatinha do nosso tutorial, que é saber o que sua máquina suporta e nao suporta, baseado nisso, precisaremos criar uma array do tipo bool e colocar as coisas mais importantes que precisamos saber para funcionar os gráficos de um jogo, para cada componente que sua máquina suporta retornará true, para cada componente nao suportado retornará false, isso englobando qualidades de texturas, sombras, shader, buffer, anti anliasing, anisotropic, renderizações, cubemaps, ray traicing e etc. Para detectarmos quantas componentes da maquina retornarm true precisamos criar um foreach e uma variavel que acrescenta 1 para cada true retornado na nosso array booleana.
Deve ficar assim, a nossa variavel trueAmount irá conter o valor de quantas retornarám true na nossa array bool supports. Agora precisamos fazer com que baseado nos valores true da array defina um valor para detectar qual o gráfico melhor suportado para a máquina, tudo isso baseado em uma porcentagem de quantidades de elementos na array, que finalmente denominará qual é o gráfico mais acessível para aquela GPU e CPU.
E pronto, chegamos ao fim do nosso tutorial, o que fizemos foi criar um porcentagem para a quantidade suportada de componentes e baseada nessa porcentagem, automaticamente ao apertar Start e irá percorrer o foreach, calcular quantas retornaram um valor true, atribuir este valor a trueAmount, que faremos uma divisão e multiplicação para identificarmos qual foi a porcentagem aproximada de componentes suportados, e para conseguirmos visualizar, precisamos de um string, chamada porcentagem, aí baseada no valor gerado, podemos dividir entre 100% para cada e mudar o QualitySettings, colocando um level, para:
0 = Minimum
1 = Very Low
2 = Low
3 = Medium
4 = High
5 = Ultra High
E voce pode ver que eu criei mais algumas variaveis, que são a MSAA2x, MSAA4x, MSAA8x. Pois o unity em todas suas qualidades graficas nao colocam um Anti Aliasing, então eu fiz, que se sua máquina suportar algums desses Anti Aliasing, automaticamente irá implementalo.
Ja o sistema avançado voce pode criar um novo level Quality e criar variaveis booleanas para quando suporta for true.
Podemos fazer um sistema básico e avançado de identificação de hardware, na própria unity, se voce ir em Edit>Project Settings>Quality voce verá que existem já varias Qualidade de Gráficos, provavelmente(Fastest, Fast, Simple, Good, Beautiful, Fantastic), e voce pode até mesmo personalizar e modificar os componentes da qualidade, como Shadows, Anti Aliasing, Qualidade de texturas e etc.
Na minha unity eu modifiquei os nomes delas por (Minimun, Very Low, Low, Medium, High, Ultra High) e modifiquei um pouco as configurações do Ultra High e High.
Primeiro para conseguir pegar informação dos Hardwares voce tem que utilizar o SystemInfo, ele vai ser o principal componente que vamos usar aqui para conseguir pegar informações dos hardware, o que suporta e o que nao suporta, qual a CPU, quantos Cores, Frequencia, qual a GPU, memória, modelo, Id, enfim. Primeiro vamos fazer detectar qual a CPU(e suas configurações) e GPU(e suas configurações) presente na máquina.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
public class IdentifyHardware : MonoBehaviour
{
[Header("CPU")]
public int Core;
public int frequency;
public string type;
[Header("GPU")]
public string Name; public string Vendor;
public int Memory;
public int ID;
public string Version;
public int ShaderLevel;
public bool MultiThreaded;
void Start()
{
Core = SystemInfo.processorCount;
frequency = SystemInfo.processorFrequency;
type = SystemInfo.processorType;
ID = SystemInfo.graphicsDeviceID;
Name = SystemInfo.graphicsDeviceName;
Vendor = SystemInfo.graphicsDeviceVendor;
Version = SystemInfo.graphicsDeviceVersion;
Memory = SystemInfo.graphicsMemorySize;
MultiThreaded = SystemInfo.graphicsMultiThreaded;
ShaderLevel = SystemInfo.graphicsShaderLevel;
}
}
Pronto, com isso ao dar Start já podemos detectar as informações mais importantes da nossa CPU e GPU.
Bom, agora vem a parte mais chatinha do nosso tutorial, que é saber o que sua máquina suporta e nao suporta, baseado nisso, precisaremos criar uma array do tipo bool e colocar as coisas mais importantes que precisamos saber para funcionar os gráficos de um jogo, para cada componente que sua máquina suporta retornará true, para cada componente nao suportado retornará false, isso englobando qualidades de texturas, sombras, shader, buffer, anti anliasing, anisotropic, renderizações, cubemaps, ray traicing e etc. Para detectarmos quantas componentes da maquina retornarm true precisamos criar um foreach e uma variavel que acrescenta 1 para cada true retornado na nosso array booleana.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
public class IdentifyHardware : MonoBehaviour
{
[Header("CPU")]
public int Core;
public int frequency;
public string type;
[Header("GPU")]
public string Name; public string Vendor;
public int Memory;
public int ID;
public string Version;
public int ShaderLevel;
public bool MultiThreaded;
[Header("Supported")]
public int trueAmount;
private bool[] supports;
public string porcentagem;
public bool linear;
public bool MSAA2x;
public bool MSAA4x;
public bool MSAA8x;
void Start()
{
Core = SystemInfo.processorCount;
frequency = SystemInfo.processorFrequency;
type = SystemInfo.processorType;
ID = SystemInfo.graphicsDeviceID;
Name = SystemInfo.graphicsDeviceName;
Vendor = SystemInfo.graphicsDeviceVendor;
Version = SystemInfo.graphicsDeviceVersion;
Memory = SystemInfo.graphicsMemorySize;
MultiThreaded = SystemInfo.graphicsMultiThreaded;
ShaderLevel = SystemInfo.graphicsShaderLevel;
supports = new bool[]
{
SystemInfo.supportsShadows,
linear = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.Linear),
MSAA2x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA2x),
MSAA4x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA4x),
MSAA8x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA8x),
SystemInfo.supports2DArrayTextures,
SystemInfo.supports3DRenderTextures,
SystemInfo.supports3DTextures,
SystemInfo.supportsComputeShaders,
SystemInfo.supportsCubemapArrayTextures,
SystemInfo.supportsGeometryShaders,
SystemInfo.supportsSparseTextures,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsHardwareQuadTopology,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsMipStreaming,
SystemInfo.supportsMultisampleAutoResolve,
SystemInfo.supportsMotionVectors,
SystemInfo.supportsRayTracing,
SystemInfo.supportsSetConstantBuffer,
SystemInfo.supports32bitsIndexBuffer,
SystemInfo.supportsSeparatedRenderTargetsBlend,
SystemInfo.supportsInstancing
};
foreach(bool Supported in supports)
{
if(Supported == true) trueAmount++;
}
}
}
Deve ficar assim, a nossa variavel trueAmount irá conter o valor de quantas retornarám true na nossa array bool supports. Agora precisamos fazer com que baseado nos valores true da array defina um valor para detectar qual o gráfico melhor suportado para a máquina, tudo isso baseado em uma porcentagem de quantidades de elementos na array, que finalmente denominará qual é o gráfico mais acessível para aquela GPU e CPU.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
public class IdentifyHardware : MonoBehaviour
{
[Header("CPU")]
public int Core;
public int frequency;
public string type;
[Header("GPU")]
public string Name; public string Vendor;
public int Memory;
public int ID;
public string Version;
public int ShaderLevel;
public bool MultiThreaded;
[Header("Supported")]
public int trueAmount;
private bool[] supports;
public string porcentagem;
public bool linear;
public bool MSAA2x;
public bool MSAA4x;
public bool MSAA8x;
void Start()
{
Core = SystemInfo.processorCount;
frequency = SystemInfo.processorFrequency;
type = SystemInfo.processorType;
ID = SystemInfo.graphicsDeviceID;
Name = SystemInfo.graphicsDeviceName;
Vendor = SystemInfo.graphicsDeviceVendor;
Version = SystemInfo.graphicsDeviceVersion;
Memory = SystemInfo.graphicsMemorySize;
MultiThreaded = SystemInfo.graphicsMultiThreaded;
ShaderLevel = SystemInfo.graphicsShaderLevel;
supports = new bool[]
{
SystemInfo.supportsShadows,
linear = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.Linear),
MSAA2x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA2x),
MSAA4x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA4x),
MSAA8x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA8x),
SystemInfo.supports2DArrayTextures,
SystemInfo.supports3DRenderTextures,
SystemInfo.supports3DTextures,
SystemInfo.supportsComputeShaders,
SystemInfo.supportsCubemapArrayTextures,
SystemInfo.supportsGeometryShaders,
SystemInfo.supportsSparseTextures,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsHardwareQuadTopology,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsMipStreaming,
SystemInfo.supportsMultisampleAutoResolve,
SystemInfo.supportsMotionVectors,
SystemInfo.supportsRayTracing,
SystemInfo.supportsSetConstantBuffer,
SystemInfo.supports32bitsIndexBuffer,
SystemInfo.supportsSeparatedRenderTargetsBlend,
SystemInfo.supportsInstancing
};
foreach(bool Supported in supports)
{
if(Supported == true) trueAmount++;
}
var value = (double)trueAmount/supports.Length * 100;
value = Mathf.Round((float)value);
porcentagem = value + "%";
if(value >=0 && value <=20) QualitySettings.SetQualityLevel(0);
if(value >=21 && value <=40) QualitySettings.SetQualityLevel(1);
if(value >=41 && value <=60) QualitySettings.SetQualityLevel(2);
if(value >=61 && value <=80) QualitySettings.SetQualityLevel(3);
if(value >=71 && value <=98) QualitySettings.SetQualityLevel(4);
if(value >=99 && value <=100) QualitySettings.SetQualityLevel(5);
if(MSAA2x) QualitySettings.antiAliasing = 2;
if(MSAA4x) QualitySettings.antiAliasing = 4;
if(MSAA8x) QualitySettings.antiAliasing = 8;
}
}
E pronto, chegamos ao fim do nosso tutorial, o que fizemos foi criar um porcentagem para a quantidade suportada de componentes e baseada nessa porcentagem, automaticamente ao apertar Start e irá percorrer o foreach, calcular quantas retornaram um valor true, atribuir este valor a trueAmount, que faremos uma divisão e multiplicação para identificarmos qual foi a porcentagem aproximada de componentes suportados, e para conseguirmos visualizar, precisamos de um string, chamada porcentagem, aí baseada no valor gerado, podemos dividir entre 100% para cada e mudar o QualitySettings, colocando um level, para:
0 = Minimum
1 = Very Low
2 = Low
3 = Medium
4 = High
5 = Ultra High
E voce pode ver que eu criei mais algumas variaveis, que são a MSAA2x, MSAA4x, MSAA8x. Pois o unity em todas suas qualidades graficas nao colocam um Anti Aliasing, então eu fiz, que se sua máquina suportar algums desses Anti Aliasing, automaticamente irá implementalo.
Ja o sistema avançado voce pode criar um novo level Quality e criar variaveis booleanas para quando suporta for true.
Pokedlg- ProgramadorMaster
- PONTOS : 2336
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Tópicos semelhantes
» Qual a diferença principal entre o VisuaStudio e o MonoDevelop?E qual é o melhor?
» Como identificar qual o objeto de um determinado tag que está colidindo
» [TUTORIAL] Shader de renderização baseada em física
» Qual o melhor pra vcs ?
» Qual o melhor formato de Textura?
» Como identificar qual o objeto de um determinado tag que está colidindo
» [TUTORIAL] Shader de renderização baseada em física
» Qual o melhor pra vcs ?
» Qual o melhor formato de Textura?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos