编辑
2026-10-21
课外知识
00

注意

施工中

写这篇博文的原因,算是同学推荐吧。以前几次想啃这部书都未能行动起来。如今 AI 编程时代下,依然会遇到项目管理的问题,还是回顾一下这部经典之作中的哲学吧。

编辑
2026-10-21
编程学习
00

注意

施工中

前些时间有利用云服务器搭建内网穿透服务,辅助本地开发测试,面试中也被问到内网穿透的原理。但只知怎么用,不知为什么,十分尴尬。因此本文试图将自己的学习和理解记录下来。

编辑
2026-10-21
编程学习
00

网上关于登录态的文章数不胜数,公司内部的知识库里也有很多现成的总结。但读别人的文章终究不如自己真正消化一遍,因此我决定结合日常工作和学习,写一篇属于自己的小结。希望能以简洁的方式,把常见的登录态方案梳理一遍,既当复盘,也能方便日后查阅。


拖更太久了,现在的技术文章我都不知道还有没有写的意义了。因为这种总结类的,不产生只搬运知识的文章愈发廉价了,我想不出有什么不用 AI 生成的理由了,空闲时间也愈发得少了,好悲哀……

注意

本文包含 AI 生成内容,已进行人工校对。如有缺漏和错误之处,也欢迎指出!

编辑
2026-10-21
课外知识
00

注意

施工中

开个新坑吧,主要是刚进入后端开发,感觉用到了不少数据库,但是大家都默认我知道一样,就索性汇总写一写。

编辑
2026-10-16
编程学习
00

本文是由 DeepSeek 生成的 DDNet 地图编辑器模块分析。仅作为方便看的存档使用。

注意

注意,本文几乎 100% 包含 AI 生成内容!

相关信息

  • 适用版本:master @ a0dfc77b8
  • 本文行号对应这个版本;所有路径相对仓库根目录。
  • 目标:让接手的人半天内建立完整心智模型,知道"改哪里、别踩什么坑"。

0. 30 秒速览(TL;DR)

  • 地图编辑器是客户端专属模块(src/game/editor/,约 2.6 万行),通过 IEditor 接口注册进 engine;用配置变量 cl_editor(快捷键 Ctrl+Shift+E)在游戏内切换。它不单独起进程,也没有独立渲染器——渲染复用游戏客户端的 CRenderMap。
  • 结构是四层文档模型: CEditor(应用外壳 / 多标签页) → CEditorMap(一个打开的 .map 文档) → CLayerGroup(图层组,含视差/裁剪) → CLayer 子类(tiles / quads / sounds / game / tele / speedup / switch / tune / front)。
  • 桌面对象全部是 std::shared_ptr,由 CEditorMap 的 vector 拥有;元素之间的引用一律是整数索引,因此每次增删都要显式 remap。
  • 所有可撤销操作都是 IEditorAction 对象,压进 CEditorHistory 栈;连续拖拽通过 *PropTracker 的 Begin/End 模式聚合成一条 action。
  • 地图文件读写集中在 mapitems/map_io.cpp,保存是异步的(CDataFileWriterFinishJob 交给 engine job 队列)。
  • UI 是立即模式,基于游戏客户端的 CUi(void *pId 地址即身份 + hot/active 模式);工具栏/快捷键由 X-macro 表 quick_actions.h 声明(但工具栏不会自动遍历它,见 §7.5)。

规模速查:editor.cpp 5205 行、popups.cpp 2855 行、editor_server_settings.cpp 2203 行、envelope_editor.cpp 2376 行、editor_actions.cpp 2119 行、map_io.cpp 1289 行、layer_tiles.cpp 1408 行;组件 10 个、具体 action 类 41 个、quick action 55 个、popup 渲染函数 30+ 个。