新闻详情

新闻详情

首页 / 资讯中心 / 详情

一帧模拟上万条鱼:DOTS版Boids鱼群仿真的空间哈希与Job并行实现拆解

发布时间:2026/9/20 21:09:15来源:尧图网络
一帧模拟上万条鱼:DOTS版Boids鱼群仿真的空间哈希与Job并行实现拆解
一帧模拟上万条鱼DOTS版Boids鱼群仿真的空间哈希与Job并行实现拆解【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples实体一多帧率就崩这是做大规模群体模拟最先撞上的墙。EntityComponentSystemSamples 仓库里的 Boids 鱼群示例给出了一种纯 ECS 解法空间哈希网格加三层 Job 并行流水线把数万条鱼的群体行为压在一帧里算完全部逻辑装在一个BoidSystem.cs里。原理速览群游到底靠什么Boids 的核心其实只有几条规则每条个体只盯着邻居群体行为就自己涌现出来了概念一句话作用分离 Separation离得太近的邻居推开防止撞成一坨对齐 Alignment顺着邻居的平均朝向调整自己的方向凝聚 Cohesion往邻居的中心靠拢目标 / 障碍物本示例扩展追目标鱼、躲鲨鱼难点不在规则在规模每条鱼逐个找邻居就是 O(n²)。这个示例的三板斧——空间哈希定位邻居、按格子预聚合数据、Job 并行算行为——就是冲着把 O(n²) 打下来的。核心实现拆解数据怎么摆整群鱼塞进同一片连续内存OOP 里每条鱼一个对象指针满天飞缓存和并行都难受。这里把Boid定义为ISharedComponentData参数在 BoidAuthoring.cs 里配相同参数的一组鱼自动归成一个变体、连续存放。BoidSchoolSpawnSystem.cs 用EntityManager.Instantiate批量实例化鱼群再拿一个并行 Job 把初始位置随机撒到半径范围内。数据摆整齐了后面按变体遍历才能既省缓存又方便切分并行。空间怎么划让每条鱼只盯着自己的格子每条鱼按CellRadius把坐标量化成格子坐标再哈希进桶var hash (int)math.hash(new int3(math.floor(localToWorld.Position * InverseBoidCellRadius))); ParallelHashMap.Add(hash, entityIndexInQuery);同格子的鱼落在NativeParallelMultiHashMap的同一个桶里。找邻居从扫全世界变成翻自己这个桶平均复杂度从 O(n²) 降到 O(n)。邻居数据怎么省每格只聚合一次同格子的鱼共享朝向均值、位置均值没必要每条各算一遍。MergeCellsJob 把同哈希桶的数据合并cellCount[cellIndex] 1; cellAlignment[cellIndex] cellAlignment[cellIndex]; cellSeparation[cellIndex] cellSeparation[cellIndex]; cellIndices[index] cellIndex;顺手把每格离自己最近的目标和障碍物也记下来。之后每条鱼查一次数组就拿到整格聚合值个体级计算被压成几次向量运算。行为怎么算三个权重定方向SteerBoidJob里用共享权重把聚合值变成转向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);三向量加权求和后如果最近障碍物比ObstacleAversionDistance更近就整体替换成规避方向再回写LocalToWorld的位置与朝向。整个 Job 带[BurstCompile]由 Job System 切到多核跑鱼群规模上去时帧时间基本不涨。性能账本优化到底省在哪维度暴力 OOP 写法本示例做法邻居查询O(n²) 全量两两比较空间哈希平均 O(n)每帧行为计算主线程单核顺序执行Job System 多核并行 Burst 向量化数据布局对象指针分散按变体连续排布批量处理实体规模几百条就开始掉帧万级实体仍流畅仓库定位为大规模模拟示例未公布具体 FPS实测以 Profiler 为准迁移应用这套规则换个皮还能用在哪足球游戏球员跑位与阵型保持本质就是对齐邻居 各自追球策略游戏兵团集群移动用分离规则避免单位叠成一团应急演练建筑内人群疏散流分离加障碍物规避直接对应虚拟水族馆、动物园锦鲤池、鸟群的写实群体效果三步跑起来先收藏这几个关键文件BoidSystem.cs三层 Job 流水线主系统BoidAuthoring.cs全部六个参数的默认值BoidSchoolSpawnSystem.cs鱼群批量生成SampledAnimationClipPlaybackSystem.cs目标鱼与鲨鱼的轨迹动画README.md示例说明运行步骤克隆仓库git clone https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples用 Unity Hub 打开其中的EntitiesSamples项目打开场景EntitiesSamples/Assets/Boids/Boids.unity进 Play 模式鱼群生成后就能看到群体追逐红鱼、绕开鲨鱼运行时可以在 ECS 窗口里观察 Archetype 与实体数据验证变体批处理是否按预期生效。参数调优速查表默认值直接来自 BoidAuthoring.cs参数作用项目默认值CellRadius空间哈希格子半径决定邻居范围8.0SeparationWeight分离权重越大越排斥拥挤1.0AlignmentWeight对齐权重越大越容易排成同向鱼群1.0TargetWeight目标追逐权重越大越黏目标鱼2.0ObstacleAversionDistance障碍物触发规避的距离30.0MoveSpeed每条鱼的移动速度25.0调参手感CellRadius调大会让鱼近视变远视群更散但计算更省SeparationWeight拉高后鱼群瞬间散开压回 1.0 以下则容易出现密集巡游。把这份示例的提速拆开看其实是三件事数据连续摆放让 CPU 缓存不浪费Job 把计算切到多核空间哈希把要比对的量砍掉一个量级。想继续折腾的话可以加一套行为状态机觅食、迁徙、受惊三种模式切换给鱼区分出带头者和跟随者或者用强化学习自动搜上面那组权重。更多 ECS 入门与进阶内容在 官方文档目录 里。【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenTelemetry Go 多模块发布流程全解:从语义约定生成到 tag、Release 与示例验证 2026/9/20 22:33:29

OpenTelemetry Go 多模块发布流程全解:从语义约定生成到 tag、Release 与示例验证

云原生CLI应用安全 【免费下载链接】slim Slim(toolkit): Dont change anything in your container image and minify it by up to 30x (and for compiled languages even more) making it secure too! (free and open source) 项目地址: https://gitcode.com/gh_mi…

阅读更多 →
QQ空间历史说说完整导出:GetQzonehistory扫码登录后,表格和图片全进本地硬盘 2026/9/20 22:33:29

QQ空间历史说说完整导出:GetQzonehistory扫码登录后,表格和图片全进本地硬盘

QQ空间历史说说完整导出:GetQzonehistory扫码登录后,表格和图片全进本地硬盘 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间不提供数据导出入口&#xff…

阅读更多 →
CANN runtime 开源仓库实战指南:环境部署、源码编译与 UT 验证全流程 2026/9/20 22:33:29

CANN runtime 开源仓库实战指南:环境部署、源码编译与 UT 验证全流程

CANN runtime 开源仓库实战指南:环境部署、源码编译与 UT 验证全流程 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 导读 README_en.md 是 CANN runtime 开源仓库的英文总入口文档&#…

阅读更多 →
QQ空间说说历史完整导出教程:免费备份全部说说、评论与高清图片 2026/9/20 22:33:29

QQ空间说说历史完整导出教程:免费备份全部说说、评论与高清图片

QQ空间说说历史完整导出教程:免费备份全部说说、评论与高清图片 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 如果你的 QQ 空间里堆着上千条历史说说,GetQzone…

阅读更多 →
Bili.Uwp 哔哩哔哩客户端实测:3 步侧载安装 + 踩坑记录 2026/9/20 22:33:29

Bili.Uwp 哔哩哔哩客户端实测:3 步侧载安装 + 踩坑记录

Bili.Uwp 哔哩哔哩客户端实测:3 步侧载安装 踩坑记录 【免费下载链接】Bili.Uwp 适用于新系统UI的哔哩 项目地址: https://gitcode.com/GitHub_Trending/bi/Bili.Uwp 还在忍受网页版 B 站的弹窗、浮层和缓冲条吗?我装了半个月哔哩 Bili.Uwp——一…

阅读更多 →
基于52单片机的风光互补路灯控制器设计与实现 2026/9/20 22:30:29

基于52单片机的风光互补路灯控制器设计与实现

简介:这份PDF是第十三届中国研究生电子设计竞赛商业计划书专项赛作品,围绕基于STC89C52单片机的风光互补路灯控制器展开。内容从能源危机背景切入,先阐述太阳能与风能开发价值,再给出风光互补路灯的开关自动控制与能量综合利用方案…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞