虚幻引擎VR游戏开发02 | 性能优化设置

常识:VR需要保持至少90 FPS的刷新率,以避免用户体验到延迟或晕眩感。以下是优化性能的一系列设置(make sure the frame rate does not drop below a certain threshold)

In project setting-> (以下十个设置都在project setting中)

1.Platforms-Windows -> Default RHI:DirectX12

0)Default RHI

Default RHI 指的是"默认渲染硬件接口"(Default Rendering Hardware Interface), RHI 是Unreal Engine用来++抽象不同图形API++(如DirectX、Vulkan、Metal、OpenGL等)的接口层。

"抽象不同图形API" 是指在编程和软件开发中,通过定义一个统一的接口层来屏蔽底层的具体实现细节,使得上层代码不直接与这些具体的实现交互,而是通过该接口与底层进行交互。

1)什么是图形API?

图形API(Application Programming Interface)是指一组用于与图形硬件进行交互的函数和工具。常见的图形API包括:

  • DirectX (主要用于Windows)DirectX 12是由微软(Microsoft)开发的多媒体编程接口(API),专门用于Windows操作系统。它是DirectX系列的一部分,主要用于游戏开发和其他高性能图形应用程序。DirectX 12的主要目标是提高图形性能、降低CPU的负担,并为开发者提供更精细的控制权,以便他们能够更有效地利用现代图形硬件的资源。
  • Vulkan(跨平台)
  • Metal(用于Apple设备,如macOS和iOS)
  • OpenGL(跨平台,但逐渐被Vulkan取代)

每种图形API都有自己的一套接口和实现方式,但它们的基本功能都是相似的,比如渲染三维图形、处理着色器、管理纹理和缓冲区等。

2)举个例子

假设你要在Unreal Engine中渲染一个三角形。对于不同的图形API,这可能会有不同的代码和步骤:

  • 在DirectX 12中,你可能需要设置渲染目标、配置管线状态对象(PSO)、绑定资源、然后提交渲染命令。
  • 在Vulkan中,你可能需要创建命令缓冲区、设置渲染通道、绑定着色器资源、然后提交命令。

尽管这些API的细节和调用方式不同,Unreal Engine通过RHI将它们抽象为一个统一的接口。开发者只需调用一个通用的函数(比如DrawTriangle),RHI会根据当前使用的图形API选择合适的实现并执行相应的操作。

2. Platforms-Windows -> sm6

D3D 12 Targeted Shader formats -> enable sm6

sm6 代表Shader Model 6,是DirectX 12支持的一种高级着色器模型。Shader Model 6引入了许多改进和新特性,如更好的优化、支持高级数学操作、改进的内存管理和对硬件光线追踪的支持(当与DirectX Raytracing结合使用时)。

3. Project -> Target Hardware -> Desktop Scalable

Target Hardware (optimize project setting for) -> Desktop Scalable

(可选项有mobile和desktop,根据需求平台选择)

4.Engine - Rendering -> Disable ++allow static lightin++ g

禁用static lighting之后,关卡构建时间变短

  • 关闭 Allow Static Lighting 后,不再需要为静态光源生成光照贴图,这将显著减少关卡构建时的光照构建时间。这对开发周期短、需要频繁迭代的项目来说可能是个优点。

阴影细节和全局光照效果可能质量下降

  • 静态光照通常提供高质量的阴影、光照和全局照明效果。关闭后,必须依赖动态光照或其他实时技术,这可能导致某些光照效果的质量下降,尤其是在阴影细节和全局光照方面。
  • 另外,一些高级的光照特性,如光照反弹(Light Bounce)等,可能需要额外的设置或额外的计算资源来实现类似效果。

关闭静态光照后,性能不一定会提高,具体效果取决于场景的复杂性和你的光照设置。这里是一些关键因素和影响:

1. 静态光照与动态光照的区别

  • 静态光照(Static Lighting)通常在构建(Build)时预先计算并烘焙到光照贴图中。这种光照在运行时几乎不占用任何计算资源,适合用于静态场景。
  • 动态光照(Dynamic Lighting)在每一帧都实时计算,适合处理移动物体、实时阴影等效果,但会消耗更多的CPU和GPU资源。

2. 关闭静态光照的影响

  • 无预计算光照:关闭静态光照后,光照不再预先烘焙,所有的光照效果都需要实时计算。这通常会增加运行时的计算开销,特别是在使用复杂的光照和阴影时。
  • 减少光照贴图开销:静态光照使用光照贴图,这些贴图需要存储在内存中。如果你的场景有大量的静态光源和光照贴图,关闭静态光照可以减少内存和磁盘空间的使用,加载时间也可能变短。

3. 性能影响

  • 实时光照的成本:如果你关闭了静态光照并完全依赖动态光照,GPU和CPU的负载会增加,特别是在复杂的场景中。这可能会导致帧率下降,尤其是在中低端硬件上。
  • 混合光照场景:在某些情况下,关闭静态光照并使用一些混合的光照方案(例如,使用实时阴影、光探针等)可能会优化性能,尤其是在减少光照贴图存储和加载时间的情况下。
  • 光照复杂度和场景规模:如果场景的光照复杂度较低,关闭静态光照可能对性能影响不大,甚至可能提高性能,因为省去了光照贴图的加载和存储。然而,在光照复杂度高的场景中,实时光照计算的负担可能会导致性能下降。

在做出决定前,最好在你的目标硬件上进行性能测试,观察不同设置下的性能表现。

根据项目灵活设置

在VR交互项目中,Dynamic Lighting 通常是必要的,尤其是在场景需要动态光源或实时阴影变化的情况下。然而,由于VR项目对性能的高要求,动态光照的使用需要谨慎规划和优化。对于高交互性、高沉浸感的VR项目,动态光照能显著提升视觉体验,但在性能受限的硬件上,可能需要通过混合光照或其他优化技术来找到最佳平衡点。

如果你的VR项目中用户只能在几个预定义的点之间移动,而不是自由移动,动态光照的重要性就降低了。如果场景中没有移动的光源或需要实时阴影变化的对象,那么完全可以依靠静态光照来处理大部分的光照需求。

5. Engine - Rendering -> disable forward shading

因为本文示例中禁用了static lighting. 而Deferred ShadingDynamic Lighting 的最佳选择,特别是在场景中有许多光源或者需要复杂光照效果的情况下。它能够更高效地处理实时光照、阴影和其他动态效果,而不会显著影响性能。如果你的项目需要在多个光源下实现实时光照变化和高质量阴影效果,使用 Deferred Shading 是最合适的渲染方式。

Forward Shading 和 Deferred Shading 简介:

  1. ++Forward Shading:++

    • Forward Shading 是一种较为传统的渲染路径,适用于场景中光源数量相对较少的情况。它的优势包括较低的渲染开销和更高的抗锯齿效果(如多重采样抗锯齿 MSAA)。
    • ++Forward Shading 通常在虚拟现实(VR)或需要严格控制渲染性能的场合使用,因为它可以提供较好的性能表现。++
    • 它在处理透明物体和复杂材质时较为有效,适合场景中有大量透明材质或需要++高质量抗锯齿++的项目。
  2. Deferred Shading

    • Deferred Shading 是一种更现代的渲染路径,允许场景中有大量光源,而不会显著影响性能。这是因为光照计算是在一个单独的延迟阶段进行的,而不是在几何渲染时完成的。
    • Deferred Shading 可以处理更多的光源,特别是在复杂的场景中,这是它的主要优势之一。
    • 由于 Deferred Shading 的架构特点,它不支持一些 Forward Shading 专属的特性,如MSAA。不过它适合高复杂度场景的光照处理。

Disable Forward Shading 的效果:

  1. 启用 Deferred Shading

    • 关闭 Forward Shading 后,虚幻引擎会切换到使用 Deferred Shading。这将允许引擎更高效地处理场景中大量的动态光源,尤其是在光源数量较多的复杂场景中。
  2. 影响性能和光照处理

    • Deferred Shading 能更高效地管理和渲染多个光源,但在透明材质处理和抗锯齿方面可能不如 Forward Shading。这意味着在某些情况下,可能会导致性能下降,特别是在处理复杂的透明物体时。
    • 对于需要处理大量光源的场景,Deferred Shading 可以带来更好的光照效果和性能。
  3. 限制特性

    • 禁用 Forward Shading 后,项目将无法使用 Forward Shading 提供的一些特性,如MSAA。对于需要这种高质量抗锯齿效果的项目,这可能是一个缺点。
  4. 光照和材质效果

    • 在使用 Deferred Shading 时,项目中的光照和材质效果会更加复杂和多样化,特别是涉及到全局光照和屏幕空间反射等高级渲染特性。

何时禁用 Forward Shading:

  • 复杂场景和光照:如果你的项目包含复杂的光照设置,或你需要在场景中使用大量动态光源,禁用 Forward Shading 并使用 Deferred Shading 可能是最佳选择。
  • 高端设备或主机平台:在图形处理能力较强的平台(如高端PC或主机)上,Deferred Shading 通常是首选,因为它能处理更复杂的光照和材质效果。

总结:

禁用 Forward Shading 意味着启用 Deferred Shading,这将使引擎更好地处理复杂场景中的大量光源,同时也可能在透明材质处理和抗锯齿效果上有所牺牲。具体是否禁用应根据项目的复杂度、性能要求以及目标平台的特点来决定。

6. Engine - Rendering -> Reflection->

reflection Method: Lumen

reflection capture resolution 128 ->96/64

8. Engine - Rendering ->Hardware ray tracing -> support hardware ray tracing

enable++support hardware ray tracing++

disable ++ray trace shadows++ && ++ray trace skylight++ (they are too expensive) (even you render with 4090!)

  • Support Hardware Ray Tracing 是一个全局开关,用于启用Unreal Engine对硬件加速光线追踪的支持。开启后,相关的光线追踪效果才能发挥作用。
  • Ray Traced Shadows 是一个具体的光线追踪功能,用于生成更精确、柔和且物理上更准确的阴影。
  • Ray Traced Skylight 是另一个具体的光线追踪功能,用于计算来自天空光的全局照明效果,提升间接光的真实感。

如果你只开启了Support Hardware Ray Tracing但没有开启任何具体的光线追踪效果:

  • GPU会支持光线追踪,但不会进行相关计算:因为没有启用任何具体的光线追踪功能(如阴影或全局照明),GPU虽然支持光线追踪,但没有实际执行这些计算任务。你的场景将继续使用传统的光栅化方法渲染阴影和照明。

  • 其他光线追踪功能:虽然你没有启用Ray Traced Shadows和Ray Traced Skylight,但如果你启用了其他光线追踪功能(如Ray Traced Reflections(反射)或Ray Traced Ambient Occlusion(环境遮蔽)),那么这些功能仍然会受益于硬件光线追踪的支持。

在Unreal Engine的项目设置中,不同版本可能会有一些变化或简化。虽然在项目设置里可能没有直接显示"Ray Traced Reflections"和"Ray Traced Ambient Occlusion",但这些功能实际上仍然存在并可以在材质和后期处理卷中启用它。

1. Ray Traced Reflections(反射)

  • 在哪里控制: 虽然项目设置中没有直接列出"Ray Traced Reflections"选项,但你可以在材质和后期处理卷中控制它。
  • 启用方法 :
    1. 后期处理卷(Post Process Volume) : 在场景中添加一个后期处理卷,确保它的Unbound选项被勾选(这样它会影响整个场景)。
    2. 在后期处理卷的设置中,找到"Reflections"部分。
    3. 将"Reflection Method"设置为Ray Tracing
    4. 你还可以调整反射的质量和样本数量以平衡性能和视觉效果。

2. Ray Traced Ambient Occlusion(环境遮蔽)

  • 在哪里控制: 类似于Ray Traced Reflections,这个设置通常在后期处理卷中找到。
  • 启用方法 :
    1. 在后期处理卷的设置中,找到"Ambient Occlusion"部分。
    2. 将"Ambient Occlusion Method"设置为Ray Tracing
    3. 调整相关参数(如IntensityRadius)以获得所需的效果。

3. 其他设置(如Texture LOD和Path Tracing)

  • Texture LOD: 这是与纹理细节相关的设置,控制在光线追踪渲染中使用的纹理细节级别。
  • Path Tracing: 这是一个高级的全局光照渲染模式,使用路径追踪来生成极其逼真的光照效果,但它主要用于静态渲染(例如电影级别的场景或静态图像),而非实时渲染。

9. rendering ->Nanite -> enable Nanite

10. rendering ->Anti-Aliasing Method

  • FXAA: 最适合低性能影响的情况,画面可能稍模糊。
  • TAA: 适合动态画面和平滑边缘,但可能导致轻微的模糊或鬼影。
  • MSAA: 提供高质量的边缘抗锯齿,但性能开销较大。
  • TSR: 在高分辨率下提供优质图像,并优化了传统抗锯齿方法的不足之处。

MSAA(multisample anti-aliasing/antialiasing by supersampling)

MSAA就是一个像素划分成很多个小的像素,划分成4*4甚至是100*100. 它不是靠提高分辨率直接解决采样问题,像素划分只是为了近似一个合理的覆盖率。

------------------------混合光照方案补充(待更新)-----------------------

1.实时阴影

2.光探针

光探针(Light Probe) 是一种用于捕捉和存储场景中光照信息的技术。它们通常用于在动态光照和静态光照之间找到平衡,特别是在混合光照场景中。光探针能够为场景中的动态物体提供逼真的间接光照,而无需实时计算复杂的全局照明。

光探针的工作原理

光探针通常是放置在3D空间中的一个或多个点,这些点用于捕捉环境的全局光照信息。这个信息包括来自周围环境的间接光照,比如来自天光、反射光等。光探针的作用主要体现在以下几个方面:

  1. 捕捉环境光照

    • 光探针会捕捉并存储场景中某些点的光照数据,包括光的颜色、方向和强度。这个数据可以被动态物体使用,以获得与环境一致的照明效果。
  2. 影响动态物体

    • 当场景中的动态物体(例如移动的角色或物体)移动到光探针的范围内时,它会使用探针的数据来调整自己的光照,模拟出更逼真的环境光和间接光照效果。
    • 例如,一个角色移动到阴影区域时,光探针可以提供较低的光照信息,从而使角色变得更加阴暗。
  3. 球谐函数(Spherical Harmonics)

    • 光探针通常使用一种叫做球谐函数(Spherical Harmonics)的技术来存储和处理光照数据。这种方法可以有效地表示复杂的光照环境,并在渲染时快速应用于动态物体。

应用场景

  • 混合光照场景:在使用静态光照贴图的同时,光探针可以为动态物体提供间接光照。这种方法减少了实时光照计算的开销,同时保留了光照的真实性。
  • 大型开放世界:在一些大型开放世界游戏中,场景的光照通常非常复杂。光探针可以帮助动态物体与静态环境的光照更好地融合,使整个场景的视觉效果更加统一。

优势和局限

  • 优势

    • 性能优化:通过使用预先捕捉的光照数据,减少实时计算的开销,特别是在需要处理复杂的间接光照时。
    • 一致性:能够提供与环境一致的间接光照,使动态物体与静态场景更好地融合。
  • 局限

    • 精度有限:光探针通常只能捕捉到低频的光照信息,对于非常细致的光照变化可能不够精确。
    • 探针布置:需要合理地布置光探针,以覆盖场景中所有可能的动态物体位置。过少的探针可能导致光照信息不准确,而过多的探针则会增加存储和处理的负担。

总结

光探针是一种有效的技术,用于在不牺牲性能的前提下,提供逼真的间接光照效果,特别是在混合光照场景中。通过合理使用光探针,可以在场景中实现高质量的动态光照,优化性能,同时保持视觉一致性。

相关推荐
Thomas游戏开发16 分钟前
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前端框架·unity3d·游戏开发
九州ip动态3 小时前
模拟器多开限制ip,如何设置单窗口单ip,每个窗口ip不同
tcp/ip·游戏·媒体
鹿野素材屋3 小时前
Unity Dots下的动画合批工具:GPU ECS Animation Baker
unity·游戏引擎
St_Ludwig3 小时前
C语言 蓝桥杯某例题解决方案(查找完数)
c语言·c++·后端·算法·游戏·蓝桥杯
小春熙子10 小时前
Unity图形学之着色器之间传递参数
unity·游戏引擎·技术美术·着色器
虾球xz11 小时前
游戏引擎学习第15天
学习·游戏引擎
Java Fans15 小时前
在Unity中实现电梯升降功能的完整指南
unity·游戏引擎
qq_4286396119 小时前
植物明星大乱斗15
c++·算法·游戏
vir0221 小时前
好奇怪的游戏(BFS)
数据结构·c++·算法·游戏·深度优先·图论·宽度优先
GrimRaider21 小时前
[Unity]TileMap开发,TileMap地图缝隙问题
unity·游戏引擎·tilemap