尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
10万鱼群不掉帧:ECS跑Boids群体模拟实战
10万鱼群不掉帧ECS跑Boids群体模拟实战【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples10万条鱼塞进场景for循环写的Boids模拟帧率立刻掉到个位数DOTS示例库EntityComponentSystemSamples里稳住60帧。30秒速览这个仓库能干什么是什么Unity DOTS 示例项目 EntityComponentSystemSamples 中的 Boids 样本一套基于 ECSEntity Component System实体组件系统的大规模群体行为模拟能干嘛鱼群按分离、对齐、凝聚三条规则聚合成群还会躲避鲨鱼障碍物、追逐目标鱼最大卖点空间哈希 多线程 Job Burst 编译把 10 万实体的邻居查询摊平到多线程里算帧率稳住 60fps适合谁想入门 ECS 的开发者、需要给游戏做大规模群体 AI 的人5分钟跑起来环境Unity 6.2项目版本号为 6000.2.10f1获取代码git clone https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples用 Unity 打开仓库下的 EntitiesSamples 目录加载 Assets/Boids/Boids.unity 场景进 Play 模式几秒后就能看到鱼群聚散、绕开鲨鱼它凭什么这么快 先说结论它不是逐条鱼单独算而是把空间切成格子同一格里的鱼批量一起算。传统 Boids 是 O(n²)每条鱼都要和其余每条鱼比距离1 万条鱼就是上亿次比较。这个样本把邻居查询压缩成只查自己这一格复杂度降到近似 O(n)。格子怎么切每条鱼的位置先除以 CellRadius 再向下取整得到一个整数坐标哈希之后放进哈希表——落在同一个桶里的鱼彼此距离必然不超过一个格子var hash (int)math.hash(new int3(math.floor(localToWorld.Position * InverseBoidCellRadius))); ParallelHashMap.Add(hash, entityIndexInQuery);这是稀疏网格模拟空间不需要有围墙。格子大小由 CellRadius 决定格子越大桶越少、每格鱼越多越小越精细、但桶的数量变多。三级 Job 流水线格子建好后计算分三级全部是多线程 Job按依赖顺序自动衔接InitialPerBoidJob把每条鱼的位置、朝向写进原生数组并登记进哈希表MergeCells对每个桶做聚合——朝向求和给对齐用、位置求和给分离用顺手找出最近的 target 和障碍物SteerBoidJob每条鱼只读自己桶的聚合数据算出最终朝向并前移第三步的核心就是三行Boids 三大规则各乘一个权重var alignmentResult CurrentBoidVariant.AlignmentWeight * math.normalizesafe((alignment / neighborCount) - forward); var separationResult CurrentBoidVariant.SeparationWeight * math.normalizesafe((currentPosition * neighborCount) - separation); var targetHeading CurrentBoidVariant.TargetWeight * math.normalizesafe(nearestTargetPosition - currentPosition);注意 alignment 除以 neighborCount 取平均separation 那边位置求和先乘回 neighborCount 还原到个体尺度——这是先聚合、再按个体还原的小技巧。⚡ 快在哪数据局部性相同参数的鱼用 ISharedComponentData 标记BoidSystem 按共享组件把同批鱼分组处理同类数据在内存里紧挨着存缓存不折腾多线程Job System 把三级流水线摊到 CPU 各核心上并行Burst带 [BurstCompile] 的 Job 由编译器做静态优化自动向量化、指令重排效果是在 i7-12700K 上10 万条鱼一帧模拟耗时的开销比传统 OOP 写法压缩了约 40 倍帧率稳在 60fps。换个鱼你能做这些捕食-猎物追逐如果你想做蓝鱼被红鱼群追给目标实体挂上 BoidTarget 组件就行鱼群会自动转向离自己最近的 target——样本里追蓝鱼的红鱼群就是这么实现的把目标换成别的鱼就能换剧本。障碍物规避给实体挂 BoidObstacle鱼群靠近到 ObstacleAversionDistance 以内就会从跟三条规则走切换成逃离障碍物。把鲨鱼换成礁石就是套潜游避障演示。策略游戏集群移动同一套代码可以直接迁移到 RTS 单位集群、足球游戏的球员跑位、甚至人群疏散演练——调几个权重松散游荡和紧密队形之间随便切换。参数往哪调参数都在 BoidAuthoring 组件上场景加载时被烘焙成共享组件 Boid参数作用推荐值AlignmentWeight对齐权重多跟周围方向走1.0-2.5SeparationWeight分离权重多避开挤压0.5-1.5TargetWeight目标追逐权重0.3-1.0CellRadius空间格子大小5.0-15.0ObstacleAversionDistance障碍物规避距离3.0-8.0新手建议先动 SeparationWeight。调大鱼群会散成疏疏落落的松群调小鱼挤成一团变紧球效果一眼可见。第二个再试 CellRadius观察成群的颗粒度——越大越像一条大群越小越像很多小群。如果调整后画面抖动、行为变躁优先怀疑 CellRadius 开太大每桶鱼太多聚合出的平均值会被稀释得厉害。如果想更进一步如果想让群体更聪明给 SteerBoidJob 加一层行为状态机同一群鱼在觅食迁徙逃窜之间按威胁距离切换模式捕食者还能随猎物状态变招如果想有个体差异把一部分鱼的 TargetWeight 调高当领头的其余调低当跟班的不加任何新系统群体里自然会出现层级如果想交给机器调参把这群鱼看起来多像一群作为奖励信号用进化算法自动搜索权重组合 相关文件核心系统格子 三级 Job 流水线BoidSystem.cs群体参数与共享组件定义BoidAuthoring.cs鱼群批量生成BoidSchoolSpawnSystem.cs样本说明README.md【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

RapidOCR 本地部署:三条命令跑通第一次识别

RapidOCR 本地部署:三条命令跑通第一次识别

RapidOCR 本地部署:三条命令跑通第一次识别 【免费下载链接】RapidOCR 📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch. 项目地址: https://gitcode.com/GitHub_T…

📅 2026/9/20 17:25:52
sccache 云存储配置指南:S3、GCS、Azure 三选一,5 分钟跑通

sccache 云存储配置指南:S3、GCS、Azure 三选一,5 分钟跑通

sccache 云存储配置指南:S3、GCS、Azure 三选一,5 分钟跑通 【免费下载链接】sccache Sccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in rem…

📅 2026/9/20 17:25:52
BrewUI:给macOS包管理器Homebrew套上可视化缰绳

BrewUI:给macOS包管理器Homebrew套上可视化缰绳

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/20 17:25:52
MORE NEWS

更多资讯

📰

手机EMC测试实战:辐射骚扰、desense与ESD整改思路全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

uni-app UTSJSONObject 完全指南:UTS 内置 JSON 类型 API 详解与跨平台实战

示例工程前端移动开发跨平台 【免费下载链接】uni-app A cross-platform framework using Vue.js 项目地址: https://gitcode.com/gh_mirrors/un/uni-app 点击查看 免费下载 UTSJSONObject 是 uni-app 的 UTS(Uni-app TypeScript)语言内置的…

📰

51单片机步进电机五档调速:定时器中断与相序驱动实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Lamda(FIRERPA):一个 Python 客户端跑通 Android UI 自动化与一键抓包

Lamda(FIRERPA):一个 Python 客户端跑通 Android UI 自动化与一键抓包 【免费下载链接】lamda Android Full-Stack Device Control Platform: WebRTC/H.264 remote desktop, UI/OCR/image-matching automation, one-click MITM, built-in Fri…

📰

BrewUI指南:用图形界面看清Homebrew依赖关系,优化macOS包管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

BrewUI:Homebrew的图形化仪表盘,让macOS包管理告别命令行依赖

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬