- 博客(154)
- 资源 (1)
- 收藏
- 关注
原创 Unity 内存数据极限防护:一个 int 藏 8 份密文,修改器到底还能怎么改?
游戏里有些数值非常敏感:金币、钻石、战斗属性、关键计数……如果直接使用普通int内存里就是一个非常明确的10000。一些简单的内存修改器只需要搜索数值、修改数值、再次筛选,就可能定位到目标地址。MyFramework 中的。
2026-09-16 18:26:46
144
原创 Unity AssetBundle 打包极限治理:依赖环、重复资源、包体膨胀,怎么在上线前全部揪出来?
上一篇讲的是 AssetBundle 在运行时怎么加载、引用和卸载,但很多资源问题其实在运行之前就已经埋下了。一个资源到底应该进哪个 Bundle?公共资源为什么莫名其妙被打进多个包?一个 UI 为什么递归依赖几十个 AB?依赖关系甚至形成环以后,又该怎么定位?
2026-09-15 18:24:27
269
原创 Unity AssetBundle 极限管理:依赖、异步加载、引用计数、自动卸载到底怎么串起来?
MyFramework 的,就是围绕这些问题组成了一套完整的 AssetBundle 生命周期管理。
2026-09-14 15:19:34
93
原创 Unity 资源热更新极限拆解:几万个文件,怎么做到只下载真正变动的那几个?
网络部分讲完以后,下一块很适合进入 MyFramework 的资源热更新。如果每次启动都重新下载全部资源,热更新也就失去了意义。MyFramework 的做的事情,就是在和远端资源之间进行完整比对,最终只下载真正发生变化的文件。
2026-09-10 22:26:57
55
原创 写完 EasyECS 1.1.0,我为什么还是没把它做成完整 ECS?
既然已经有 A那就顺便做 B有了 BC 也不远了数据容器↓Entity↓System↓Scheduler↓World↓整个项目都必须围着框架转框架越来越完整。替换成本也越来越高。EasyECS 这次我反而希望控制住这种冲动。数据布局高频访问批量处理就够了。其他事情继续交给项目现有架构。AoS / SoARefColumnIL2CPPResize看起来讲了很多东西。如何让数据更适合 CPU,同时又不要让整个项目为性能付出过高的工程成本?
2026-09-09 15:37:05
121
原创 一个 [ECS] 到底生成了多少代码?EasyECS 最核心的秘密都在这里
ECS]背后到底发生了什么?普通 Struct↓编译期字段分析↓确定 SoA / AoS↓确定 Managed / Unmanaged↓生成 Storage↓生成 Ref↓生成 ECSList↓生成 ECSDictionary↓生成 Direct Column↓根据环境选择 Backend然后到了 Runtime,这些“魔法”全部消失。剩下的只是正常 C# / IL2CPP 代码。把框架的复杂度留给编译阶段,把尽可能简单的执行路径留给 Runtime。
2026-09-07 23:44:34
133
原创 为了让 Ref 在 Resize 后还能用,我没有让它直接指向数据
所有引用都永久稳定稳定 ID映射表额外跳转版本重定位最终又把热点路径变复杂。怎么让 role.mHP 能直接修改底层数据Resize内存地址Index 稳定性RemoveAtSwapBackEditor 检查性能抽象层级最后我没有让 Ref 直接保存字段指针。因为我不想为了省掉极少的一层访问,让一次 Resize 就把所有 Ref 变成悬空指针。而真正需要那一点极限性能时,还有 Direct Column。默认路径尽量安全、好用;
2026-09-07 23:39:26
216
原创 EasyECS 最慢的地方,居然是 Resize
让数据更连续减少抽象减少无效访问但 Resize 恰恰相反。大块内存操作多 Storage 同步所以 EasyECS 对 Resize 的思路不是:想办法让它变成一个“超快 API”。正常支持它↓保证异常安全↓尽量减少发生次数↓热点系统提前预估 Capacity有些操作最好的优化,不是让它执行得更快,而是尽量不要让它执行。
2026-09-07 10:58:33
346
原创 EasyECS:一个 foreach,让 IL2CPP 性能直接掉了一个数量级
碰到这种问题,一个很容易走偏的方向是:继续在原来的 Enumerator 上一点一点抠。少一个属性少一个临时变量改一下 struct这些我当然也会看。但如果整个访问模型本身在 IL2CPP 下就不理想,继续修补意义有限。后来我开始给真正的热点路径找更直接的遍历方式。这次foreach的坑让我印象很深。数据布局没错SoA 没错Dense Storage 没错算法也没错你怎么走到这些数据面前。
2026-09-04 17:19:21
380
原创 Unity HTTP 网络层硬核拆解:防重复、自动重试、双缓冲、WebGL,一次请求到底被框架接管了多少?
全部放进同一条可复用的 HTTP 请求流水线。当项目只有三五个接口时,这些东西看起来并不重要。但当后台接口逐渐变成几十个、上百个以后,真正能救命的往往不是“会不会发 HTTP”,而是。
2026-09-04 17:05:42
733
原创 Dictionary 都已经 O(1) 了,我为什么还要重新写一个?
EasyECS 没有重新写 Hash Table。但是 Dictionary 里不保存真正的数据。ECSList里。Dictionary10001 → 010002 → 110003 → 210004 → 3随机定位连续批处理→ ECSList这就是最核心的设计。所以:Dictionary 都已经 O(1) 了,我为什么还要写 ECSDictionary?O(1)O(0.5)这种不存在的东西。
2026-09-04 16:55:22
232
原创 Unity WebSocket全平台极限兼容:浏览器禁掉原生 Socket 后,WebGL 到底怎么连服务器?
TCP、UDP 在 Windows、Android、iOS 上都很好理解,直接创建 Socket 就行。但到了 WebGL,情况完全变了:代码最终运行在浏览器里,不能继续照搬原生 Socket 模型。
2026-09-02 10:22:20
259
原创 不讲武德的 O(1) 删除:EasyECS 的 RemoveAtSwapBack 为什么能快几千倍
可以说是 EasyECS 里最简单粗暴的 API 之一。拿最后一个元素补洞,然后 Count--。但它带来的性能提升,可能比花大量时间优化内存拷贝还明显。因为真正改变的不是某几条指令。O(n)→O(1)下一篇继续顺着这个思路往下走。如果我根本不知道数据在哪个 index 怎么办?普通 Dictionary 查找已经是 O(1) 了。那我为什么还要在 EasyECS 里重新做一个?
2026-09-02 10:06:16
177
原创 删一个元素,EasyECS 为什么要搬整片内存?
写 SoA 最舒服的时候,是读数据。连续、直接、Cache 友好。但当我准备让ECSList的时候,SoA 开始露出另一面。因为删除一个元素,不再是删除“一块 Struct”。
2026-09-01 00:55:57
495
原创 50 万条数据,List 为什么会输得这么惨?
当它被放进 50 万次循环以后,可能已经不是“小细节”了。而 EasyECS 真正做的,也不只是把 AoS 换成 SoA。↓无效字段加载↓Ref 间接访问↓最终直接碰 Column有趣的是,数据访问解决以后,下一个麻烦很快又来了。因为容器不可能只 Add。它还得删除。删除一条数据,意味着所有 Column 都必须一起动。
2026-08-30 23:39:02
314
原创 我以为 ECSList 已经够快了,直到我直接拿到了 Column
EasyECS 最终没有选择一个统一的“最佳访问方式”。因为不存在这样的东西。Indexer易用↓Ref性能与可读性的平衡↓极限性能开发者可以根据热点程度选择不同层级。而不是因为用了一个“高性能框架”,就被迫让整个项目都写成最低级的数据访问代码。
2026-08-30 22:32:33
164
原创 Unity 中 SoA 和 AoS 能不能同时存在?EasyECS 的 Hybrid Storage
前面几篇一直在讲一个问题:哪些字段适合 SoA,哪些字段更适合 AoS?到了这里,其实自然会得到另一个结论:一个 Struct 没有必要只能选择 SoA 或 AoS。
2026-08-27 21:51:58
213
原创 Unity EasyECS:并不是所有字段都适合 SoA,Unity 项目中应该怎样拆数据
上一篇讲了 EasyECS 中 [ECS] 和 [NotECS] 的基本规则。但真正放到项目里,很快就会遇到一个更实际的问题:一个 Struct 里到底哪些字段应该放进 SoA,哪些字段应该继续保留 AoS?这并不能单纯根据字段类型决定。int 不一定适合 SoA,Vector3 也不一定非得拆开。
2026-08-26 18:22:06
214
原创 [ECS] 和 [NotECS] 不只是两个标签:Unity EasyECS 的数据布局规则详解
前一篇我们完成了 EasyECS 的第一次使用。只需要:[ECS]一个普通 struct 就可以转换成 EasyECS 管理的数据结构。但是马上会出现一个问题:答案是:不是。
2026-08-25 23:06:38
218
原创 Unity EasyECS 五分钟快速上手:只加一个 [ECS]
前几篇一直在讲 EasyECS 为什么存在、AoS、SoA 和 CPU Cache。从这一篇开始,不再只讲原理。我们直接把 EasyECS 跑起来。
2026-08-24 10:32:25
925
原创 不做完整 ECS,只优化数据布局:Unity EasyECS 到底是什么
前几篇一直在讲 AoS、SoA 和 CPU Cache。到了这里,可以正式回答一个问题:EasyECS 到底是什么?看到名字里有 ECS,很容易把它理解成 Unity Entities 的另一种实现。但实际上,EasyECS 从设计目标上就不是一套完整 ECS Framework。
2026-08-23 22:54:57
354
1
原创 Unity 性能优化不只是少写 Update:CPU Cache 才是很多人忽略的大头
前一篇讲了 AoS 和 SoA。很多人看到 SoA 更快时,第一反应可能是:不就是把几个字段拆成数组吗,为什么性能差距会这么明显?答案其实不在 C# 语法里。真正的关键是:CPU Cache。EasyECS 之所以要改变数据布局,本质上就是想让 CPU 更容易拿到“下一步真正需要的数据”。
2026-08-22 13:02:15
226
原创 一张图看懂 AoS 和 SoA:Unity 数据为什么只是换个摆法就能变快
前两篇一直在提一个词:SoA。EasyECS 最核心的优化,本质上也和它有关。但 SoA 并不是什么神秘技术。很多时候,它只是把同一批数据在内存里的排列方式换了一下。代码逻辑甚至完全没变,性能却可能出现明显差距。这一篇就只讲清楚两个概念:AoS 和 SoA。
2026-08-22 12:13:21
352
原创 Unity 里用了 ECS,就一定要放弃 OOP 吗?
提到 ECS,很多 Unity 开发者第一反应往往是:要用 ECS,是不是就得放弃原来的 OOP 写法?这也是我在设计 EasyECS 时反复考虑的问题。因为对于一个已经开发了很久的 Unity 项目来说,真正困难的往往不是“学会 ECS”,而是:现有代码怎么办?
2026-08-20 22:38:24
321
原创 基于MyFramework开发的传奇项目分析,看看AI是怎么评价这套传奇代码的
我对 MyFramework 的判断更有依据了:它确实成功约束住了一个规模不小的商业游戏项目,而不只是框架代码本身写得整齐。
2026-08-19 11:10:21
329
原创 我把 EasyECS、StructureOfArraysGenerator 和 FLib 放到一起研究后,发现它们根本不是同一种 ECS
昨天发布了一篇关于EasyECS的文章,很多人表示很感兴趣,有些人也让我去看一下其他的SOA有关的插件,比如Cysharp StructureOfArraysGenerator, 还有提到FLib
2026-08-18 14:05:40
154
原创 我为什么又造了一个轮子:Unity 中 EasyECS 的诞生
也就是上周四的事情.其实我一直都觉得ECS和OOP可结合.只不过一直没有好的办法去实现,担心自己写出来的ECS比正常OOP性能更差.所以当我随口在群里说出这些话时,一个冲动出现在我脑中,我也许可以让AI帮我来实现.
2026-08-17 14:41:09
642
原创 Unity 网络协议极限自动化:几百条消息,C# 和 C++ 难道真要手写两遍?
一个 MMO 做到后期,网络协议很容易从几十条膨胀到几百条。如果每增加一个字段,都要同时修改 Unity 客户端、C++服务器、序列化、反序列化、协议 ID 和注册代码,那协议维护本身就会变成一个巨大的风险源。
2026-08-16 18:02:34
211
原创 Unity 网络通信极限选型:TCP 和 UDP 到底该怎么分工,选错一次可能就是性能灾难?
TCP 可靠、UDP 快,所以“重要数据走 TCP,位置同步走 UDP”——这句话没错,但只说到了表面。游戏网络真正要判断的并不是“哪个协议更快”,而是:这条消息如果晚到、丢失、重复,甚至被下一条消息覆盖,到底有没有关系?MyFramework 同时维护 TCP 和 UDP 两条通信链路,业务层仍然只调用统一的 sendPacket()。这一篇就结合实际代码看看,两种协议到底应该怎么分工。
2026-08-16 00:13:24
349
原创 Unity UDP极速通信底层拆解:不建连接、不做重传,一条消息到底怎么飞到服务器?
TCP 那篇里最麻烦的是粘包、半包、连接状态和数据流拆分。到了 UDP,整个模型完全变了。MyFramework 中的 NetConnectUDPBit 没有 TCP 那套连接和序列号机制,也没有实现丢包重传,而是直接围绕 Datagram、Token、Bit 序列化、CRC、双缓冲和线程隔离 组织整个 UDP 通信链路。
2026-08-14 20:14:50
232
原创 Unity TCP底层极限拆解:粘包、半包、CRC、序列号、双缓冲到底怎么一起工作的?
前面已经把一条 NetPacket 从对象、序列化一直讲到了网络发送,但真正到了 TCP 这一层,问题才刚刚开始。TCP 没有“消息”的概念,它只是一条连续的字节流。你发送了 3 条协议,对方一次 Receive() 可能收到半条,也可能一次把 3 条全收回来。
2026-08-14 01:45:31
361
原创 Unity 网络协议全链路拆解:一条消息到底是怎么从 C# 对象跑到服务器的?
上一篇已经把数据压到了 Bit 级,但 SerializerBitWrite 只解决了“数据怎么变成二进制”的问题。真正的网络协议还要解决更多事情:消息怎么定义、怎么知道它是什么协议、哪些字段有效、怎么创建和回收、怎么选择 TCP/UDP,以及服务器消息收到以后怎么进入业务逻辑。
2026-08-11 18:07:44
231
原创 作为一个程序员,我想问一句,代码在你心中是什么?
代码是程序员吃饭的东西.我也是靠这个吃饭,养家.当一个东西变成工作时,它就会让你讨厌.无论你有多么喜欢他.大多数人应该都是这样觉得的吧.爱好可以,但是把爱好当工作,就变味儿了.
2026-08-11 17:53:52
185
原创 Unity 极限压缩网络协议:把每一个 Bit 都榨干,序列化还能做到多小?
上一篇讲了 MyFramework 普通的字节序列化。但网络消息如果发送得足够频繁,哪怕每条消息只少几个字节,长期累计下来也是非常可观的。所以 MyFramework 里还有另外一套 SerializerBitWrite / SerializerBitRead:它不满足于“按字节压缩”,而是直接深入到 Bit 级别,整数长度、最高位、符号位、列表长度,能省的地方继续往下省。
2026-08-10 23:04:02
1183
原创 Unity MyFramework 用法说明(三十二):使用 SerializerWrite 和 SerializerRead 进行字节序列化
上一篇介绍了 ExcelManager,配置表最终会生成二进制数据,再通过 SerializerRead 解析。实际上这套字节序列化并不只服务于 Excel,它也是 MyFramework 中网络协议、本地数据和自定义二进制结构的基础能力之一。
2026-08-09 22:24:10
208
原创 Unity MyFramework 用法说明(三十一):使用 ExcelManager 统一管理游戏配置表
游戏中的怪物、物品、技能、地图等大量数据通常都来自配置表。如果业务代码自己负责读取文件、解析数据和建立索引,表格数量一多就会产生大量重复代码。MyFramework 使用 ExcelManager、ExcelTable 和 ExcelData 统一管理配置数据,并采用文件预加载 + 数据延迟解析的方式减少启动阶段的集中开销。
2026-08-08 16:34:53
199
原创 Unity MyFramework 用法说明(三十):使用 GlobalTouchSystem 统一处理 UI 与场景交互
InputSystem,它负责收集鼠标和触摸状态。但触点按下之后,到底命中了哪个 UI、哪个场景物体,以及事件是否继续向下穿透,还需要另一套系统处理。MyFramework 使用 GlobalTouchSystem 统一完成 UI 与场景物体的射线检测和交互事件分发
2026-08-07 11:10:23
327
原创 Unity MyFramework 用法说明(二十九):使用 CameraManager 统一管理游戏摄像机
项目中往往同时存在主场景摄像机、UI 摄像机、角色预览摄像机和 RenderTexture 摄像机。如果各系统直接操作 Unity Camera,主摄像机切换、URP Camera Stack、AudioListener 和跟随逻辑就会散落到不同代码中。MyFramework 使用 CameraManager 统一管理摄像机,并通过 GameCamera 为 Unity Camera 增加组件化能力。
2026-08-05 15:38:50
192
原创 Unity MyFramework 用法说明(二十八):使用 SceneSystem 管理 Unity 场景资源
前面介绍的 GameScene 和 SceneProcedure 负责管理游戏的业务流程,但它们并不直接加载 Unity 的 .unity 场景文件。真正负责 Unity 场景注册、异步加载、显示隐藏和资源卸载的是 SceneSystem。
2026-08-05 15:25:15
215
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅