背景
最近面了几家游戏公司,岗位是游戏开发。面试聊到的问题挺有意思,一半是”老本行”C# 底子,一半是”新玩法”AI 编程——比如 RAG 和渐进式披露的区别、Spec-Driven 的 AI 编程模式。整理一下这次面试聊到的四个问题,以及我对现在行业里 AI 编程的一些感悟。
一、C# 装箱和拆箱
装箱(boxing)就是把值类型(int、struct 等)转成引用类型(object 或接口):在托管堆上分配一个对象,把值拷贝进去。拆箱(unboxing)是反过来,从堆上那个盒子里把值拷回栈上的值类型变量,要求类型完全匹配,否则运行时会抛 InvalidCastException。
开销主要在三点:
- 堆分配——装箱必然在托管堆上 new 一个对象,产生 GC 压力;
- 两次拷贝——装箱拷进堆,拆箱再拷回栈;
- 额外跳转——访问时要经过一次引用间接层。
常见的触发点:
- 往非泛型集合里塞值类型:
ArrayList、Hashtable(换成List<T>、Dictionary<TKey,TValue>就没了); string.Format、字符串插值里拼object,params object[]传参;- 值类型实现接口后被按接口调用,比如
struct实现IComparable再去Sort,每次比较都装箱; - LINQ 里隐式转
object、enum转string的某些路径。
面试官一般会接着问”怎么避免”:泛型优先、StringBuilder 代替拼接、is/模式匹配代替先装箱再判断、热路径上用 struct + Span<T> 减少分配。游戏里这条尤其重要——Update 里一个不经意的装箱,就是每帧一次堆分配。
二、C# GC
GC 的底层机制面试常考这几层:
- 托管堆 + 分代:Gen0 / Gen1 / Gen2,对象越年轻回收越频繁,新对象死在 Gen0 成本最低;
- 标记-清除-压缩:从根集合(静态字段、线程栈、寄存器、GC Handle)出发标记存活对象,清掉不可达对象,再压缩内存减少碎片;
- 大对象堆(LOH):超过 85KB 的对象进 LOH,默认不压缩,容易产生碎片;
- 触发时机:分配触发、显式
GC.Collect()、系统内存压力; - 终结器:有终结器的对象会进 finalization queue,回收延迟一代,正确姿势是
IDisposable+using,别只靠终结器兜底。
调优方向基本围绕”减少分配”:对象池、StringBuilder、struct/Span<T>/Memory<T>、避免闭包和 async 状态机在热路径上产生隐式分配。Unity 里还会追问引擎自己的 GC 和 .NET 桌面 GC 的差异(IL2CPP 和 Mono 的行为不完全一样,Unity 还提供 Incremental GC),这个以项目实际版本为准,能说清”为什么游戏里要避免运行时分配”就够了。
三、RAG 和渐进式披露的区别
这两个词容易混,其实一个管”知识从哪来”,一个管”信息怎么给”。
RAG(检索增强生成):查询时先从外部知识库检索相关片段,塞进 prompt 让模型基于检索结果回答。解决的是”模型不知道、记不住私有或最新知识”的问题,本质是给模型补充外部事实。
渐进式披露(progressive disclosure):原本是交互设计原则——先展示必要信息,需要时再逐步展开。在 AI 编程场景里,就是 AGENTS.md、skills、文档按需加载:只把当前任务相关的指令放进上下文,而不是把整个仓库文档全量塞进去。解决的是”上下文长度有限、注意力被稀释”的问题,本质是信息组织与分发策略。
一句话区分:RAG 决定”从哪个知识库检索什么”,渐进式披露决定”这次任务该给模型看什么、什么时候看”。两者还能配合用——渐进式披露决定加载范围,RAG 决定具体内容从哪取。
四、Spec-Driven 的 AI 编程模式
Spec-Driven 的核心是:先写规格,再让 AI 实现,最后用测试验证。规格里包含需求、接口定义、验收标准和测试用例,AI 照着 spec 写代码,跑测试确认”是否符合 spec”。
和”直接丢一句需求让它写”的区别:
- spec 是人和 AI 之间的契约,可评审、可版本管理、可复用;
- 结果可验证,测试就是可执行的验收标准;
- AI 跑偏时能明确说”不满足哪条验收标准”,而不是互相猜;
- 迭代闭环更稳:写 spec → AI 实现 → 跑测试 → 带失败信息继续迭代。
面试官专门聊这个,说明行业里已经开始用工程化的方式约束 AI 输出了,而不是”prompt 一下看运气”。把需求拆成 AI 能执行的 spec,正在变成一种核心能力。
对行业里 AI 编程的感悟
现在游戏行业已经能看到一条完整的 AI 链路:AI 出需求、AI 写实现、AI 出美术资源——需求分析、编码实现、美术资产(原画、UI、音频)AI 都能直接产出初稿,工具链从”辅助提效”走向”端到端出活”。
但有意思的是,这次面试还在考装箱拆箱和 GC。我的感受是:
- 基本功依然是门槛。AI 能写出”能跑的代码”,但游戏是性能敏感行业——GC 卡顿、内存占用、热路径分配,都是要命的。能判断 AI 写的代码会不会产生不必要的装箱、能看懂 GC 行为的人,才配得上”指导 AI”。
- 开发者的重心在转移。从”写代码”变成”写 spec + 评审 + 兜底”。谁能把需求拆成 AI 能稳定执行的 spec,谁就能放大产能;spec 写得好不好,直接决定 AI 产出质量。
- AI 是放大器,不是替换器。AI 出的需求可能不完整,写的代码可能对但不高效,出的美术资源有版权和风格一致性问题——都需要人来把关。越依赖 AI,越需要有人对结果负责。
- 组合技能更值钱。C#/Unity 底子 + AI 工作流(RAG、渐进式披露、spec-driven)同时能聊,面试里本身就是个加分信号。
总结
这次面试聊的问题一半在考过去,一半在考未来:装箱拆箱、GC 是基本功,RAG、渐进式披露、spec-driven 是 AI 时代的新工具。游戏行业里 AI 已经开始端到端出活,但越是这样,扎实的底子越值钱——因为你要负责判断 AI 干得好不好。对个人来说,把”能写代码”升级成”能写 spec、能评审、能让 AI 稳定产出”,可能是接下来最值得投入的方向。