4399游戏服务器开发一二三面:C++八股、UDP与匹配设计
- 轮次
- 一面+二面+三面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
一面(技术面)
- 请用两分钟做自我介绍。
- 平时玩哪些游戏?
- 项目没有游戏相关内容,为什么想做游戏?
- C++ 与 C 有什么区别?
- 请介绍智能指针,项目中是否使用过?
- C++ 多态和虚函数是什么?
- 多线程如何避免数据竞争和死锁?
- 数组和链表有什么区别?
- 只拿到单链表当前节点指针,如何 O(1) 删除?有什么限制?
- 二叉树有哪些遍历方式,如何求高度或最短路径?
- 红黑树有哪些特性?
- 如何设计同时考虑段位和等待时间的匹配?
- TCP 与 UDP 有什么区别?
- 如何在 UDP 上实现可靠传输?
- 游戏中哪些业务适合 TCP,哪些适合 UDP?
- RAG 项目做什么,具体链路是什么?
- 是否使用 AI 编程,使用过哪些工具?
- 是否尝试过策划、执行等多 Agent 分工?
- 你有什么想问团队的?
二面(HR面)
- 现在在学校还是在家?大四课程和论文时间如何安排?
- 为什么选择游戏服务器开发?
- 游戏 Demo 为什么没写简历?做过几个、何时做、哪个最难?
- Unity 项目是否联网、规模多大、学习多久?其他项目使用什么技术?
- 为什么选择服务端而不是客户端?C++ 学了多久?
- 大学三年如何学习和积累技术?看过哪些开源代码?
- 下载开源模型/代码后做了什么优化?是否有量化结果?
- 技术文章从何时开始、是否原创?
- 快手实习如何获得、何时结束、是否有留用机会?
- 当前有哪些 Offer、分别是什么岗位和城市?
- 城市如何排序?毕业前何时能开始实习、能持续多久?导师是否知情?
- 除完成分配任务外,主动做过哪些有价值的事?
- 两个案例中参与哪个更深?具体贡献、创意来源、角色分工和进度是什么?
- 工具是否真实被使用?多少人使用?提效多少?还有哪些不足?
- 同事和上级给过什么建议?如何平衡 AI 提效与独立思考?
- 自己还有哪些能力、性格或习惯需要改善?
- 实习作息如何?毕业后能接受什么节奏?怎么看周末加班?
- 大学成绩、挂科和排名如何?为什么不考研或考公?
- 家庭所在地、父母行业、兄弟姐妹及父母对就业城市的态度?
- 平时有哪些爱好?玩什么游戏、游戏投入多少?
- 期望年薪、现有 Offer 薪资,为什么给出当前期望?
- 对公司和岗位有什么反问?是否认真看过 JD?
三面(产品面)
- 请做简单自我介绍。
- 后端业务有哪些难点,重点解决用户什么问题?
- 过去经历中有哪些创新或有意思的设计?
- 是否做过玩家之间的实时状态同步?
- 如何看游戏行业,为什么选择 4399?
- 个人经历与游戏有哪些结合?如何看待不同游戏类型?
- 是否体验过单机、剧情、网络和近期产品?偏好什么品类?
- 是否通过技术社区或行业交流了解游戏服务端的职责和流程?
- 是否有具备主导性的团队协作经历?
- 技术成员对团队和产品的核心交付价值是什么,应优先确保什么?
- 3—5 年后希望成为怎样的人,工作与生活状态如何?
- 如何概括自己的核心特质?
- 对 4399 的产品方向和未来定位有什么问题?
- 日常怎样使用 AI?
- 从产品角度看,自己还需要提升什么?
《参考解析》
C++ 与数据结构:这一轮的八股都问在「取舍」上
C 与 C++ 的区别不要只答「面向过程 vs 面向对象」,更值得说的是 C++ 多出来的那套工程手段:RAII 让资源跟着对象生命周期走、模板提供零成本抽象、异常与命名空间改变了大程序的错误处理和符号管理方式;而 C 的编译产物更小、和硬件更近,所以底层库、驱动仍然用它,C++ 代码也常靠 extern "C" 暴露接口给 C 调用。智能指针按所有权分:unique_ptr 独占、不可拷贝可移动,shared_ptr 用引用计数共享、控制块本身线程安全但指向的对象不是,weak_ptr 专门用来打断循环引用——被追问项目里用过没有时,讲一个「谁持有、什么时候释放」的真实场景比背 API 有效,比如网络层用 shared_ptr 管连接、定时器里只存 weak_ptr 防止连接被定时器吊住不释放。
多态这块要点出编译期与运行期两条路:重载与模板是静态多态,虚函数靠对象的 vptr 指向类的虚函数表在运行时派发,所以基类析构必须写成虚的,否则通过基类指针 delete 派生对象只会析构基类部分。多线程的追问标准答法是两边都覆盖——数据竞争靠锁、原子变量和无共享设计(线程本地、消息传递)解决,锁的粒度要小、别在持锁期间做 IO 或回调;死锁则从四个必要条件下手,工程上最有效的是全局固定的加锁顺序、一次用 std::scoped_lock 锁多个互斥量、以及给等待加超时兜底。
链表与树那几题是纯基本功,但都有「追问点」。数组和链表比的是随机访问 O(1) 对 O(n)、插入删除代价、以及数组的缓存局部性更好。O(1) 删除单链表节点只有在拿不到前驱时才用「把后继的值抄到当前节点、再删后继」这个取巧办法,限制很明确:节点不能是尾节点,而且真正被摘掉的是后继节点,如果别处还存着后继节点的指针就会悬空,所以它更适合内部临时链表。二叉树遍历说清前中后序的递归与显式栈写法、层序用队列即可,求高度是后序递归取左右子树最大值加一;「最短路径」要先分清场景——无权图用 BFS 逐层扩展,带权图就不是 BFS 能解决的,主动补这一句能显示你没有被题干带跑。红黑树的特性按四条记:节点非红即黑、根为黑、红节点的子节点必须为黑(不存在连续两个红)、任一节点到其所有叶子的黑节点数相同;由此保证最长路径不超过最短路径的两倍,插删时的旋转次数比 AVL 少,这正是 STL 的 map/set 选它的原因。
网络:TCP/UDP 的区别最终要落到业务选型
TCP 与 UDP 的区别可以按「连接、可靠性、有序性、传输形态、开销」五条对比,但面试官真正想听的是后半段。在 UDP 上做可靠传输,本质是自己在应用层重建 TCP 的那几件套:给报文编号并做确认、超时或收齐重复 ACK 后重传、用滑动窗口做流量控制与去重排序、再补一套拥塞控制避免把链路打爆;KCP 这类协议就是用更多带宽和 CPU 换更低延迟的典型。游戏里的选型标准是「这条消息丢了会怎样」:登录、充值、交易、聊天、背包变更这类必须到达且要求一致的操作走 TCP 或可靠通道;位置、朝向、技能表现这类高频状态可以走 UDP,允许丢包,因为下一帧的新状态会覆盖旧值,为此付出的代价只是瞬时表现不一致。实战里更常见的是混合通道,关键事件走可靠、状态同步走不可靠,弱网环境再叠一层基于 UDP 的可靠协议。
业务设计题:匹配系统怎么同时照顾段位和等待时间
这道题的答法是先给目标函数,再给机制。匹配的本质是在「对局质量」和「等待时长」之间做权衡:每个玩家维护一个 MMR(可由 Elo、Glicko、TrueSkill 之类的评分系统算出,段位只是它的展示分桶),撮合时在同一分桶内找分差最小的对手。等待时间一长就单调放宽搜索窗口——比如每等 5 秒把可接受的 MMR 差扩大一档,直到超过一个上限后接受跨段匹配,这就是「段位优先、等待兜底」的实现。工程上不要每人来一次就全局搜一遍,而是按 tick 定时从队列里撮合,用分桶加优先队列控制复杂度;同时要预留几个现实变量:多人组队时取队伍平均分并额外考虑队伍分差、跨区匹配受延迟限制、冷门分段或深夜可能长时间无解,得提前想好放宽策略或补位手段。能把这几个变量主动摆出来,比直接背一段伪代码更像做过系统。
HR 面与产品面:这两轮筛的不是知识
二三面几乎不考技术,问的是稳定性、动机和一致性。HR 面的高频内核是「你会不会来、能待多久、有没有更好的选择」——到岗时间、实习时长、导师是否知情、手上有哪些 Offer 和期望薪资、能不能接受加班节奏,都属于这一层;回答的原则是给确定的日期与范围而不是含糊的「可以」,一是一二是二,因为这些话后面会被拿去和技术面的说法对账。它还会用你简历上的细节做真伪校验:项目做了几个、文章是否原创、实习怎么拿到、工具到底被多少人用,凡是写得夸张的地方都会在这里被翻出来。产品面则看你对游戏是不是真有热情和理解——玩什么品类、怎么看行业、为什么是这家公司,靠临时背官网介绍很容易被问穿。原帖没有写最终结果。