如果您的应用程序的帧缓冲区方向与设备的原生显示方向(大多数设备为纵向)不匹配,Android 会在每一帧旋转应用程序的帧缓冲区以匹配设备的显示方向。根据设备硬件功能,这种额外的旋转会对性能产生负面影响。如果您的应用程序使用 Vulkan 图形 API 且设备支持 Vulkan,Unity 可以在渲染过程中应用此旋转,从而减少旋转对性能的影响。这称为 预旋转。
要让 Unity 应用预旋转,可以使用 C# 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
在 术语表 中查看 或 Unity 编辑器
通过 C# 脚本:将 PlayerSettings.vulkanEnablePreTransform 设置为 true
。
通过 Unity 编辑器
在项目设置窗口中,选择 播放器 选项卡,然后打开 Android 播放器设置
在 其他设置 部分,启用 在渲染过程中应用显示旋转。
Unity 在直接渲染到设备的后备缓冲区时应用预旋转,而不是渲染到 渲染纹理一种在运行时创建和更新的特殊纹理类型。要使用它们,首先创建一个新的渲染纹理,并指定一个相机渲染到其中。然后,您可以在材质中使用渲染纹理,就像使用普通纹理一样。 更多信息
在 术语表 中查看。要应用旋转,Unity 会修改投影矩阵,这会影响 UNITY_MATRIX_MVP
和 UNITY_MATRIX_P
内置着色器变量。这意味着 Unity 在顶点 着色器在 GPU 上运行的程序。 更多信息
在 术语表 中查看 中应用旋转。
使用预旋转不会影响 Unity 的 C# API 的行为。例如,您仍然可以使用 Screen.width
来访问屏幕的宽度。同样适用于 视口用户在屏幕上看到的应用程序区域。
在 术语表 中查看 和 剪裁矩形。Unity 会根据需要调整这些设置,并处理来自后备缓冲区的回读操作,例如 Grab Pass、ReadPixels 或 Screenshot。
Unity 提供实用程序宏来处理着色器中的特殊情况(有关更多信息,请参见下面的 限制 部分)。
仅当以下所有条件都为真时,宏 UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION 才被定义(否则为未定义)
preTransform
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 是一个常量,设置为当前 preTransform
旋转。它的值为以下之一
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270
如果 UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION 未定义,或者当渲染到渲染纹理时,UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 的值为 UNITY_DISPLAY_ORIENTATION_0。
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 被转换为 Vulkan 特殊化常量,这使得它在 if 或 switch 语句中使用效率更高。
在以下情况下,启用 preTransform 可能需要在使用它之前对 Unity 项目进行额外的修改
SV_Position
)这些情况仅在直接渲染到后备缓冲区时适用。