UNIGINE 2.20:优化、UI 工具包、VR/XR 改进、高斯喷洒
主要更新
- 大量优化提升了 CPU 性能、稳定性、加载速度,并减少了 RAM 和 VRAM 占用
- 增强的图像放大器,现在也支持 Vulkan
- 实验性可视化游戏内 UI 设计器
- VR/XR 增强,包括眼动追踪、混合现实、扩展模拟及多项优化
- 实验性支持高斯喷洒(Gaussian Splatting)
- 新的八面体替身技术:更高效且视觉更准确
- 更新后的 C# 组件系统:现支持外部库、接口和抽象类
- UnigineEditor 中增加了多项易用性改进
- 改进的程序化网格修改 API:更安全、更灵活,并支持流式处理
- Sandworm 中地形生成速度更快,内存占用更低
- 重制的示例项目:更易查找,涵盖所有 API,完整源代码已发布在 GitHub
在完全迁移到 DX12 和 Vulkan 后,稳定引擎花费了一些时间,但成果显而易见 —— 我们已经实现了多项优化,而这还只是个开始!
渲染增强
图像放大器升级 & Vulkan 支持
此次版本大幅提升了图像放大功能,在多个平台和渲染后端上实现了更清晰的画质和更优的性能。
- DLSS 现已支持 Vulkan,适用于 Windows 与 Linux,为更多硬件配置带来高质量图像放大。
- FSR(FidelityFX 超分辨率) 现已完整支持 Windows Vulkan,其适用范围超越 DirectX。
- FSR 升级至 3.1.3 版本,提升图像质量,增强时间稳定性,并减少重影现象。
- NVIDIA Streamline SDK 升级至 2.7.32,现支持至 DLSS4,带来更高的视觉保真度、更快的性能表现,并更好地支持最新 GPU。
这些更新让你更轻松地在性能与画质之间取得平衡,无论是面向高性能系统还是资源有限的硬件环境。
替身渲染增强
本版本新增了一种全新的Octahedral,用于广告牌式替身生成,相比现有的Spherical,在效率和图像准确度方面更具优势。
八面体映射能实现视角的均匀分布,尤其在倾斜角度观察时显著提升替身的视觉质量。传统的球面布局将视图简单排列在网格中,容易出现失真和覆盖不均。而八面体模式采用八面体投影技术,将视角以更紧凑、低畸变的形式打包,有效提升视觉表现。
八面体模式的主要优势:
- 更好的角度覆盖:各个观察方向上的细节更加一致
- 更高的纹理空间利用率:减少冗余,避免像素浪费
- 更平滑的视角过渡:支持更高质量的视图混合
- 对 GPU 采样更友好:兼容依赖视角的着色和法线贴图
- 适用于高保真替身:特别适合中距离对象,对细节要求较高的场景
无论你更偏好使用简单的Spherical模式,还是追求更高精度的Octahedral模式,都可以根据项目需求灵活选择。两种模式都已完整集成至当前工作流中,并提供全面支持。只需在替身生成设置中选择所需的布局,即可切换。
体素探针更新
现在可通过更灵活的设置,控制体素探针对带有次表面散射材质的影响范围。
锐化效果优化
用于增强边缘细节、使画面更清晰的 Sharpen 锐化效果在本次版本中进行了改进,使其在处理细线条与高亮区域时表现得更加自然。
间接高光归一化
全局光照系统新增了一项设置,可调整间接反射的颜色和亮度,使其与间接漫反射光照更加一致。该设置同时影响哑光和高光反射。
这一功能特别适用于例如桌子下方等间接漫反射较暗的区域(由光照贴图、体素探针或其他方式设定),可使该区域内的间接镜面反射也呈现出合理的暗部效果。
这种处理方法在许多游戏中非常常见,尤其是主机平台上,因为它是一种性能友好型手段,可有效避免场景中暗部出现过亮的反射。
Agility SDK 集成(为旧版 Windows 10 提供最新 DX12 功能)
为便于过渡到新的 DirectX 12 特性(如硬件光线追踪、无绑定纹理等),同时又不强制用户更新操作系统,我们现已集成 Agility SDK。这意味着,即使你使用的是旧版本的 Windows(或特定构建号),仍然可以在引擎中启用本该需要升级系统才能使用的最新 DX12 功能。
此举将最低操作系统要求提升至 Windows 10 构建版本 19041.804,但这是一个合理的代价——因为它让所有 Windows 10(2021 年 2 月更新及以上)和 Windows 11 用户都能享受到最新的 DirectX 12 功能。
云渲染改进
- 修复了在“Render Before Transparent(透明前渲染)”模式下 ObjectSky 和 ObjectCloudLayer 的渲染问题。在“Sort Transparent(透明排序)”模式中,ObjectCloudLayer 现在始终渲染在 ObjectSky 前;而在“Render Before Transparent”模式下,则会被渲染在 ObjectSky 之后。同时也修复了当太阳位于 ObjectSky 背后时出现的不正确颜色混合问题。
- 修复了基于广告牌的星星与云之间的渲染顺序错误。现在在透明材质中新增了一个“Rendering Clouds Order(云渲染顺序)”选项,可强制将该材质渲染在云层之前或之后。
- 修复了在降采样(Downsampling)、交错(Interleaved)和全景(Panorama)渲染模式下,ObjectCloudLayer 与非透明对象的深度排序错误问题。
- 修复了在使用地理枢轴(Geodetic Pivot)对云层进行弯曲时,行星阴影投射错误以及视觉伪影问题。
- 修复了在启用交错渲染模式时,地平线附近云层出现的视觉伪影(如抖动、闪烁)问题。
- 修复了当太阳接近地平线(如日出和日落)时,云层阴影渲染不正确的问题。
其他渲染改进
- 修复了启用 Transparent Shadow(透明阴影) 选项时,Projected(投影) 光源对透明物体阴影渲染的问题。
- 修复了由于 Auxiliary(辅助) 缓冲中深度处理错误导致的 Grass(草地) 替身渲染伪影问题。
- 修复了 Auxiliary 缓冲中 Decal(贴花) 排序问题,之前在开关贴花或重新加载场景时,其渲染顺序可能发生混乱。
- Raymarching Probes 和 SSR(屏幕空间反射) 生成的高光反射在零粗糙度表面上已恢复正常。
- 修复了 Bent Normals(弯曲法线) 的计算方式,显著降低了噪点。
- 解决了 SSGI 放大处理中的问题,确保其在所有 SSRTGI 分辨率设置下均可正常工作。
- 新增支持在体素探针(Voxel Probe)基础上以叠加模式渲染环境探针(Environment Probe),以模拟来自太阳的全局光照反弹。具有更高 Order 值的环境探针将渲染在 Order 值较低的体素探针之上。要启用该功能,只需勾选环境探针中的“Render Above Voxel Probes(在体素探针上方渲染)”选项。
- 修复了启用 SRAA 时透明材质无法渲染的问题。
- 修复了为网格簇(Mesh Clutters)分配图形材质时,无法写入辅助缓冲区的问题。
用户界面
带可视化编辑器的游戏内 UI 框架(实验性)
在 2.20 版本之前,构建用户界面并非拖放式体验 —— 需要熟悉 API 并编写大量代码。得益于我们社区中才华横溢的开发者贡献,我们现在拥有了一个强大的 Toolkit(工具包),作为插件实现。目前它包含两个核心组件:UI Designer(UI 设计器)和 Runtime Editor(运行时编辑器)。
UI Designer 将 UI 开发变成可视化流程,使美术与设计人员无需深厚编程经验也能构建界面。
基于灵活的 Widget API,UI Designer 用直观的拖放操作替代了手动编程。你可以以交互方式搭建布局,并在视口中实时查看修改效果。
以下是该工具包包含的核心界面功能:
- 丰富的 UI 库:标签、输入框、复选框、进度条、表格、滑块、窗口等组件,均可自定义
- 智能布局工具:支持像素级对齐、网格吸附、锚点与枢轴控制
- 无缝的编辑器集成:支持撤销/重做、复制粘贴、多选操作以及分辨率切换,保障流畅工作流程
- 层级与组织管理:通过树状视图管理复杂的 UI 结构
- 自定义材质与着色器:可为 UI 元素直接应用高级视觉效果
- 基于组件的工作流程:兼容 C++ 与 C# 的组件系统
- 附带示例项目:内置多个示例,帮助你快速上手:
- Elements:展示所有可用 UI 元素类型
- Epic Menu:演示带有动画、过渡与音效的菜单
- Glass Material 与 Custom Materials:展示如何应用不同材质
- Radio Buttons 与 Toggled Buttons:演示不同类型的按钮
- Rectangle Selection:演示如何通过绘制矩形区域高亮选择 UI 元素
- Localization:展示如何切换 UI 的语言版本
- Show/Hide Animation:演示各种 UI 元素的显示/隐藏动画方式
Runtime Editor 是一个轻量级的游戏内调试工具,支持实时节点检查、组件查看和测试脚本运行 —— 无需停止应用程序即可完成。
Toolkit 插件旨在简化你的开发流程、节省时间。未来我们还将持续扩展模块功能 —— 目标始终如一:帮助创作者更高效、更轻松地完成更多工作。你可以免费从 UNIGINE 插件商店 下载,它适用于所有 SDK 版本。
多个 Widget 更新
- 新增对 Widget 容器(如 WidgetVBox、WidgetHBox 和 WidgetGridBox)背景纹理的控制支持,包括可选的九宫格切片(9-slicing)和多种过滤模式。这大大简化了带自定义纹理的 GUI 面板的创建。相关 API 已扩展,详情请参见 API 迁移指南。
- 修复了在全屏模式下应用 DPI 缩放修正时的问题。
- 修复了 UnigineScript 工具中的 DPI 缩放问题。
- 修复了 Widget::getTextRenderSize() 方法在某些情况下返回错误尺寸值的问题。建议使用 Widget::getTextUnitSize() 来获取逻辑单位(设备无关像素)中的文本尺寸。更多信息请参考 DPI 缩放文章。
- Gui::setExposeSpeed() 现在支持设置为 0,表示禁用出现/消失时的动画(淡入淡出)。此更改解决了首帧无法渲染任何控件的问题。
- 修复了 GUI 字体问题,包括某些字体中的数字对齐错误和富文本中的图像缩放计算问题。
高斯喷洒导入(实验性)
高斯喷洒(Gaussian Splatting) 是一种现代点云可视化渲染技术,广泛应用于实时光照重建、AR/VR 和游戏引擎等场景。本版本通过插件引入了对 Gaussian Splats 的实验性导入与渲染支持,适用于 Engineering 和 Sim SDK 版本。
要可视化 splat 数据,只需在场景中创建一个占位节点,并为其分配 gaussian 属性,然后指定一个 *.ply 文件的路径即可。
此外,我们在 C++ Sim Samples 示例集中新增了一个 Gaussian Splatting 示例项目。
VR/XR 改进
本次更新在 VR 和 XR 整体体验方面取得了显著进展,引入了多项新功能与优化。以下是最新增强内容的概览:
OpenXR 眼动追踪支持
我们在 OpenXR 中集成了眼动追踪功能,支持以下扩展:XR_EXT_eye_gaze_interaction、XR_FB_eye_tracking_social 和 XR_VARJO_foveated_rendering,使用户能够享受更沉浸、更个性化的交互体验。借助眼动追踪,VR 应用现在可以检测并响应用户视线位置,带来更直观的控制方式,并为 UI 设计、凝视导航、以及虚拟世界中的真实感提升提供全新可能。
我们为此功能开发了自定义合成系统,支持所有提供 Eye Tracking 数据的 OpenXR Runtime 与头显组合,适配任意 Eye Tracking 扩展。
OpenXR 动态中心渲染(Foveated Rendering)
为进一步提升性能,我们为所有 OpenXR Runtime 实现了动态中心渲染。这一技术可在用户视野的中心区域保持高分辨率,而对周边区域进行智能降分辨率处理,从而减轻 GPU 负担、提升效率,同时不影响关键画面质量,增强沉浸感。
此外,本版本还针对中心渲染优化了屏幕空间雾效(Screen-Space Haze Global Illumination),使光照与阴影效果更加真实,特别是在启用中心渲染的区域,整体视觉更自然。
混合现实改进
我们通过 OpenXR 为 Oculus 3 和 Varjo XR-3 添加了基础混合现实支持。Varjo 的 MR 模块也进行了多项修复与更新,提升了稳定性、追踪效果和整体功能表现。现已支持以下扩展:XR_FB_passthrough、XR_VARJO_view_offset、XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND、XR_ENVIRONMENT_BLEND_MODE_ADDITIVE。色键抠像(Chroma-keying)以及部分 Varjo 专有功能暂未集成,预计将在后续版本中加入。
单眼摄像头参数调整
你现在可以为左右眼虚拟摄像头分别设置偏移量,以适配自定义设备布局。同时也可为每只眼睛分配不同的可编程材质,从而实现非对称视觉处理(例如用于矫正镜头畸变、添加艺术效果,或模拟视觉障碍等)。
视野范围(FOV)也可按眼分别调整,提供更大的灵活性。
这些功能让你能够逼真模拟带侧置摄像头的头显设备,或是视野受限的设备,例如夜视仪。
OpenXR 输入系统改进
我们对 OpenXR 输入系统进行了多项更新,提升了输入处理能力与设备兼容性,使不同控制器与输入方式下的交互更流畅、更直观。
OpenXR 手部追踪
VR 模板现已内置原生支持 OpenXR 标准的手部追踪功能。该功能与引擎 VR 系统直接集成,无需额外插件,并可适配所有支持手部追踪的 OpenXR 兼容设备。
OpenVR 设备连接改进
我们改进了 OpenVR 设备的连接系统,解决了连接问题,确保在 VR 会话期间设备的设置和连接更加顺畅。现在引擎能正确识别所有已连接的 OpenVR 兼容设备,避免其被错误忽略。
VR 中自适应曝光优化
我们对 VR 中的自适应曝光功能进行了优化,使视觉体验更加自然与一致。亮度与对比度可根据虚拟环境中的光照变化自动调整,在动态场景中提供更舒适、平衡的视觉感受。
VR 模拟支持更多头显设备
VR 模拟范围现已扩展,新增了多款主流头显(HMD,头戴显示器)支持,包括 HTC、Valve、Oculus、Meta、Varjo、Pico 等。这让开发者可以在更多设备上测试其应用,确保其在不同平台与头显之间的兼容性与性能表现。
多项性能优化
本次 SDK 更新包含一系列性能与视觉质量优化。以下是多个场景在与 2.19.1.2 版本对比下的优化结果摘要:
多线程阴影渲染(DirectX 12)
阴影渲染往往是实时渲染中性能开销最大的部分之一,尤其是在内容复杂的场景中。现在,多线程渲染模式(适用于 DirectX 12)已全面支持阴影处理。此前,阴影渲染是单独在线程中顺序执行的,而现在多个光源的阴影甚至阴影级联(cascades)都可以并行渲染。 该模式带来了显著的CPU 性能提升和帧率增长。
在包含 89 个光源、共 176,493 个表面(其中 168,465 个用于阴影)的复杂场景中进行的多平台测试显示,CPU 性能提升最多可达 3 倍(具体取决于 CPU 核心数量)。
全向光与投影光源优化
我们对 全向光(Omni) 和 投影光源(Projected) 的渲染进行了性能优化。现在这些光源以 网格(Mesh) 形式表示,从而支持深度测试,有效避免了不必要的计算浪费。
此外,投影光源的包围盒尺寸已被缩减,提升了 基于边界的剔除效率,即便在大视野角(FOV)下,其边界也能保持紧凑。
这类光源的遮挡剔除(Occlusion Culling)精度也得到了提升,在包含遮挡物的优化场景中显著减少了渲染负载,提高了整体性能。根据我们的测试场景(包含 198 个光源,包括 Omni 和 Proj 类型),在 2.19.1 中只有 145 个光源被成功剔除,而在 2.20 中剔除了 182 个,剔除效率大幅提升。
在真实与高负载的合成场景中,平均性能提升范围为 16% 至 25%,具体取决于场景的光源数量与遮挡物布局。
集群优化
在模拟大规模真实环境的场景中(例如专业级模拟器),通常会使用大量 Mesh Clusters(网格集群)。它们是为高性能渲染而设计的优化对象,能在复杂场景中高效处理海量几何体。
在本次版本中,我们显著提升了 Mesh Clusters 的性能,并减少了内存与磁盘占用。集群数据现以 紧凑的二进制格式 存储,与 XML 格式的 *.world 和 *.node 文件分离,从而加快了加载与保存速度,尤其适用于包含大量集群的世界。
对于大量使用集群的项目:
- 世界加载时的内存占用减少了 5–10%,因跳过了 XML 解析过程。
- 世界加载速度在真实项目中提升了 15–20%,在合成测试中最高提升达 4 倍。
- 保存速度在真实项目中提升约 3 倍,在合成测试中可达 16 倍。
- 场景文件大小显著减小,且压缩率与集群数量成正比。
现在,二进制集群数据会保存在专用的 shadow 文件夹中:
mount://.binary_nodes_data/<node_or_world_guid>/clusters
这部分数据会被编辑器自动忽略,因此不会生成 .meta 文件,也不会污染你的项目目录或工作区。
迁移过程是自动完成的:只要保存带集群的 world 或 node 文件,就会生成新的二进制数据。旧格式数据会自动转换。但请注意,切换至二进制存储格式不向后兼容。
内存占用优化
作为我们持续提升引擎效率与可扩展性的工作的一部分,我们优化了以下模块的 RAM 占用,以适配从高端 PC 到内存受限设备的各类硬件环境:粒子系统(Particles)、广告牌(Billboards)、固定功能管线(FFP)以及可视化工具(Visualizer)。
网格压缩
*.mesh 文件中的几何数据现在将以压缩格式存储,同时包含边缘信息(edges)和空间树数据(spatial tree)。如果此前未生成边缘和空间树数据,导出网格时将自动构建并保存这些数据。此前这些结构是在运行时动态生成的,容易引起性能峰值。
此外,这也改进了网格内存估算。由于边缘和空间树信息现在可嵌入到网格文件头部,流式系统可以准确评估内存占用。而旧机制只能依据文件大小粗略估算,精度有限。
程序化网格修改优化
此前的程序化网格修改流程相对简单:切换至程序化模式 -> 设置新网格 -> 应用。但这种方式存在局限,易引发问题。例如:procedural模式下的网格不支持流式加载,因此始终驻留于内存中。在大规模程序化生成场景中,这种限制可能导致 RAM 与 VRAM 占用过高,甚至崩溃。
此次更新扩展了相关 API,提供多种程序化模式,每种都针对特定使用场景与性能需求进行了优化,支持高度灵活的开发策略——从运行时快速调整多个小型网格(如箭头指示器),到大规模程序化生成,都可以选择合适的方式流式加载(支持从内存或磁盘,以异步或强制方式)。
更多详情请参考 API 迁移指南,我们还为 C++ 和 C# 示例库添加了新的 Mesh Modification 示例项目。
DX12 内存分配优化
Unigine 2.19.1 是最后一个支持 DirectX11 的版本。自此之后,我们将 DirectX12 作为主要图形 API,它为开发者提供了更多控制权,使得性能优化更加高效。这种“自由”意味着有更大潜力实现性能飞跃和资源高效利用,但也对开发者的代码质量和 API 理解提出了更高要求。与 DX11 不同,DX12 不会自动替你处理优化,容错性也更低,任何错误或低效的代码都会直接反映为性能损耗。在迁移过程中,我们发现一些潜在问题,包括性能波动、性能下降、因 API 使用错误或内存分配器配置不当而导致的内存过度占用等。
本次版本中,我们对 DirectX 12 下的内存管理进行了全面优化,解决了多个关键问题,目标是让 DX12 的使用更加友好且更具容错性,同时性能保持与 DX11 相当甚至更优。新版本的内存分配器采用了先进的智能堆池管理机制,显著提升了稳定性,降低了峰值 VRAM 占用,消除了内存泄漏、性能峰值和崩溃等问题,并对未优化或不完善的用户代码具备一定补偿能力。这一切的代价是大约 128MB 的额外内存开销,但这是一笔值得的投入。
此外,我们还实现了动态纹理内存池系统,专为高动态纹理使用场景进行了优化,使纹理资源的创建、使用与释放过程更加平滑。该优化也带来约 128MB 的内存消耗。
在我们的测试场景中,平均内存使用降低约 50%,具体数值取决于项目中内容与代码的优化程度,未优化项目中的收益尤为显著。
对于那些拥有高超技术、对自身管线和代码完全优化充满信心的高级开发者,如果不需要任何辅助或智能型内存管理机制,现在可以选择手动控制内存资源 —— 通过减少堆池大小,甚至将其设置为 0,从而完全自行负责内存管理。
同时,我们还优化了帧分配器(Frame Allocator),通过将内存分配拆分为更小的块并在帧之间重用内存,降低了峰值内存占用,使整体流程更为平滑。此外,现在粒子、草地和广告牌共用同一个索引缓冲区,从而在不同对象类型间减少内存消耗。这些优化有效消除了内存波动,防止因内存占用过高导致的崩溃。
C# 组件系统
C# 组件系统为 UnigineEditor 提供原生支持,具备清晰的架构与流畅的开发流程。现在,我们在此基础上引入了一系列提升开发者体验与效率的改进。
快速创建空白 C# 文件
并非所有应用逻辑都应写在组件内部 —— 有时你需要定义接口、创建工具类、拆分为部分类,或添加架构支持类。
现在你可以直接在 资源浏览器(Asset Browser) 中快速创建空白 C# 文件,无需切换至 IDE。
接口与抽象类支持
C# 组件系统现已支持接口与抽象类,开发者可构建更具模块化、可测试性与可维护性的架构,实现低耦合并轻松集成依赖注入(Dependency Injection)。
你可以将接口或抽象类类型作为组件参数公开,并直接在编辑器中分配具体实现类,从而定义清晰的行为契约。
更多详细信息,请参阅 这篇文章。
通过名称访问组件
通过 API 管理组件变得更加简单。你现在可以使用 AddComponent()、GetComponent() 和 RemoveComponent() 方法,通过名称轻松添加、访问或移除组件。
AddComponent(player, "HealthComponent");
...
if (health < 0)
{
RemoveComponent("HealthComponent");
}
其他 C# 改进还包括:
- 新增了一组用于 Widget、Texture 和 Material 的 C# 数据封送器(marshallers)。
- 现在可以在 C# 组件中使用第三方库 —— 只需在 *.csproj 文件中手动或通过 IDE 添加引用即可。
CPU 多线程优化
随着引擎内部多线程能力的持续增强,我们也将这一能力开放给开发者。全新线程 API 可与自定义任务紧密集成,为任务执行提供精细控制,同时保持各系统间的确定性行为。
更新后的 AsyncQueue 类允许你在多个线程间调度操作、设置优先级,并构建清晰、可预测的执行流程 —— 无论是处理重型 CPU 逻辑,还是处理低延迟任务,都可以轻松胜任。你可以用 C++ 或 C# API 搭建自定义任务系统,甚至实现类似“CPU 着色器”的高效数据处理,简洁、灵活、无需复杂配置。
C++ API 现在还提供了丰富的原子操作和同步原语,包括互斥锁(mutex)、自旋锁(spinlock)以及无锁类型(lock-free types)。你可以选择自动的上下文感知行为,或完全手动控制,轻松应对从轻量协作到复杂并行工作的各种需求。
更多详情请参阅 API 迁移指南。
文件系统改进
API 级长路径支持
在大型项目中,通常会出现层级极深的目录结构与描述性极强的文件名,从而导致超长路径。自本版本起,引擎文件系统 API 已完全支持扩展路径长度,彻底消除以往的限制,确保对任意资源的稳定访问。
FileSystem::addVirtualFile 支持绝对路径
引擎现在支持在 FileSystem::addVirtualFile() 中使用绝对路径,使得处理项目目录外的文件变得更加便捷。你可以直接挂载外部资源,而无需将其复制到 data 文件夹中。引擎会自动规范路径并将其转换为虚拟路径。
支持密码保护和压缩归档的流式加载
在 UNIGINE 应用程序的最终构建中,内容通常会被打包为 UNG 归档文件,并可能启用密码保护。而 2.19 版本中引入的高级包流式加载功能此前不支持压缩与加密归档。本次更新移除了这一限制。现在可从此类 UNG 包中快速读取数据。我们移除了运行时性能较差的 zlib 全局压缩机制,转而采用基于文件扩展名的选择性压缩策略:.json、.xml、.txt、.node、.world、.prop、.track、.mat 和 .basemat默认启用压缩(因为它们无需流式加载)。.lmap、.texture、.mesh 以及其他二进制文件保持原始格式打包,因为它们已内含压缩机制。对于后者,不建议再进行二次压缩 —— 压缩率不高,反而会因流式加载开销增加而影响性能。不过,即使启用了压缩,这些文件在 2.20 中的加载速度仍优于 2.19.1,尤其在 Windows 系统中效果更显著。
ung_x64 打包工具中的 -c 参数现在表示需压缩的文件扩展名列表,例如:-c "json xml txt node world prop track mat basemat"。同时新增了 -s 参数,用于展示各扩展名的压缩统计信息,帮助你评估启用压缩带来的实际收益。
引擎其他改进
- 实现了对 Landscape Terrain for Clutters 与 Grass 的批量相交计算,加载速度提升最高可达 10 倍。
- 已移除 Fast Shutdown 选项,现在引擎始终以启用该选项(值为 1)的方式运行。请注意,不再支持在不重启应用程序的情况下重新初始化引擎(即不能在调用 shutdown() 后再次调用 init())。
- 修复了在不同 DPI 缩放设置的显示器之间拖动窗口时因 DPI 递归缩放导致的崩溃(Windows 10)。
- 新增 d3d12_vsync_interval 控制台命令,用于控制 DirectX 12 的 VSync 帧交换间隔(例如,每第 n 次刷新交换缓冲)。
- 修复了通过 API 创建并绑定至材质的纹理在删除时引发的崩溃。
- 修复了多个力反馈相关问题,现在已确保常用设备的主功能稳定可用,并扩展了相关 API(详见 API 迁移指南)。
- 修复了在接收原始鼠标输入并启用 Absolute 模式时鼠标增量计算不正确的问题。Linux 下新增触控板输入的鼠标事件模拟,使其与 Windows 行为一致,可用于相机控制与 UI 交互。
- 移除不被硬件支持的纹理格式:RGB8、RGB16、RGB32、RGB16U、RGB32U、RGB16F、RGB32F、R24B8 和 D24。引擎始终在内部将三通道纹理(例如 RGB8、RGB16、RGB32)自动替换为对应的四通道格式:RGBA8、RGBA16、RGBA32。
- 在 Vulkan 渲染后端中,已将 D24S8 替换为 D32S8。RGB565 和 RGB5A1 现在使用真实的原生格式,而不再被替换为 RGBA8。同时,禁止将 RGBA4 用作渲染目标。
- 修复了在基材与父材质的基材不一致时修改参数导致的崩溃,现在会自动使用父材质的基材以避免错误。
- 修复了在重新加载世界时 ObjectMeshStatic 的内存泄漏。
- 修复了插件初始化期间创建窗口时,可能使用未初始化资源导致的崩溃问题。
- 修复了导入包含空表面的 USD 资源后在预览渲染时引发的崩溃(仅 Vulkan)。
- 修复了在启用
render_show_textures = 1
时保存世界引起的崩溃。 - 修复了在创建 Skinned Mesh 对象但未命名表面时的崩溃。
- 修复了在物理事件回调中使用 setWorldPosition() 移动物体时的崩溃。
- 修复了在烘焙时引用了丢失目标纹理(无效目标纹理的 GUID)导致的问题。
- 修复了对静态网格进行 Bound Scale 修改后调整表面尺寸引发的崩溃。
- 修复了使用 Geodetic Pivot 时基于遮罩的对象放置出现位置偏移的问题。
- 修复了 Modal 模式窗口的行为。该模式现在仅适用于独立窗口,无法与其他窗口 dock,也无法创建窗口组。全屏模式下不支持切换模态属性,全屏后将清除模态关联。
- 修复了清除 Grass 和 Clutters(World 和 Mesh)相交数据时的崩溃。
- 修复了 Vulkan 下 Landscape Layer Map 使用有损压缩算法的问题。
- 修复了在修改 World Light 的 Shadow Cascade 参数时发生的崩溃。
- 修复了在 data 文件夹中存在同名子目录 data 时导致的崩溃。
- 修复了带有 Always Update 标记的节点复制逻辑,原逻辑可能导致崩溃。
- 修复了水面剔除逻辑,当 Water Visibility Distance 与相机的 Far Clipping 参数组合不当时,水面可能被错误剔除。
- 修复了 Vulkan 下在启用 Selected Surface TBN 可视化器时选择多个多表面对象导致的崩溃。
- 改进了水体渲染顺序,解决了多个问题和视觉伪影(如快速移动相机时的矩形伪影、首帧黑色对象等)。
- 修复了 Linux 下的 GPU 检测问题,解决了在多个 X Server 上同时运行两个引擎实例(使用相同 GPU)时的错误。
- 修复了在 Landscape Paint Mode 中编辑地形时的崩溃。
- 新增支持通过 API 与 UnigineEditor 对 Landscape Layer Map 的高度图纹理进行压缩(详见 API Migration Guide)。
- 修复了加载超大 16K EXR 图像时的崩溃问题,同时修复了 16K 纹理缩略图生成异常。
- 修复了 Omni 光源的 Near Attenuation 参数被其 Near Attenuation Gradient Length 参数意外覆盖的问题。
- 修复了加载 Node Layer(包含单个 Node Reference)时因递归加载导致堆栈溢出的问题。
- 修复了 Bound Scale 参数修改后未正确重置,导致值残留的问题。
- 新增对 OpenXR 1.1.47 的支持。
UnigineEditor
搜索体验优化
试想一下你正在创建和编辑一个真实超大城市的数字孪生 —— 数百万个对象、复杂的层级结构、无数参数。即便结构清晰,在编辑器中查找对象也会变得极具挑战。如果没有 World Nodes Hierarchy(世界节点层级) 中的搜索功能,几乎每位美术每天都要因此苦恼多次。但除了对象本身,参数结构复杂、菜单繁多(如 Render Debug)同样会让定位所需内容变得困难。
在 UnigineEditor 2.20 中,我们大幅提升了搜索体验,现已覆盖 上下文菜单、参数面板(Parameters)以及类似 Helpers 或 Rendering Debug 等下拉菜单中的 ComboBox。当菜单项超过五个时将自动显示搜索框,帮助你快速定位目标内容。
搜索结果现在更加智能直观:你可以使用完整名称、部分名称、缩写,或多个单词首字组合进行搜索,不区分大小写。
菜单中的子项将与其对应的父分组名称一起显示,便于理解层级关系。
在 参数(Parameters) 标签页中,匹配项将被高亮显示,其余项则变暗但仍可交互。匹配的下拉选项会用绿色虚线描边,便于快速定位。
更快的阴影烘焙
在拥有大量光源的大型复杂场景中,烘焙光照是一个非常耗时的过程。每次移动光源或修改其参数后都必须重新烘焙,极大地消耗了宝贵的开发时间。
本版本中我们大幅加快了阴影烘焙的速度,尤其在处理大量光源阴影缓存时效果显著。此次加速涵盖了初始烘焙过程及后续深度纹理的更新。
在一个拥有上千个光源的密集城市场景中进行测试,结果显示:初次烘焙速度提升达 7.5 倍,后续重新烘焙过程更是达到了 17 倍 的加速。
属性界面优化
在模拟真实场景时,通常会涉及复杂的逻辑和大量可调参数,这些都存储在 Property(属性) 文件中。随着属性文件变得越来越庞大与复杂,加载和编辑也可能变得沉重。
我们对此进行了显著优化,大幅提升属性加载速度,在大型文件上最高可达 5 倍 加速。同时确保交互过程无界面卡顿,让你的工作流程更加流畅、高效、不中断。
物理形状与关节的 UI 改进
用于配置物理 形状(Shapes) 和 关节(Joints) 的界面现已重新设计,与 表面(Surfaces) 列表保持一致风格,使其更加直观、易用。
界面支持快速导航与复制/粘贴功能,大幅简化了复杂物理结构的管理流程,提升了整体编辑效率。
材质图编辑器多项更新
材质图编辑器(Material Graph Editor)迎来了大量更新与易用性改进,整体更加稳定、便捷,无论是对日常操作的细节打磨,还是对结构复杂、参数众多的大型图的管理流程都进行了优化。
现在你可以直接通过 Create(创建)菜单添加参数,这对于具有复杂参数层级的材质尤其实用,极大提升了编辑效率。
当你在参数列表中选择某个参数时,材质图中对应的节点也会被高亮显示,帮助你快速聚焦目标,轻松定位所需节点。
在构建复杂材质图时,最节省时间的一项新功能是:你现在可以使用 Ctrl+Shift+D 复制节点并保留其所有连接。如果你只想复制节点本身而不保留连接,使用 Ctrl+D 即可。
其他改进还包括:
- 现在你可以通过 Create(创建)菜单,根据名称直接添加已有的 Portal(门户)对象。
- 对于每个参数,你现在可以设置一个条件(Activity Condition),用于控制该参数的激活状态,从而实现灵活的条件结构 —— 例如根据用户选择的选项显示或隐藏特定参数,使材质逻辑更加智能且易于管理。
- 将纹理拖入材质图时,系统将自动添加一个 Texture 节点,并同时创建对应的采样器节点 SampleTexture,无需手动配置,大大提升操作效率。
- 你现在可以通过拖动连接器,将边重新连接到其他输入端口,实现更快捷、直观的连接调整操作。
- 现在可以同时断开多个选中节点的连接,提升批量编辑效率。
- 修复了在 WidgetEditText 中使用 Ctrl + Backspace 删除单词时可能引发的崩溃问题,尤其是在材质编辑器中出现频繁。
- 修复了向材质图中添加包含无效 Texture 节点的子图时的崩溃问题。
- 在更改材质参数类型时,系统现在会保留其当前值,或在可能的情况下自动转换为新类型,避免数据丢失。
- 新增图形化材质选项 Bound Mode,允许通过设置 Min 与 Max 点的方式,自定义对象使用该材质时的包围体扩展逻辑。
Tracker 更新
在对动画系统进行全面重构的同时,我们也对当前使用的 Tracker 工具进行了更新,修复了多个问题,以保持其功能的稳定性与可靠性。以下是具体修复内容:
- Tracker 现在能正确显示所有已存储的参数。如果目标节点、材质或属性缺失或被删除,该参数将以红色高亮显示,同时轨道仍可正常加载且不会报错。
- 错误日志输出变得更简洁明了。
- 修复了节点删除处理问题:在循环播放时,如果轨道中包含该节点的 Enabled 参数,会导致节点在视口中仍然可见的问题。
- 修复了双击操控器平面调整节点位置时发生的崩溃。
- Select Node(选择节点)按钮现在可正确用于轨道操作。
- Tracker 中的节点图标已更新,与编辑器中保持一致的视觉风格。
- 修复了取消选择节点后,选中可视化器仍处于激活状态的问题。
- Node Reference 相关改进:
- 轨道文件现在可正确存储用于修改 Node Reference 内容的参数。
- 编辑并应用 Node Reference 参数不再导致异常行为。
- 修复了处理由其他节点类型转换而来的 Node Reference 时出现的问题(非原始创建的 Node Reference)。
- 在 Tracker 中选择 Node Reference 时,其内容现在能如预期显示。
UnigineEditor 其他改进
- UnigineEditor 的窗口布局现在在每次更改后都会自动保存,因此在意外关闭或崩溃后无需重新排列布局。同时也修复了布局重置相关的问题。
- 修复了在为 RagDoll 体创建或加载骨骼层级时,在原点 (0,0,0) 处生成额外刚体和碰撞形状副本的问题。
- 修复了更改 C# 脚本文件后重新加载属性文件的问题,该问题有时会导致对父类做出的修改未能正确更新组件。
- 修复了某些情况下,在打开 Settings 窗口时加载世界场景导致的崩溃。
- 修复了点击 Refresh 按钮刷新 Content Profiler 时发生的崩溃。
- 修复了在锁定的 Parameters 窗口中选中碰撞形状后将其删除时的崩溃问题。
- 修复了在使用笔刷绘制打开编辑的 Mesh Cluster 时的崩溃问题,现在会弹出提示要求用户先保存更改。
- 动画预览中现在支持坐标轴可视化。
- 修复了克隆 Node Reference 时,有些情况下会重置存储节点路径的属性参数的问题。
- 修复了在 Impostors Creator 工具中烘焙植被法线贴图和半透明贴图时出现的问题。
- 修复了在保存场景时移除通过绝对路径分配给节点的属性和材质的问题。强烈建议避免使用绝对路径,应优先使用资产引用(GUID),避免因文件重命名或移动导致引用失效。
- 改进了缩略图生成流程,修复了多个问题并避免崩溃。
- 修复了在选择了 'Center' 作为枢轴点时视口无法聚焦选中节点的问题。
- 修复了导入纹理(嵌入到 FBX 文件中)及解压 NPOT 纹理过程中的若干问题。
- Randomizer 工具在点击 Replace 后不再更改 World Nodes 层级中的节点顺序。
- 修复了 DPI 缩放相关的问题,导致启动后无法在第二屏幕上打开编辑器,仅有系统托盘图标和后台进程可见的问题,同时修复了主副屏 DPI 缩放设置不同的情况。
- 修复了当另一个 Node Reference 处于编辑状态时,当前 Node Reference 的右键菜单中 Edit 选项变灰的问题。
- 修复了将选中场景几何层级导出为 .mesh 文件时有时发生的崩溃。
- 修复了在重新导入 FBX 模型后光照贴图应用不正确的问题。
- 修复了在 Texture Paint Mode 模式下将可笔刷编辑对象拖入 Asset Browser 创建 Node Reference 时发生的崩溃。
- 修复了重新加载文件系统后重新加载场景时的崩溃问题。
- 修复了在通过 Asset Browser 导入包含贴图的 USD 场景时发生的崩溃问题。
- 修复了生成材质预览时引起性能波动的问题。
- 修复了在 Cleaner 工具中刷新 Similar Assets 列表时的崩溃。
- 导入立方体贴图时,现在将其统一为单一贴图面尺寸(不再区分 Width 与 Height),避免因尺寸错误导致崩溃。
- 迁移至 2.20 版本时将自动修复非原生贴图格式(如 .tga, .png 等)运行时链接错误的问题,解决了无法为高分辨率贴图使用 mipmaps 的问题。
- 移除了在光照烘焙过程中为 Environment Probes 在 Realtime Update 模式下不必要的贴图重新烘焙操作。
- 修复了在 World Nodes 层级窗口中选中某对象时重新导入 *.upackage 文件导致的崩溃。
- 修复了还原属性中 Curve 参数更改时发生的崩溃。
- 修复了当材质或属性搜索无结果或更改搜索过滤器时,导致 Parameters 窗口中当前选择被重置的问题。
- 包含数字的材质与属性名称现在可在层级中正确排序。
- 修复了 Mount 过滤器与编辑器过滤器同步逻辑,避免错误读取应排除的文件,消除控制台中相关的错误日志刷屏。
- 修复了 Video Grabber 工具忽略 warmup 设置的问题。世界预览缩略图现在也会保存为包含正确 warmup 的版本。
- 修复了 2.19.1.2 版本中引入的 UV 展开错误问题。FBX 导入设置中新增了一个兼容选项 Unwrap UV Version,用于项目升级时修复 UV 展开数据:如果在 2.19.1.2 中执行了 UV 展开和光照贴图重新烘焙请选择 Xatlas V1,否则(光照贴图最后一次烘焙发生在 2.19.1.2 之前)请选择 Xatlas V0。
- 修复了导入切线空间数据时的问题。
Sandworm
Sandworm 工具持续成熟,伴随着大量优化和 Bug 修复。这些优化大幅降低了整体生成时间:对于 LandscapeTerrain 输出最高可减少 35%,对于 Global Terrain 输出最高可减少 10%(以 90GB 大型源数据在以下硬件配置上测试得出:AMD Ryzen 9 7950X,128 GB 内存,4070 TI Super 显卡,SSD 870 EVO 4TB)。
最显著的一些改进包括:
- 更具信息量的进度条(显示已下载的 TMS 数据百分比)
- 改进的缓存系统:
- 现在内存占用更少(从 100+ GB 降至最高 14 GB)。
- 每个缓存元素的 ID 计算已优化。
- 在意外关闭情况下更加稳定。
- 在某些场景下减少了需要下载的瓦片数量。
- 修复了植被层在远离原点时与植被遮罩错位的问题。
- 修复了数据不可用的图层未出现在 Sources 列表中的 Bug。
- 修复了与手动删除节点后重新生成相关的多个 Bug。
SpiderVision
- 改进了曲线渲染:通过 SpiderVision 渲染时原本笔直的线条如今显示得更加平滑。
- 改进了对 EasyBlend 数据的解析。
- 提升了整体稳定性,包括一些小的 UI 修复。
IG 更新
我们持续增强高层图像生成器(High-Level Image Generator, IG),以下是本次的主要改进:
- 现已支持 RateCtrl 和 TrajectoryDefinition CIGI 数据包。
- 可为 CIGI 组件设置 Mask 类型参数。
- 新增了覆盖昼夜时间控制的功能。
- 插值缓冲区现在支持手动调整大小。
- 修复了通过 CIGI Destroyed State 删除实体时的问题。
- 修复了在偏移位置时 ArticulatedPart 的旋转被重置的问题。
- 修复了 ParticlesWind 和风向袋中风向计算不正确的问题。
示例与模板
理解一个 3D 引擎不仅仅是阅读文档,更是通过实际演示来掌握其工作方式。因此,在已有的大量内容示例基础上,我们进一步扩展了 SDK,加入了涵盖引擎关键功能的新 API 示例,支持 C++、C# 和 UnigineScript,让你以动手实践的方式深入理解工作流程、效果和系统。
但我们不仅仅在数量上做出了提升。我们还对示例库进行了彻底重构,使其结构更加清晰直观。每个示例现在都配有明确的描述,无论是在 SDK 浏览器中还是在全新改进的运行时示例浏览器(Runtime Samples Browser)中都可查看。后者还新增了就地搜索功能,让你可以更快速、更高效地找到所需内容——无论你是在研究渲染流程、物理效果、声音处理还是性能优化。
为了方便使用,我们已将所有 C++ 和 C# 组件 示例,以及 Photon 和 Dear ImGui 集成示例上传至 GitHub。你可以访问以下仓库:
- github.com/unigine-engine/cpp-api-samples
- github.com/unigine-engine/csharp-component-samples
- github.com/unigine-engine/unigine-photon-cpp-integration-sample
- github.com/unigine-engine/unigine-photon-csharp-integration-sample
- github.com/unigine-engine/unigine-imgui-cpp-integration-sample
- github.com/unigine-engine/unigine-imgui-csharp-integration-sample
以下示例已添加至 C++ 示例 套件中:
- Fire Hose 一个基础的消防模拟示例,展示了可控水枪进行灭火的交互逻辑。
- Dynamic Field Height 使用 C++ API 创建动态 Height Field,通过正弦函数生成动态纹理。
- Player Persecutor 使用 PlayerDummy 创建自定义的目标追踪摄像机,复刻 PlayerPersecutor 的逻辑,并提供可调偏移、碰撞处理和多种跟随模式。
- Visualizer 演示 Visualizer 类提供的完整功能,用于视觉调试。
- Update Physics 展示在 update() 和 updatePhysics() 方法中实现基于物理的移动的差异。
- Day-Night Switching 实现自动昼夜循环系统,并根据时间切换光源和材质。
- Camera Zoom 创建具有可调缩放和平滑聚焦功能的交互式摄像机系统,可聚焦场景中可选目标。
- IFps Usage 使用 Game::getIFps() 实现与帧率无关的运动逻辑。
- Spectator Controller 实现可自定义的第一人称观察摄像机,支持可配置移动方式和物理碰撞检测。
- Observer Controller 实现自由飞行摄像机,功能类似于 UnigineEditor(支持缩放、平移、聚焦和速度控制)。
- Mount Points 在文件系统中创建并使用挂载点以访问外部文件夹和包文件(例如 *.zip, *.ung)。
- Ray Intersection 使用射线投射实现基于遮罩的选择性交集检测。
- Bound Intersection 检测特定体积(视锥、球体、盒子)与节点包围盒之间的交集。
- BodyFracture Explosion 模拟径向爆炸,触发 BodyFracture 开裂,并对碎片施加力。
- BodyFracture Falling Spheres 使用 BodyFracture 类实现的持续下落物体在碰撞后碎裂的效果。
- BodyFracture Shooting Gallery 使用 BodyFracture 对象实现基础的物理驱动射击场景。
- Microprofiler 使用 Microprofile 高级 CPU/GPU 分析器跟踪性能,并评估各段代码的耗时。
- Boids 模拟并控制不同类型实体的聚群行为(Boids 算法)。
- Events 展示通过 C++ API 订阅 UNIGINE 事件的四种不同模式,突出说明事件处理器生命周期和管理方式如何因方法不同而异。
- Events Advanced 展示在 UNIGINE 中订阅事件的高级方式:使用额外参数、省略某些参数、以及存储连接句柄以便后续断开连接。
- JSON 使用 C++ 生成结构化 JSON 文档,包含对象、数组以及各种数据类型(如字符串、数字、布尔值和 null),随后进行遍历并以格式化方式输出。
- UDP Sockets 使用套接字 API 在网络中两个节点间发送和接收 UDP 消息。
- TCP Sockets 建立并管理 TCP 套接字连接,在服务器和多个客户端(每个客户端为一个 UNIGINE 应用)之间进行通信。
以下示例已添加到 C# 示例套件中:
- Visualizer
- IFps Usage
- Update Physics
- Day-Night Switching
- Camera Zoom
- Spectator Controller
- Observer Controller
- Body Fracture Explosion
- Body Fracture Falling Spheres
- Body Fracture Shooting Gallery
- Microprofiler
- Events Advanced
- GUI to Texture
- Abstract Components
文档
新增一系列超短的 HowTo 快速技巧视频,提供英文、中文和俄文版本:
- 更新了 VR 入门 文章。
- 更新了关于 C++ 和 C# VR 模板的文章。
- 新增 手部追踪 文章。
- 更新了 Editor API 参考文档。
- 新增 DPI 缩放 文章。
- 新增关于 程序化网格修改流程 的信息。
- API 参考中新增一系列 多线程相关类,AsyncQueue 文章也已更新,介绍了跨多线程任务系统和 CPU 着色器计算卸载的组织方法。
- 更新了 线程安全 文章。
- 更新了 性能分析器 文章。
- 新增 C# 接口与抽象类 文章。
- 新增 GaussianSplatting 插件 文章。
- 更新了 Impostors 生成 文章及相关内容。
- 新增 编辑器内搜索系统 文章。
- 更新了 项目构建工具 和 打包工具 相关文章。
- 更新了 Property 和 Mesh 文件 格式文章。
- 补充了 SDK 样例 的信息与说明。
- UNIGINE 免费学习课程现已提供 中文 版本。
- 在 材质图节点参考 中新增更多说明与示例。
- 完整的 API 变更列表可在 API 迁移指南 中查看。
- 完整的控制台命令变更列表可在 控制台迁移指南 中查看。
感谢您的阅读,不要错过更新,因为我们一直在努力使UNIGINE更加伟大!
UNIGINE团队