当你正在开发一个Unity游戏时,理解如何管理和优化游戏的图形质量是至关重要的。Unity提供了一个强大的类,叫做QualitySettings,它允许你在运行时获取和修改游戏的图形质量设置。本文将对QualitySettings类进行深入解析,并提供每个属性的详细用法和示例。
QualitySettings概述
QualitySettings类提供了一种获取和修改Unity的图形质量设置的方法。这些设置包括抗锯齿,阴影,纹理,分辨率等方面。你可以用这个类动态地调整这些设置,来根据设备的性能提供最佳的游戏体验。
- 图形质量等级相关:
names
:一个包含所有预设图形质量等级名称的字符串数组
GetQualityLevel()
:返回当前选择的图形质量等级的索引。
SetQualityLevel(int index, bool applyExpensiveChanges = true)
:用于设置当前的图形质量等级
IncreaseLevel(bool applyExpensiveChanges = true)
:提高一级当前的图形质量等级
DecreaseLevel(bool applyExpensiveChanges = true)
:降低一级当前的图形质量等级
GetRenderPipelineAssetAt()
:获取指定质量级别的RenderPipelineAsset
names:一个包含所有预设图形质量等级名称的字符串数组。你可以通过这个数组获取每个等级的名称
string[] qualityLevelNames = QualitySettings.names;
foreach (string name in qualityLevelNames)
{
Debug.Log(name);
}
GetQualityLevel():这个方法返回当前选择的图形质量等级的索引
int currentQualityLevel = QualitySettings.GetQualityLevel();
Debug.Log("当前图像质量等级: " + currentQualityLevel);
SetQualityLevel(int index, bool applyExpensiveChanges = true):这个方法用于设置当前的图形质量等级。你可以用它来根据设备的性能动态地改变图形质量等级
QualitySettings.SetQualityLevel(3, true);
IncreaseLevel(bool applyExpensiveChanges = true) 和 DecreaseLevel(bool applyExpensiveChanges = true):这两个方法用于提高或降低一级当前的图形质量等级。它们可以用来创建一个让玩家在游戏中动态调整图形质量的设置菜单
QualitySettings.IncreaseLevel(true);
QualitySettings.DecreaseLevel(true);
GetRenderPipelineAssetAt(int index):返回指定质量级别的RenderPipelineAsset。RenderPipelineAsset包含渲染管道的设置信息,可以用于配置如何渲染场景
// 获取当前质量等级的RenderPipelineAsset
RenderPipelineAsset renderPipelineAsset = QualitySettings.GetRenderPipelineAssetAt(QualitySettings.GetQualityLevel());
if(renderPipelineAsset != null)
{
Debug.Log("当前质量等级的RenderPipelineAsset名称:" + renderPipelineAsset.name);
}
else
{
Debug.Log("当前质量等级没有配置RenderPipelineAsset");
}
- 图形设置相关
anisotropicFiltering
:这个属性用于获取或设置各向异性过滤模式
antiAliasing
:这个属性控制全屏抗锯齿的质量级别
billboardsFaceCameraPosition
:这个属性决定了Billboard的朝向是否基于相机的位置。
desiredColorSpace
:这个属性获取期望的颜色空间,Linear或Gamma
masterTextureLimit
:这个属性用于获取或设置mipmap的最大级别
realtimeReflectionProbes
:这个属性确定是否启用实时反射探针
pixelLightCount
:这个属性用于获取或设置场景中可以使用的像素灯光数量的最大值
softParticles
:这个属性用于获取或设置是否启用软粒子
vSyncCount
:这个属性设置垂直同步的帧数间隔。
resolutionScalingFixedDPIFactor
:这个属性用于控制屏幕分辨率的缩放比例。用于设定在UI元素和文字渲染上,分辨率缩放时的固定DPI因子。其值在0.0 - 1.0之间,0代表低DPI,1代表高DPI。这个设置主要用于在不同分辨率和DPI的屏幕上,使UI元素和文字能够正确和清晰地渲染。
renderPipeline
:此属性获取或设置当前使用的RenderPipelineAsset
softVegetation
:用于确定是否启用“柔和植被”选项
maxQueuedFrames
:这是一个设置了Unity允许排队的帧数的属性。
anisotropicFiltering:这个属性用于获取或设置各向异性过滤模式。各向异性过滤是一种纹理过滤方法,可以提高纹理在斜面和远处的视觉质量。可以在视线接近水平时提高纹理的清晰度,此属性的值是AnisotropicFiltering枚举类型,有Disable(禁用)、Enable(启用)和ForceEnable(强制启用)三种选项。
QualitySettings.anisotropicFiltering = AnisotropicFiltering.Enable;
Debug.Log(QualitySettings.anisotropicFiltering); //输出:Enable
antiAliasing:这个属性控制全屏抗锯齿的质量级别。抗锯齿是一种图形技术,用于平滑像素边缘,减少"锯齿"效果。取值可以是0(禁用)、2、4、8等,代表使用的抗锯齿级别。
QualitySettings.antiAliasing = 2;
Debug.Log(QualitySettings.antiAliasing); //输出:2
billboardsFaceCameraPosition:这个属性决定了Billboard的朝向是否基于相机的位置。当此属性为真时,Billboard将始终面向相机。当为假时,Billboard将面向相机的方向,但不考虑相机的高度位置。
QualitySettings.billboardsFaceCameraPosition = true;
Debug.Log(QualitySettings.billboardsFaceCameraPosition); //输出:True
desiredColorSpace:这个属性获取期望的颜色空间,Linear或Gamma
Debug.Log(QualitySettings.desiredColorSpace); //输出:Gamma(默认值,具体输出取决于当前设置)
masterTextureLimit:这个属性用于获取或设置mipmap的最大级别。更高的限制会使用更小的纹理,节省显存,但会降低纹理质量。
QualitySettings.masterTextureLimit = 1;
Debug.Log(QualitySettings.masterTextureLimit); //输出:1
realtimeReflectionProbes:确定是否启用实时反射探针。
QualitySettings.realtimeReflectionProbes = true;
Debug.Log(QualitySettings.realtimeReflectionProbes); //输出:True
pixelLightCount:这个属性用于获取或设置场景中可以使用的像素灯光数量的最大值。增加这个值会提高视觉质量,但会增加性能开销。
softParticles:这个属性用于获取或设置是否启用软粒子。软粒子是一种渲染技术,用于消除粒子和地面之间的硬边缘。
QualitySettings.pixelLightCount = 4;
QualitySettings.softParticles = true;
vSyncCount:获取或设置垂直同步计数
QualitySettings.vSyncCount = 1;
Debug.Log(QualitySettings.vSyncCount); //输出:1
softVegetation:用于确定是否启用“柔和植被”选项。当此选项启用时,玩家视角接近植被(如草和小树)时,它们会变得半透明,从而避免了植被完全阻挡视线的情况
// 开启或关闭 Soft Vegetation
QualitySettings.softVegetation = true;
// 检查是否开启 Soft Vegetation
if(QualitySettings.softVegetation)
{
Debug.Log("Soft Vegetation 选项已开启");
}
maxQueuedFrames:是Unity中用于指定帧队列大小的属性。它决定了Unity在渲染时能够存储多少帧的数据。在实际应用中,如果你的游戏渲染的帧率高于显示刷新率,那么这个属性可以帮助你控制帧队列的大小。
这个属性比较难理解,下面举个例子
如果你的显示器的刷新率是60Hz,但是你的游戏的渲染帧率是300FPS,这意味着在一秒内,你的游戏可能会渲染出大约300帧的数据,但实际上显示器只能显示60帧。这样的话,多余的帧会被存储在帧队列中,等待显示器刷新时再进行显示。
maxQueuedFrames的值就是指定这个帧队列可以存储多少帧的数据。如果你把它设置得太大,那么会消耗大量的内存来存储这些未显示的帧。如果你把它设置得太小,那么可能会导致画面撕裂,因为帧队列中没有足够的帧来填充显示器的刷新间隙。
// 设置帧队列大小为2
QualitySettings.maxQueuedFrames = 2;
上面的代码将帧队列大小设置为2。这意味着Unity会在内存中保存最多2帧的渲染数据,等待显示器刷新时进行显示。多于这个数量的帧将被丢弃,不会进行渲染。
注意,这个属性的默认值是2,通常情况下,你不需要修改它。除非你有特殊的需求,比如你需要在特定的硬件上进行优化,或者你需要解决特定的渲染问题。
- LOD和粒子系统设置
lodBias
:这个属性用于获取或设置LOD距离
maximumLODLevel
:这个属性用于获取或设置最大的LOD等级
particleRaycastBudget
:这个属性用于设置每个frame用于粒子碰撞检测的最大射线投射数量。
lodBias:这个属性用于获取或设置LOD距离。LOD技术能够根据物体与相机的距离动态调整物体的模型复杂度和纹理大小,从而优化游戏性能。更高的值会导致从更远的地方看到高细节等级的物体,这可能会影响性能。
maximumLODLevel:这个属性用于获取或设置最大的LOD等级。将其设置为较低的值可以提高性能,但可能会降低视觉质量。
QualitySettings.lodBias = 2.0f;
QualitySettings.maximumLODLevel = 1;
particleRaycastBudget:这个属性用于设置每个frame用于粒子碰撞检测的最大射线投射数量。
QualitySettings.particleRaycastBudget = 3000;
Debug.Log(QualitySettings.particleRaycastBudget); //输出:3000
- 角色和皮肤设置
skinWeights
:用于控制蒙皮网格的混合权重。
blendWeights
:角色渲染时使用的混合权重。
skinWeights:用于控制蒙皮网格的混合权重
QualitySettings.skinWeights = SkinWeights.OneBone;
Debug.Log(QualitySettings.skinWeights); //输出:OneBone
blendWeights:确定在角色渲染时使用的混合权重
QualitySettings.blendWeights = BlendWeights.FourBones;
Debug.Log(QualitySettings.blendWeights); //输出:FourBones
- 渲染阴影相关属性
shadows
:这个属性允许你设置阴影的类型
shadowResolution
:这个属性用于获取或设置阴影分辨率
shadowDistance
:这个属性用于获取或设置阴影渲染的最大距离
shadowmaskMode
:这个属性用于控制阴影遮罩模式
shadowNearPlaneOffset
:这个属性用于控制所有光源的阴影近裁剪面的偏移量
shadowProjection
:这个属性用于控制阴影投影方法,可以选择Close Fit或者Stable Fit。
shadowCascades
:这个属性用于控制平行光源使用的阴影级联数量,阴影级联技术能够在不同的距离级别提供不同的阴影质量。
shadowCascade2Split
:这个属性决定了在使用2级阴影级联时,两个级联阴影的分隔位置
shadowCascade4Split
:这个属性是一个Vector3,它决定了在使用4级阴影级联时,四个级联阴影的分隔位置
shadows:这个属性允许你设置阴影的类型,如硬阴影或软阴影,或者完全关闭阴影。
shadowResolution:这个属性用于获取或设置阴影分辨率。更高的分辨率会产生更清晰的阴影,但会增加性能开销。
shadowDistance:这个属性用于获取或设置阴影渲染的最大距离。减少这个距离可以提高性能,但会降低游戏视觉质量。
QualitySettings.shadows = ShadowQuality.All;// 设置阴影的类型
QualitySettings.shadowResolution = ShadowResolution.High;
QualitySettings.shadowDistance = 100;
shadowmaskMode:这个属性用于控制阴影遮罩模式,可以是Shadowmask或者Distance Shadowmask。
QualitySettings.shadowmaskMode = ShadowmaskMode.DistanceShadowmask;
Debug.Log(QualitySettings.shadowmaskMode); //输出:DistanceShadowmask
shadowCascades:这个属性用于控制平行光源使用的阴影级联数量。阴影级联技术能够在不同的距离级别提供不同的阴影质量。
QualitySettings.shadowCascades = 2;// 改变阴影级联数量为2
Debug.Log(QualitySettings.shadowCascades); //输出当前的阴影级联数量:2
shadowCascade2Split: 这个属性决定了在使用2级阴影级联时,两个级联阴影的分隔位置。它的值范围是0到1,表示距离摄像机的百分比。例如,如果它的值是0.25,那么第一个级联阴影会延伸到视野的25%,而第二个级联阴影会延伸到剩余的75%。
shadowCascade4Split: 这个属性是一个Vector3,它决定了在使用4级阴影级联时,四个级联阴影的分隔位置。Vector3的每一个分量都在0到1之间,它们分别表示第一、第二和第三个级联阴影与摄像机的距离的百分比。例如,如果它的值是(0.2, 0.3, 0.5),那么第一个级联阴影会延伸到视野的20%,第二个级联阴影会延伸到接下来的10%,第三个级联阴影会延伸到接下来的20%,最后一个级联阴影会延伸到剩余的50%。
注意
,当QualitySettings.shadowCascades的值为2时,使用shadowCascade2Split;当QualitySettings.shadowCascades的值为4时,使用shadowCascade4Split。
// 设置使用2级阴影级联
QualitySettings.shadowCascades = 2;
// 设置两个级联阴影的分隔位置
QualitySettings.shadowCascade2Split = 0.25f;
// 设置使用4级阴影级联
QualitySettings.shadowCascades = 4;
// 设置四个级联阴影的分隔位置
QualitySettings.shadowCascade4Split = new Vector3(0.1f, 0.2f, 0.3f);
- 异步上传相关
asyncUploadBufferSize
:这个属性设置异步数据上传的缓冲区大小(以MB为单位)
asyncUploadPersistentBuffer
:是否保留异步上传的缓冲区
asyncUploadTimeSlice
:这个属性设置异步数据上传每帧可以使用的最大时间片(以毫秒为单位)
asyncUploadBufferSize:这个属性设置异步数据上传的缓冲区大小(以MB为单位)。当Unity需要将数据(例如纹理或网格数据)上传到GPU时,它可以选择使用异步上传,这意味着数据上传可以在后台进行,不会阻塞主线程。增加此缓冲区的大小可能会减少数据上传对主线程的影响,但也会增加内存的使用。
// 输出当前异步数据上传的缓冲区大小
Debug.Log("当前异步数据上传的缓冲区大小: " + QualitySettings.asyncUploadBufferSize + "MB");
// 改变异步数据上传的缓冲区大小为512MB
QualitySettings.asyncUploadBufferSize = 512;
// 再次输出当前异步数据上传的缓冲区大小
Debug.Log("更改后的异步数据上传的缓冲区大小: " + QualitySettings.asyncUploadBufferSize + "MB");
asyncUploadPersistentBuffer:当此属性设置为true时,Unity将保留异步上传的缓冲区,即使在它们不再需要时也是如此。这可以减少Unity需要创建和销毁缓冲区的次数,从而可能提高性能。然而,这也会增加内存的使用,因为缓冲区会被保留而不是被销毁。
QualitySettings.asyncUploadPersistentBuffer = true;
// 输出当前异步数据上传的缓冲区是否被保留
Debug.Log("更改后异步数据上传的缓冲区是否被保留: " + QualitySettings.asyncUploadPersistentBuffer);
asyncUploadTimeSlice:这个属性设置异步数据上传每帧可以使用的最大时间片(以毫秒为单位)。减少这个值可以防止异步数据上传占用过多的CPU时间,但可能会使数据上传需要更长的时间。
// 改变异步数据上传每帧可以使用的最大时间片为4ms
QualitySettings.asyncUploadTimeSlice = 4;
// 输出当前异步数据上传每帧可以使用的最大时间片
Debug.Log("更改后的异步数据上传每帧可以使用的最大时间片: " + QualitySettings.asyncUploadTimeSlice + "ms");
请注意,这些属性的使用和效果可能会受到你的具体硬件和Unity版本的影响。如果你打算更改这些设置,最好先进行测试,以确保它们的改变会产生你希望的效果。
- Mipmap 流处理相关
streamingMipmapsActive
:这个属性用于检测流媒体mipmap是否已激活。
streamingMipmapsAddAllCameras
:是否所有的相机都应对mipmap的流媒体进行贡献。
streamingMipmapsMemoryBudget
:用于控制流媒体mipmap的内存预算。
streamingMipmapsRenderersPerFrame
:用于设置每帧能够开始加载流媒体mipmap的渲染器的数量。
streamingMipmapsMaxFileIORequests
:设定Unity一次可以发送的最大的mipmap流文件I/O请求的数量。
streamingMipmapsMaxLevelReduction
:这个属性可以让你设置mipmap的最大降级级别。
streamingMipmapsActive:获取或设置流式Mipmap是否激活
QualitySettings.streamingMipmapsActive = true;
Debug.Log(QualitySettings.streamingMipmapsActive); //输出:True
streamingMipmapsMemoryBudget:获取或设置流式Mipmap的内存预算
QualitySettings.streamingMipmapsMemoryBudget = 512;
Debug.Log(QualitySettings.streamingMipmapsMemoryBudget); //输出:512
streamingMipmapsMaxFileIORequests:这个属性设定了Unity一次可以发送的最大的mipmap流文件I/O请求的数量。
// 设置Unity一次可以发送的最大的mipmap流文件I/O请求的数量
QualitySettings.streamingMipmapsMaxFileIORequests = 10;
streamingMipmapsMaxLevelReduction:当内存吃紧时,这个属性可以让你设置mipmap的最大降级级别。
// 设置内存吃紧时,mipmap的最大降级级别
QualitySettings.streamingMipmapsMaxLevelReduction = 2;
结论
Unity的QualitySettings类是一个强大的工具,它可以帮助你根据设备性能动态调整游戏的图形质量。通过深入理解这个类的所有类成员和用法,你可以更好地优化你的游戏,提供最佳的玩家体验。