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

资讯详情

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

Unity DOTS 精灵渲染 NSprites 瘦身终极技巧:用 NSPRITES_* 编译定义精准禁用更新模式

Unity DOTS 精灵渲染 NSprites 瘦身终极技巧:用 NSPRITES_* 编译定义精准禁用更新模式 Unity DOTS 精灵渲染 NSprites 瘦身终极技巧用 NSPRITES_* 编译定义精准禁用更新模式【免费下载链接】NSpritesUnity DOTS Sprite Rendering Package项目地址: https://gitcode.com/gh_mirrors/ns/NSpritesNSprites 是一款面向 Unity DOTSEntities的精灵渲染包通过 GPU 实例化 ComputeBuffer 把成千上万个精灵实体压缩成单次 DrawCall。但它的属性同步系统内置了 Reactive、Static、EachUpdate 三种更新模式——用不上的模式会继续参与编译和数据同步。本文教你用NSPRITES_*编译定义把这些死重量一次性裁掉 三种属性更新模式先搞清楚区别NSprites 把每个参与渲染的实体组件如位置、颜色称为InstancedProperty并允许你通过 PropertyUpdateMode.cs 中的枚举指定它的数据何时同步到 GPU模式更新时机内存布局适用场景Reactive仅数据变化 / 实体创建销毁时按 Chunk 排布需经_propertyPointers索引读取大多数属性默认模式Static只在实体创建/销毁时按 Chunk 排布初始化后永不改变的数据EachUpdate每帧都更新按实体排布shader 里直接用 instanceID 访问持续动画、旋转、脉动三种模式各有独立的同步 Job、Chunk 映射逻辑和缓冲分配代码全部写在 InstancedProperty.cs 与 RenderArchetype.cs 里。项目若只用其中一种其余代码就是纯开销。NSPRITES_* 编译定义一览NSprites 在源码中用条件编译#if把三种模式的实现切成了独立的代码段只需在Player Settings → Scripting Define Symbols中定义对应符号编译器就会把用不到的整段代码排除编译定义效果NSPRITES_REACTIVE_DISABLE移除 Reactive 模式的全部同步/映射代码NSPRITES_STATIC_DISABLE移除 Static 模式的全部同步/映射代码NSPRITES_EACH_UPDATE_DISABLE移除 EachUpdate 模式的全部同步/映射代码 被禁用的模式不会导致报错注册时会被自动降级到仍启用的模式见 NSprites.cs 中的GetActualMode禁了 Reactive → 降级为 EachUpdate若启用否则 Static禁了 Static → 降级为 Reactive若启用否则 EachUpdate禁了 EachUpdate → 降级为 Reactive若启用否则 Static快速上手3 步完成瘦身盘点项目搜索你代码里RegisterRender/InstancedPropertyComponent用到的PropertyUpdateMode确认实际使用了几种模式添加定义在 Unity 的Edit → Project Settings → Player → Scripting Define Symbols中加入需要禁用的定义例如NSPRITES_STATIC_DISABLE;NSPRITES_EACH_UPDATE_DISABLE重建验证重新编译后未使用模式的同步 Job如 MapChunkJobs.cs 中的按 Chunk 映射、SyncDataJobs.cs 中的分块同步将不再参与构建⚠️ 切记三个定义不能同时全开。SpriteRenderingSystem在创建时就会抛出异常提醒你至少要保留一种模式参见 SpriteRenderingSystem.cs常见项目配置推荐静态 2D 场景/棋盘类只把实体位置注册为 Static → 定义NSPRITES_REACTIVE_DISABLE;NSPRITES_EACH_UPDATE_DISABLE粒子式特效属性每帧变化 → 只留 EachUpdate定义NSPRITES_REACTIVE_DISABLE;NSPRITES_STATIC_DISABLE常规动态场景只留默认 Reactive定义NSPRITES_STATIC_DISABLE;NSPRITES_EACH_UPDATE_DISABLE两个容易踩的坑 ️1. Shader 侧的联动Reactive/Static 模式的数据是按 Chunk 排布的shader 必须声明StructuredBufferint _propertyPointers并通过它索引真实数据而 EachUpdate 是每实体连续排布直接按SV_InstanceID取值即可。禁用 Reactive 后如果仍有属性降级为 EachUpdate记得让 shader 走直接索引的读取分支。2. 组件缺少的兜底行为未带属性组件的 Chunk 默认会被跳过若希望它们填充默认值可额外定义NSPRITES_PROPERTY_FALLBACK_ENABLE见 RenderArchetypeStorage.cs 的说明注释与 SyncDataJobs.cs。另外注意编辑器非 Play 模式下 Static 属性会被当作 Reactive 处理以便编辑期渲染这是 NSprites.cs 中的有意设计不影响运行时瘦身效果。小结NSPRITES_REACTIVE_DISABLE、NSPRITES_STATIC_DISABLE、NSPRITES_EACH_UPDATE_DISABLE三个编译定义是 NSprites 提供的精准裁剪开关按项目实际使用的更新模式保留 1 种、禁用其余 2 种即可让渲染系统在编译期就甩掉冗余的同步与映射逻辑。配合按 Chunk 的亚缓冲更新SubUpdates机制你的 DOTS 精灵渲染管线会更轻、更快 相关源码PropertyUpdateMode.cs、RenderArchetype.cs、NSprites.cs【免费下载链接】NSpritesUnity DOTS Sprite Rendering Package项目地址: https://gitcode.com/gh_mirrors/ns/NSprites创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表