博客类:
- 恶毒的狗博客
- 槐宏文的知乎
- 猫佬
- gulu’s blog
- AI分享站
- 秀哥知乎
- MDD Skill Engine
- GDC 2024(物理)『王国之律动:《塞尔达传说:王国之泪》物理与声音的演变』
- 游戏程序员的自我修养
案例类:
- 怪物猎人开发专题
- Catlike Coding - 六边形网格地图
- Hexagonal Grids
- 英雄联盟的战争迷雾思路_1
- 英雄联盟的战争迷雾思路_2
- AnimMap Baker For Animated Characters - 使用GPU实现大量动画角色的渲染。使用动画贴图在顶点着色器中运行时修改网格的顶点位置。使用GPU实例化来减少绘制调用次数。
- 关于Unity的物理模拟(多场景物理/轨迹线预测/抛物线预测)
- Unity手游 软光栅遮挡剔除方案的实现与落地(开篇)
技术文章类:
- Recast Navigation源码分析:导航网格Navmesh的生成原理
- Unity 大世界,场景 Lightmap 分块Bake,场景区块动态加载
- 贴图优化简谈
- Built-in转URP数据类型映射
- URP管线下的HLSL自学之路
- 内置管线升级到URP手册
- Lua字节码文件结构及加载过程
- GF源码解析
- 烟雨的基于行为树的moba技能系统
- 基于UGUI的图文混排
- 开放世界游戏中的大地图背后有哪些实现技术?
- MMO技能系统
- 基于ECS的体素渲染优化
- Unity中决策AI—GOAP
- Amplify Shader实现网格细分
- 贴花相关
- GAS文档相关
- Unity快速搭建体素风格关卡地图
- 技能编辑器的设计实现
- Scroll Back:2D 横版游戏摄像机运镜原理与实践
- 一个简单的xray
- 分包下载
- ACT技能编辑器的制作经验分享
- UGUI Update优化
- AndroidStudio使用命令行出包(可封装成C#版打包工具)
- Unity发布AAB解释
- 用C#构建一个小于2KB的游戏
- 5 ways to draw an outline
- Unity序列化机制
- 【GDC2025】【双影奇境】使用Capabilities编写所有玩法代码
教程类:
视频相关:
- 以冯乐乐大佬的后处理模板,移植了毛星云大佬的散景模糊
- 顶点文本动画
- Blender
- 复刻八方旅人画面 高精度像素风格HD-2D
- 大衍神君
- 物理小游戏
- 吉比特战斗系统开发分享
- 移动游戏优化指南
- 《Unity性能优化》
- Unity渐进式光照贴图烘焙详解
- LOL的战争迷雾效果
- 【Unity/虚幻5/Blender】3种引擎 绝区零风格 卡通渲染 星见雅 完整流程
- 竹林交互、生成系统
- 【GDC 25】《宇宙机器人》中灵活又有趣的图形魔法(双语)
杂谈:
基础、原理相关:
课程类:
资产:
项目:
简单帧/状态同步,动作游戏基础框架。服务端使用go。
我快两年的开源库撞名了?真假 EasyEcs,到底谁才是真的高性能 ECS — 用实测和汇编拆解 List<struct> 慢在哪、SoA/SIMD/ECS 各快在哪
作者”开发者傑”(微软工程师)维护近两年的 .NET ECS 库 EasyEcs(NuGet,2025-01 首发)与 2026-08 出现的同名 Unity 包 com.zhourui.easyecs 撞名,于是用同机实测(Apple M4、.NET 10、BenchmarkDotNet、50 万条数据)加 IL2CPP 生成的 C++/汇编,把”List 慢 → ref 快 → SoA → SIMD → Burst → ECS”每一层的收益和来源都量化出来,顺带澄清那个 Unity 包实际是 SoA 容器生成器而非 ECS。C# 性能文章里少见的每个结论都有数字和机器码作证的长文。
- List
慢在索引器按值返回:每个元素整份拷出再写回,50 万条改 1 字段要 821 μs;按 ref 访问(.NET 用 CollectionsMarshal.AsSpan,Unity 没有该 API,用布局 view + Unsafe.As 取 _items 再 Unsafe.Add)降到 176 μs,和数组一样快,这一步与 SoA 无关。 - AoS 换 SoA 只改布局,标量循环最多快 1.4 倍;大头是 SoA 让 SIMD 可行(NEON 一次 4 个、AVX2 8 个、AVX-512 16 个),SoA + Vector 到 49 μs,从拷贝写回算起快 17 倍。.NET JIT 不会自动向量化普通循环,SIMD 要手写 Vector
或交给生成器。 - 边界检查的真相:单数组标准循环,JIT 和 IL2CPP 后面的 clang 都能自动消除检查;多列数组一起访问时检查留在循环里,会挡住自动向量化——这就是”IL2CPP 下裸 SoA 数组反而比指针慢”的原因,不是玄学。
- com.zhourui.easyecs 实为 SoA 容器生成器(作者自述”不做完整 ECS”,但包名、[ECS] 特性、XXX_ECSList 都用了 ECS 字样):.NET 上其最好写法 Direct Column 161/279/732 μs,与数组按 ref 访问同档;它在 Unity 里的快来自 IL2CPP 后的 clang 或 Burst 的自动向量化,换 NativeArray 写同一个循环一样快。代价是 6,841 行生成器、每个 struct 3,965 行生成代码、AllocHGlobal 非托管内存要自己 Dispose。
- Burst 的向量化有条件:业务里加一个”死了的单位不动”的 if,ARM64 上就退回逐行(331 μs,和不接 Burst 的标量同档),因为 NEON 没有按掩码写内存的指令而 AVX2 有;要拿回 SIMD 得把条件改写成 0/1 乘法位运算,业务可读性尽失。Unity 主力平台手机恰是 ARM64。
- EasyEcs 4.8(.NET 10 的 archetype ECS,暂不支持 Unity):普通静态 [ForEach] 方法(if、?:、return、Math.Clamp 都行)由源生成器在编译期生成 x86-64(AVX-512/AVX2)+ ARM64(NEON)两套向量循环,条件变掩码、无分支;同样带 if 的测试 141 μs,比 ARM64 Burst 快 2.4 倍。world.Update() 每帧 0 GC 分配;拿不到向量循环时分析器在编译期说明原因(EECS055);实体句柄是”编号 + 版本号”的稀疏索引,删除挪行不会让外部句柄指错。
- 速查数字(50 万条,改 1/2/4 字段,μs,M4 单线程):拷贝写回 821/1,307/1,664 → 各种 ref 写法 170~178/300~359/535~699 → SoA 标量 127/218/539 → SoA+SIMD 49/123/330 → Burst 31/62/213 → EasyEcs 40/75/273(Position{X,Y} 组件改 4 字段 196 反而最快)。
- 判断一个库是不是 ECS 的清单:实体身份(id + 版本号)、运行时增删组件(结构变更)、按组件组合查询、系统调度与读写冲突分析、变更追踪。SoA 容器只占”字段按列存放”一项,和数据怎么摆是两个问题。