Toca Boca 如何构建高性能、可扩展的渲染后端

BERTRAND GUAY-PAQUET / TOCA BOCASenior Graphics Engineer
Mar 20, 2026
Toca Boca
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

为了满足我们雄心勃勃的移动 3D 多人游戏对性能的要求, Toca Boca Days – 尤其是在低端设备上 – 我们需要进行创新。该游戏(目前处于休眠状态)拥有广阔的关卡,最多可支持32名玩家,并且具有高度可定制的头像。

2022 年底,我们推出了基于 Unity 的批处理渲染器后端系统 批次渲染器组 API.该新系统带来了显著的性能提升,我们一直在不断改进。

在本文中,我将分享该系统架构的见解,因为我们准备在即将推出的游戏中使用它。

数据架构概述

从高层次上讲,我们的系统将 GameObject 及其渲染器组件的数据分为三层。

分层数据架构
分层数据架构

第一层中,每个渲染器组件对应一个单一的剔除分层。该层包含根据摄像机的剔除平面、层遮罩和任何父LOD组来确定可见性所需的所有数据。

第二层表示每个渲染器的材质,每个渲染器-材质对形成一个绘制分层。绘制分层存储渲染相关数据,例如网格和材质。

第三层由以下内容组成: BatchRendererGroup 批处理(因此得名 Batch Renderer)及其实例。每个批次都有自己的 GraphicsBuffer 包含内置的每个分层属性,例如 ObjectToWorld 矩阵,以及可选的每个分层材质属性集。

渲染器的每个实例材质属性集决定了其批处理类型。

Toca Boca Days | Toca Boca
许多具有每个实例材质属性值值的书籍

我们的系统将所有CPU端数据存储在紧凑的数据导向结构的数组(SoA)布局中。它尽可能依赖于原生容器中的可快速绘制类型,从而能够为实例剔除和绘制命令生成等任务使用高性能的 Burst 任务。这种架构使系统能够高效地处理大量实例。

每个实例的材质属性

要为渲染器 分层 材质属性,我们需要添加一个引用“属性集”的组件ScriptableObject 资产。属性集的数量应有限制,因为每个属性集都定义了一种单独的批处理类型 – 不同批处理实例不会一起渲染。

为了更方便地编写,我们提供了一个组件来设置初始分层属性值,以及一个自定义的检视面板。如果没有每个分层的属性,这些值就需要设置在独特的材质上,这会降低批处理效率。

分层材质属性检视面板
分层材质属性检视面板

蒙皮和骨骼

Toca Boca Days,头像具有广泛的 角色定制化 。为了支持各种服装和配件,我们将每个头像网格的带蒙皮部分拆分为17个带蒙皮的网格渲染器组件(例如,左上臂)。大多数服装项目都会添加额外的带蒙皮的渲染器组件,随着玩家数量的增加,这些组件会迅速累积。

Toca Boca Days | Toca Boca
Toca Boca Days头像

由于我们的头像很复杂,我们避免将它们用于阴影贴图,这会很昂贵。相反,我们使用类似斑块的阴影,在大多数情况下,虚拟形象每帧只渲染一次。这意味着我们无法将 Unity 的内置顶点蒙皮成本摊销到多个绘制命令中,用于单个网格。

我们直接在顶点着色器中处理蒙皮。所有蒙皮矩阵都存储在一个全局的 GraphicsBuffer中,每个渲染器都从这个缓冲区中接收一个偏移量,以调整每个顶点骨骼索引并获取其对应的蒙皮矩阵。

骨骼偏移存储为 BatchRendererGroup 分层数据,使用户能够将共享相同网格的角色的绘制调用进行批处理(例如,将所有右上臂一起处理),从而提高性能。

计算蒙皮矩阵通常需要渲染器数量 × 每个渲染器的平均骨骼数量的计算。为了减少这种情况,我们结合了两种策略:

确保头像中的所有带蒙皮的渲染器组件使用一致的骨骼索引 - 例如,骨骼索引 2 始终指的是胸部,即使是右脚渲染器没有引用它。

预处理网格以识别唯一的一组骨骼索引和绑定姿势矩阵,理想情况下,每个头像只生成一组。

骨骼装配预处理器组件
骨骼装配预处理器组件

通过这种方法,我们可以将所有虚拟角色的带蒙皮的网格渲染器组件的蒙皮操作合并为一个“动画骨骼”和“渲染器骨骼”对。

动画和渲染器骨骼(显示两个渲染器骨骼)
动画和渲染器骨骼(显示两个渲染器骨骼)

在每一帧中,我们的骨骼管理器执行以下步骤:

动画提取:动画任务通过动画骨架从当前骨骼变换中提取信息 可操作对象 API (Mecanim).

姿态计算:Burst 任务从骨骼层次结构和提取的变换中生成动画姿态矩阵。

蒙皮矩阵装配:Burst 任务将动画姿态和绑定姿态矩阵合并为蒙皮矩阵。

GPU 上传:新的蒙皮矩阵已上传到全局 GraphicsBuffer 使用计算着色器。

这个过程复杂但效率很高,裸体角色的蒙皮矩阵减少了 2 倍,穿衣角色的蒙皮矩阵减少了 4 倍甚至更多。

展望未来

为 Unity 开发自定义渲染后端 Toca Boca Days 并将其现代化以适应 Unity 6.3,证明是值得的。从Unity 2022.3升级的过程很顺利,我们的批处理渲染器系统继续为具有广泛角色定制化和每个分层材质属性的游戏提供强大的性能。

通过 BatchRendererGroup API 完全控制绘制命令的生成,可以实现定制化的剔除策略(如遮挡门户和自定义遮挡剔除)和动画优化,例如根据摄像机的接近程度和重要性来限制蒙皮矩阵的更新。

Unity的可扩展性,加上开箱即用的高性能解决方案(如通用渲染管线(URP)和GPU Resident Drawer(带源访问)),使我们能够在保持高度优化的自定义渲染管线的同时,实现性能目标。

Toca Boca Days | Toca Boca
批处理渲染器将回归

Toca Boca 正在开发一款尚未公布的游戏;关注该工作室的 Instagram, TikTokYouTube 以获取最新消息。在我们的平台上,探索更多来自 Unity 移动游戏开发者的故事 移动解决方案页面 以及我们的 资源中心.