游戏客户端面经 网易雷火(一面、二面、HR面、OC)

游戏客户端面经 网易雷火(一面、二面、HR面、OC)
最新回答
梦他

2022-04-23 01:06:41

网易雷火游戏客户端面试经验总结

一面(交叉面A,51分钟)

  • 自我介绍与项目考察

    需清晰阐述项目内容、开发引擎、前端渲染方式及选择Qt的原因,说明团队分工和遇到的问题,反思项目框架和库的选择。

    ECS架构:理解ECS(实体-组件-系统)的核心概念,包括其将数据与逻辑分离的设计思想。需指出ECS的不足,如可能增加代码复杂度、调试难度较大,以及在小型项目中可能因架构过重而影响开发效率。

    MVC与MVVM:MVC(模型-视图-控制器)通过分离模型、视图和控制器来组织代码,适用于需要明确划分数据、界面和业务逻辑的场景;MVVM(模型-视图-视图模型)引入视图模型实现数据双向绑定,更适合数据驱动的界面开发,如WPF、Angular等框架的应用。

    项目数据规模:明确项目运行时的数据规模,包括实体数量、数据更新频率等,以展示对项目性能的把控能力。

  • 实习经历

    说明实习是否获得转正Offer,详细描述实习期间的主要工作,包括开发功能的实现方式、界面层级关系的处理方法。

  • 技术能力

    Lua语言:需扎实掌握Lua,包括闭包的概念(闭包是函数和其引用的外部变量的组合)、数据存储方式(闭包中的外部变量存储在闭包对象中)、值类型(如number、boolean)和引用类型(如table、function)的区别,以及table的深拷贝方法(可通过递归复制或使用元表实现)。了解Lua元表中__index(用于查找不存在的字段)和__newindex(用于设置新字段)的差别,以及如何用元表实现继承和成员函数的重写、重载。在派生类重写的函数中调用基类版本,可通过在派生类函数中显式调用基类函数实现。Lua热更新的原理是通过动态加载更新后的脚本文件,替换原有的函数或数据。若要影响已实例化的对象,可通过遍历对象并更新其引用或使用中间层管理对象状态。

    Unity与C#:说明对Unity的使用经验,以及在ToLua框架中如何访问C#对象的成员和特定字段。

    C++基础:掌握单例模式的实现,理解移动构造函数(通过移动语义转移资源,避免深拷贝)和拷贝构造函数(通过深拷贝创建新对象)的区别,以及左值(可取地址的表达式)和右值(临时对象或字面量)的区别。左值可通过std::move转换为右值。对于含有指针成员的类,需正确实现拷贝构造函数(分配新内存并复制内容)、移动构造函数(转移指针所有权)和移动赋值运算符(释放原有资源并转移指针所有权),以避免内存泄漏。了解malloc和new的区别(malloc是C标准库函数,返回void*;new是C++运算符,调用构造函数),以及它们申请内存的释放方式(malloc用free,new用delete)。malloc的底层实现通常通过系统调用(如Linux的brk或mmap)申请内存。

    图形学基础:具备GAMES101水平的图形学知识,包括求反射向量(根据表面法向和入射光方向计算)、判断点是否在三角形内(可通过重心坐标法或叉积法实现)、判断射线与AABB(轴对齐边界框)是否相交(可使用分离轴定理或Slab法)。

    计算机基础:需掌握古典概率计算、sizeof的结果判断、大小端字节序分析、树的前序中序遍历推出后序遍历等知识,以及计算机基础多选题的解答。

  • 反问环节

    了解公司研发流程中的Code Review机制(每个人的提交都会经过Review,新人和老人代码的Review侧重不同)。

    询问对腾讯和雷火的考虑,展示对公司的关注和思考。

一面(交叉面B,55分钟)

  • 自我介绍与实习考察

    再次进行自我介绍,详细说明实习期间的主要任务和挑战性工作。

  • 技术深度追问

    Lua反射与热更新:深入讲解Lua反射热更的细节,结合具体实例说明热更新的实现方式和注意事项。例如,如何通过反射机制获取对象的属性和方法,并在热更新时动态替换。

    Lua元表与ToLua:进一步探讨Lua元表的工作原理和__index的用法,以及项目中采用的ToLua框架的使用方法和优势。

    Unity与Lua交互:说明在Unity中对象传到Lua中的表现形式,以及在Lua中如何访问C#对象的成员和在C#侧通过ToLua框架访问对象特定字段的方法。

  • C++高级知识

    深入理解C++中的移动语义和拷贝语义,包括移动构造函数、拷贝构造函数、移动赋值运算符的实现和区别。

    掌握左值和右值的概念及其转换方法,以及对于一个含有指针成员的类,如何正确实现其拷贝和移动操作以避免内存泄漏。

    了解malloc和new的底层实现,包括它们调用的系统调用和内存管理方式。

  • 图形学与算法

    完成图形学课程的学习,并掌握相关算法,如求反射向量、判断点与三角形的关系、判断射线与AABB的相交等,并能用代码实现。

  • 反问环节

    了解公司对正式员工的培训机制和不同项目组之间的技术交流方式(内部分享平台、讲座)。

    确认公司是否有Code Review流程。

二面(54分钟)

  • 自我介绍与实习转正

    进行自我介绍,并说明实习是否转正、实习期间的工作内容和遇到的问题。

  • 项目与技术考察

    Lua热更新:了解Lua热更新的原理和注意事项,如如何保证热更新的安全性和兼容性。

    项目规模与模块:说明项目的参与人数和完成的模块,以及前端渲染的实现方式。

    ECS架构优势:阐述ECS相比面向对象的主要优势,如更好的数据局部性和并行性、更灵活的组件组合方式。

    序列化方案:了解常见的序列化方案(如protobuf、JSON等),以及其中可能涉及的大小端问题(不同平台对字节顺序的处理方式不同)。protobuf通过varint实现数据压缩,varint是一种可变长度的整数编码方式,通过使用变长字节表示整数,减少数据存储空间。

  • C++内存管理

    掌握C++中delete this的使用场景(通常在对象自己管理资源且确定不会被再次使用时调用),以及在nullptr上调用成员函数和虚函数的结果(调用成员函数可能产生未定义行为,调用虚函数通常不会执行任何操作)。

    了解进程的内存空间分区(包括代码区、数据区、堆区、栈区等),以及堆和栈的内存地址增长方向(堆从低往高增长,栈从高往低增长)。

    理解malloc的内部实现(通常通过链表管理内存块),以及页面置换的算法(如FIFO、LRU等)。

  • 多线程与锁

    了解多线程编程的基本概念,掌握自旋锁和mutex的使用场景(自旋锁适用于短时间等待的场景,mutex适用于长时间等待的场景),以及mutex的缺点(如可能导致线程阻塞、上下文切换开销等)。

    理解用普通int实现引用计数的线程安全问题(非线程安全,需使用原子操作或互斥锁保证线程安全)。

  • 图形学与引擎特效

    了解游戏渲染的基本流程和光栅化算法(如三角形的光栅化和线段的光栅化),以及深度测试的原理和作用。

    对引擎内特效表现制作有一定了解,展示对游戏开发全流程的掌握。

  • 反问环节

    了解项目组的分配情况(发Offer时才会给出)和可能被分配到的项目类型(新项目、老项目都有可能)。

    询问校招生加入上线很久的项目后能做的工作(如技术迭代和升级)。

HR面与OC

  • HR面:主要了解求职者的职业规划、团队协作能力、对公司文化的认同度等软性素质。
  • OC(口头Offer):若通过前面的面试环节,HR会发放口头Offer,并沟通薪资、福利、入职时间等具体事宜。