尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

NSprites源码深潜(上):SpriteRenderingSystem如何驱动每帧精灵渲染

NSprites源码深潜(上):SpriteRenderingSystem如何驱动每帧精灵渲染 NSprites源码深潜上SpriteRenderingSystem如何驱动每帧精灵渲染【免费下载链接】NSpritesUnity DOTS Sprite Rendering Package项目地址: https://gitcode.com/gh_mirrors/ns/NSpritesNSprites 是一款基于 Unity DOTSECS的精灵渲染开源包其核心系统 SpriteRenderingSystem 每帧把实体组件数据同步进 GPU 计算缓冲区再通过 GPU Instancing 以单次 DrawCall 画出海量精灵。本文带你读懂它完整的每帧渲染驱动流程。1分钟认识 NSpritesDOTS 精灵渲染包在做什么 先看 package.json 的一句话定位Uses GPU instancing with compute buffers to draw entities as sprites—— 用 GPU 实例化 ComputeBuffer 把 ECS 实体画成精灵。运行要求Unity 2022.2 与 Entities 包图形 API 兼容性详见 README.md 中的表格核心收益所有共用同一材质的实体每帧合并为一次 DrawCall轻松渲染数万精灵适用场景2D 大地图、粒子海、单位密集的 RTS / 策略类游戏每帧总指挥SpriteRenderingSystem 的四步流程打开 Systems/SpriteRenderingSystem.cs这是整个包唯一对外的每帧入口它挂在PresentationSystemGroup呈现组编辑器与运行时均会执行[WorldSystemFilter(Default | Editor)]。它的OnUpdate只做四件事取存档—— 从单例 RenderArchetypeStorage 取出所有已注册的渲染原型列表装配数据—— 把实体查询、上一版系统版本号、组件类型句柄打包成SystemData作为 Job 依赖输入调度更新—— 对每个渲染原型调用ScheduleUpdate把组件数据并行同步进 ComputeBuffer收尾绘制—— 逐个调用CompleteAndDraw先强制完成全部同步任务再提交 GPU 绘制 第 4 步是理解本系统的关键数据同步是异步调度 帧内强制完成既享受了 Job 系统的并行收益又保证本帧 Draw 前数据一定就绪。三种更新模式按需同步省下多少 CPUPropertyUpdateMode.cs 定义了数据同步策略这是 NSprites 性能的核心开关更新模式同步时机数据布局典型用途Reactive默认数据变化 / 实体增删时按 Chunk 布局位置、颜色等高频变化数据EachUpdate每帧都同步按实体布局必须逐帧刷新的数据Static仅实体创建 / 销毁时按 Chunk 布局初始化后不再变化的数据⚡ Reactive 模式下SyncDataJobs.cs 里的SyncPropertyByChangedChunkJob会先用系统版本号做脏检查Chunk 没变、实体顺序没变直接跳过。这正是按需同步省 CPU 的原理——静止的精灵几乎零开销。从组件到 GPU一条精灵数据的旅行 一个实体组件值最终变成 GPU 顶点要经过 4 站归批实体携带 SpriteRenderID 共享组件SCD同 ID 实体天然聚成同一渲染批次映射槽位PropertyPointer 与 PropertyPointerChunk 记录实体 → 缓冲区下标映射工作由 MapChunkJobs.cs 中的 Burst Job 完成写缓冲InstancedProperty 为每个着色器属性持有一个 ComputeBufferJob 把组件字节拷贝进去再绑定到 MaterialPropertyBlock一次性绘制RenderArchetype 的Draw方法用Graphics.RenderMeshPrimitives按实体数量实例化绘制一批精灵一次提交源码文件地图建议按这个顺序读入口系统Systems/SpriteRenderingSystem.cs批次与容量管理Common/RenderArchetype.cs、Components/RenderArchetypeStorage.cs缓冲同步Common/InstancedProperty.cs、Jobs/SyncDataJobs.cs每帧容器复用NativeCounter.cs、ReusableNativeList.cs —— 持久化复用 Native 容器避免每帧分配单元测试Tests/PropertyContainerTests.cs小结NSprites 每帧渲染的三个设计要点批次合并SCD 共享组件把同类实体聚在一起一批一次 DrawCall按需同步Reactive 模式 版本号脏检查数据不变就不写缓冲容量自管理ComputeBuffer 超限时自动扩容不低于minCapacityStep步长避免频繁重分配 下期预告深入 MapChunkJobs 与 SyncDataJobs 的 Burst 并行实现看 NSprites 如何榨干多核 CPU。【免费下载链接】NSpritesUnity DOTS Sprite Rendering Package项目地址: https://gitcode.com/gh_mirrors/ns/NSprites创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表