<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度，也有思维广度，无论你是开发者、创业者还是高校学子，都能在这里找到适合自己的成长之路！]]></title><description><![CDATA[本博客专注于“技术+创业+学业”三大主题，内容涵盖开发实践、项目管理、课程学习、职业规划等，用通俗易懂的方式解析复杂难题，帮助你从学生到职场完美转型。

每周定期分享干货，欢迎加入交流圈，博主会认真回复每一个问题。订阅，和我一起见成长。]]></description><link>https://blog.csdn.net/qq_33060405</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; qq_33060405]]></copyright><item><title><![CDATA[从零到深：游戏登录中的“跨域“到底是什么？]]></title><link>https://blog.csdn.net/qq_33060405/article/details/165023581</link><guid>https://blog.csdn.net/qq_33060405/article/details/165023581</guid><author>qq_33060405</author><pubDate>Sat, 12 Sep 2026 03:42:11 +0800</pubDate><description><![CDATA[如果你是一个游戏客户端或者服务端开发者，大概率听过这样的对话:“登录接口报错了,控制台一堆红字,说什么 CORS 不允许。“我们这个区服要跟另一个区服打排位,跨域了,账号数据怎么同步?“H5 版本嵌在渠道的 iframe 里,拿不到登录态,也是跨域问题。有意思的是——上面这三句话里的"跨域",指的是三件完全不同的事。游戏行业里"跨域"这个词被严重超载了。浏览器安全层面的跨域(Cross-Origin):Web 同源策略导致的 CORS/Cookie/iframe 问题。游戏服务器架构层面的跨域。]]></description><category></category></item><item><title><![CDATA[Unity 游戏引擎把梦想变成现实的「游戏魔法工厂」——但工厂是怎么运转的？]]></title><link>https://blog.csdn.net/qq_33060405/article/details/165009118</link><guid>https://blog.csdn.net/qq_33060405/article/details/165009118</guid><author>qq_33060405</author><pubDate>Sat, 12 Sep 2026 00:13:29 +0800</pubDate><description><![CDATA[① 导入车间 —— 你放进 Assets 的从不是最终产物★ .meta 是引用的根，Library 是派生数据→ 规范要自动化强制，不能靠人记② 装配车间 —— GameObject 只是 C++ 对象的一层壳★ 每次跨界都有成本→ 优化的核心是"把 N 次小调用变成 1 次批量"③ 动力车间 —— 一帧有严格的执行顺序★ 挂错生命周期，参数调到死也没用→ 输入 Update、相机 LateUpdate、物理 FixedUpdate。]]></description><category></category></item><item><title><![CDATA[JIT 里的 trampoline]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164889097</link><guid>https://blog.csdn.net/qq_33060405/article/details/164889097</guid><author>qq_33060405</author><pubDate>Fri, 11 Sep 2026 02:23:03 +0800</pubDate><description><![CDATA[一小段「先接住、再弹走」的机器码它存在的唯一理由：★ 调用点被编译的那一刻，某个信息还不知道（目标机器码在哪 / 实际类型是什么 / 静态构造跑过没 / T 是什么）它的工作方式：★ 先给一个稳定的合法地址占位★ 第一次经过时补齐信息★ ★ 然后 patch 掉自己，让后续调用绕开它这是 JIT 编译？→ 预热是 vtable 首次解析？→ ★ 预热要用真实类型是静态构造？→ ★ 检查 .cctor 里藏了什么是跨界回调？→ ★ 改批处理。]]></description><category></category></item><item><title><![CDATA[从Fire()到call指令：揭秘JIT编译的幕后真相]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164886693</link><guid>https://blog.csdn.net/qq_33060405/article/details/164886693</guid><author>qq_33060405</author><pubDate>Fri, 11 Sep 2026 01:58:53 +0800</pubDate><description><![CDATA[① 语法层 weapon.Fire();② 元数据层 MonoMethod（身份）+ MonoVTable（跳板）★ 描述与实现是分离的③ 编译层 首次调用 → trampoline → JIT → 回填★ 这是"第一次慢"的全部原因④ 机器码层 call <绝对地址> 直接（可内联，最快）call [vtable+N] 虚（一层间接）IMT thunk → call ★ 接口（两层 + 可能冲突）call [invoke_impl] 委托（一层 + 多播遍历）]]></description><category></category></item><item><title><![CDATA[游戏研效提升的五大催化剂]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164885985</link><guid>https://blog.csdn.net/qq_33060405/article/details/164885985</guid><author>qq_33060405</author><pubDate>Fri, 11 Sep 2026 01:32:10 +0800</pubDate><description><![CDATA[① 反馈回路 —— 慢的回路不只是慢，它会让人"攒改动"，从而降低每次验证的信息质量② 缓存增量 —— 任何确定性的转换，同样的输入不该算第二次③ 确定性 —— 它是地基。没有它，缓存不可信、测试全 flaky、bug 无法复现、性能对比没意义④ 门禁左移 —— 同一个 bug，本地 1×、CI 10×、QA 100×、线上 1000×⑤ 可观测性 —— 它的价值不是"看到数据"，是【终结争论】因为它们改变的不是速度，是行为模式。Play Mode 从 90 秒到 8 秒。]]></description><category></category></item><item><title><![CDATA[CPU再快也救不了帧率？真相竟在队列里]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164881476</link><guid>https://blog.csdn.net/qq_33060405/article/details/164881476</guid><author>qq_33060405</author><pubDate>Thu, 10 Sep 2026 20:52:05 +0800</pubDate><description><![CDATA[帧率 = 1000 / max(CPU 一帧耗时, GPU 一帧耗时)流水线的吞吐量，永远由最慢的那个工位决定。问题答案CPU 比 GPU 快，帧率会掉吗？不会掉，但也不会涨帧率是 CPU 的生产速度吗？❌不是。是两者中较慢的那个CPU 跑得快有意义吗？★ 有，但不是提升帧率——见第 3 章回到最初的问题。在动手优化之前，先花十分钟拿到三个数字：CPU 工作时间、GPU 时间、实际帧时间。案例 1 里，团队少花这十分钟，多花了两周。而这两周的产出，是把帧率从 43 提到了 44。]]></description><category></category></item><item><title><![CDATA[从编码算法到 P/Invoke：C# `string` 如何变成 C++ `char*`]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164818491</link><guid>https://blog.csdn.net/qq_33060405/article/details/164818491</guid><author>qq_33060405</author><pubDate>Thu, 10 Sep 2026 11:17:34 +0800</pubDate><description><![CDATA[下面先实现 UTF-8 转换算法，再解释 UTF-16、GBK 等编码的差异，最后落到射击游戏的实际接口设计。内容参考 Microsoft、Unicode 和 Unity 的公开资料。]]></description><category></category></item><item><title><![CDATA[C# 和 C++ 之间传字符串一步一步看清内存里发生了什么]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164767215</link><guid>https://blog.csdn.net/qq_33060405/article/details/164767215</guid><author>qq_33060405</author><pubDate>Thu, 10 Sep 2026 03:57:59 +0800</pubDate><description><![CDATA[看看"1.4.2"字符串常量在编译时就被放进可执行文件的只读数据段（.rodata程序内存布局：│ .text 代码 ││ .rodata 只读数据 │ ← ★ "1.4.2" 在这里│ "1.4.2\0" │ 它从来没被 malloc 过！│ .data 全局变量 ││ 堆 (malloc 管的) │ ← free 只认这里的地址│ 栈 │运行时对一个.rodata里的地址调用了free()。free() 的工作原理：它假设你给的地址前面有一小块"元数据"，记录这块内存多大、]]></description><category></category></item><item><title><![CDATA[C# 与 C++ 之间的字符串从 `char*` 到 `std::string`，自动转换背后到底发生了什么]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164765968</link><guid>https://blog.csdn.net/qq_33060405/article/details/164765968</guid><author>qq_33060405</author><pubDate>Thu, 10 Sep 2026 03:45:17 +0800</pubDate><description><![CDATA[让 C# 自动把char*转成字符串”，背后到底做了什么？三句话回答：第一句：自动转换 = malloc + 逐字符转码 + free。一次约 400~2000 纳秒，还伴随一次原生堆分配。C# 的string是 UTF-16、有长度头、在 GC 堆上；C 的char*是裸指针、靠\0结尾、编码不明。两者没有任何共同之处，只能整块重建。第二句：反方向（C++ 返回字符串）不是慢，是会崩。因为默认约定是"返回的指针由运行时负责释放"，而它用的释放函数几乎不可能和 C++ 侧的分配器是同一个。跨堆。]]></description><category></category></item><item><title><![CDATA[mmap的真相：不拷贝，只映射]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164758325</link><guid>https://blog.csdn.net/qq_33060405/article/details/164758325</guid><author>qq_33060405</author><pubDate>Wed, 09 Sep 2026 23:56:38 +0800</pubDate><description><![CDATA[让用户空间的一段虚拟地址直接指向内核的 page cache”= 内核在你的页表项（PTE）里，写入了 page cache 那个的物理页帧号。没有拷贝，只有一次页表写入。从此你的虚拟地址和内核的 page cache 索引，指向同一块物理内存。层次收益代价内存只有访问过的页才驻留，PSS 降 10 倍虚拟地址空间占满，VMA 增多速度加载 = 建 VMA，微秒级成本推迟到 page fault，时机不可控可靠性脏页归内核，SIGKILL 也不丢。]]></description><category></category></item><item><title><![CDATA[adb shell 手把手教程]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164535283</link><guid>https://blog.csdn.net/qq_33060405/article/details/164535283</guid><author>qq_33060405</author><pubDate>Tue, 08 Sep 2026 04:39:49 +0800</pubDate><description><![CDATA[想象你的手机是一栈上了锁的大楼：有了这张卡，你能看到：这些信息，Unity Profiler 看不到。举个真实例子。你的射击游戏掉帧了，你打开 Unity Profiler：
Profiler 告诉你的是"我用了 8.2 毫秒"。
它不知道的是"手机热了，CPU 主动把自己的速度砍了一半，所以这 8.2 毫秒实际上是原来 4 毫秒的活"。这个真相只有 adb shell 能告诉你。

① 你在电脑上敲 
② 电脑后台有个常驻程序（占用 5037 端口），负责管理"现在连了几台手机"
③ 手机里有个叫  的服]]></description><category></category></item><item><title><![CDATA[为什么开了 120Hz，压枪就“不会了“？]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164474720</link><guid>https://blog.csdn.net/qq_33060405/article/details/164474720</guid><author>qq_33060405</author><pubDate>Mon, 07 Sep 2026 17:05:11 +0800</pubDate><description><![CDATA[/ ❌ Unity 老 Input API 的典型写法// 只知道首尾，中间全丢了对于直线拖动，首尾差和路径长度一样，没问题。但压枪是下拉 + 左右修正的曲线运动真实手指路径（一帧内 4 个采样点）：●─→─●╲●─→─●路径总长 = 4 单位只取首尾：直线距离 = 3.2 单位 ← 丢了 20% 的位移！结果：60 帧下丢的多（一帧 4 个点），120 帧下丢的少（一帧 2 个点）。→120 帧下同样的手势，转视角更快。玩家感觉"高帧率灵敏度变高了"。]]></description><category></category></item><item><title><![CDATA[玩家付了钱,东西没到:Google Play 内购的服务端正确姿势]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164417945</link><guid>https://blog.csdn.net/qq_33060405/article/details/164417945</guid><author>qq_33060405</author><pubDate>Sun, 06 Sep 2026 05:29:40 +0800</pubDate><description><![CDATA[第一句:客户端负责"付款",服务端负责"发货",两者之间只传一个 purchaseToken。凡是让客户端决定"发多少"的设计,都会在上线两周内被玩家找到。第二句:幂等不是写几个 if,是靠数据库唯一约束 + 事务 + 行锁。天生就是完美的幂等键,把它做成主键,并发问题一次性解决。订阅例外——用orderId。第三句:acknowledge 是财务动作,3 天没做就是真金白银的损失。它必须在服务端、必须异步无限重试、必须有告警。不要让它依赖玩家是否回到大厅、是否切了后台、是否有网。]]></description><category></category></item><item><title><![CDATA[一个 lambda 的重量：闭包与委托的 GC 全流程]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164405809</link><guid>https://blog.csdn.net/qq_33060405/article/details/164405809</guid><author>qq_33060405</author><pubDate>Sun, 06 Sep 2026 01:14:18 +0800</pubDate><description><![CDATA[FPS 的手感基础不是平均帧率,是。]]></description><category></category></item><item><title><![CDATA[一次装箱的一生：从一条 IL 指令到一次 20ms 的掉帧]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164405591</link><guid>https://blog.csdn.net/qq_33060405/article/details/164405591</guid><author>qq_33060405</author><pubDate>Sun, 06 Sep 2026 00:50:45 +0800</pubDate><description><![CDATA[FPS 的手感基础不是平均帧率,是。]]></description><category></category></item><item><title><![CDATA[40 字节的隐形税：接口遍历导致的枚举器装箱]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164405440</link><guid>https://blog.csdn.net/qq_33060405/article/details/164405440</guid><author>qq_33060405</author><pubDate>Sun, 06 Sep 2026 00:36:07 +0800</pubDate><description><![CDATA[如果你确实需要"对外只读、对内可写"的封装,不要用// ★ 公开返回具体 struct 类型 —— foreach 的鸭子类型会直接用它// 用法foreach (var a in registry.Alive) { ... } // GC Alloc: 0 B,且保持只读语义注意:不要让它实现。一旦实现了,别人就能把它隐式转成接口,装箱又回来了。如果为了兼容必须实现,用显式接口实现,并在返回值上加之类的警示。这正是里的设计:公开 structEnumerator。]]></description><category></category></item><item><title><![CDATA[那个没提交的 .meta 文件 ——一场悄无声息的资产大屠杀，以及它背后的原理]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164402693</link><guid>https://blog.csdn.net/qq_33060405/article/details/164402693</guid><author>qq_33060405</author><pubDate>Sat, 05 Sep 2026 18:40:07 +0800</pubDate><description><![CDATA[│ .meta 文件的两个身份 │▼ ▼│ ① 身份证 (GUID) │ │ ② 加工工单 (Importer) ││ 随机生成，不可推导 │ │ 格式/尺寸/边框/绑定… ││ │丢了会怎样 ▼ 丢了会怎样 ▼│ 💀 引用全部断裂 │ │ 💀 包体爆炸（17×） ││ 💀 材质变粉 │ │ 💀 UI 变形（九宫格） ││ 💀 Missing Script │ │ 💀 动画失效（Avatar） ││ 💀 Inspector 数据清零│ │ 💀 光照错误（sRGB） │。]]></description><category></category></item><item><title><![CDATA[从“米其林厨房“到“航空餐盒“：Unity 工程与构建产物的形态学对照]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164402117</link><guid>https://blog.csdn.net/qq_33060405/article/details/164402117</guid><author>qq_33060405</author><pubDate>Sat, 05 Sep 2026 17:30:32 +0800</pubDate><description><![CDATA[你在 Editor 里看到的一切,都是"生鲜 + 菜谱 + 备菜台";玩家手里的那个包,是"已经装盒、封膜、贴好加热说明的预制菜"。]]></description><category></category></item><item><title><![CDATA[Render Ahead 深度解析：那个让你「帧率很高但手感发黏」的隐形凶手]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164368259</link><guid>https://blog.csdn.net/qq_33060405/article/details/164368259</guid><author>qq_33060405</author><pubDate>Fri, 04 Sep 2026 14:31:22 +0800</pubDate><description><![CDATA[动画首帧立刻给出明显的形变/特效/音效，让玩家「感觉」输入被立刻响应了。]]></description><category></category></item><item><title><![CDATA[为什么叫“噪声“？—— 一个来自收音机时代的名字，如何塑造了整个游戏世界]]></title><link>https://blog.csdn.net/qq_33060405/article/details/164342357</link><guid>https://blog.csdn.net/qq_33060405/article/details/164342357</guid><author>qq_33060405</author><pubDate>Fri, 04 Sep 2026 01:36:39 +0800</pubDate><description><![CDATA[我们回到最初的困惑：为什么程序员要主动制造"噪声"？现在你明白了。它诞生于收音机时代，是工程师们想消除的"沙沙"杂音；它在示波器和电视屏上被看见，变成了"雪花点"般的随机图案，并从光学借来了"白色"之名；它在 1983 年被 Ken Perlin 驯服，从"要被消除的敌人"变成了"用来创造的画笔"，却光荣地保留了"噪声"这个姓氏；最终，它成为整个数字世界的造物主，堆出群山，铺开星海，绘制云天。"噪声"这个名字，是它出身的印记，而非贬低的标签。]]></description><category></category></item></channel></rss>