2022-04-23 01:06:41
需清晰阐述项目内容、开发引擎、前端渲染方式及选择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侧重不同)。
询问对腾讯和雷火的考虑,展示对公司的关注和思考。
再次进行自我介绍,详细说明实习期间的主要任务和挑战性工作。
Lua反射与热更新:深入讲解Lua反射热更的细节,结合具体实例说明热更新的实现方式和注意事项。例如,如何通过反射机制获取对象的属性和方法,并在热更新时动态替换。
Lua元表与ToLua:进一步探讨Lua元表的工作原理和__index的用法,以及项目中采用的ToLua框架的使用方法和优势。
Unity与Lua交互:说明在Unity中对象传到Lua中的表现形式,以及在Lua中如何访问C#对象的成员和在C#侧通过ToLua框架访问对象特定字段的方法。
深入理解C++中的移动语义和拷贝语义,包括移动构造函数、拷贝构造函数、移动赋值运算符的实现和区别。
掌握左值和右值的概念及其转换方法,以及对于一个含有指针成员的类,如何正确实现其拷贝和移动操作以避免内存泄漏。
了解malloc和new的底层实现,包括它们调用的系统调用和内存管理方式。
完成图形学课程的学习,并掌握相关算法,如求反射向量、判断点与三角形的关系、判断射线与AABB的相交等,并能用代码实现。
了解公司对正式员工的培训机制和不同项目组之间的技术交流方式(内部分享平台、讲座)。
确认公司是否有Code Review流程。
进行自我介绍,并说明实习是否转正、实习期间的工作内容和遇到的问题。
Lua热更新:了解Lua热更新的原理和注意事项,如如何保证热更新的安全性和兼容性。
项目规模与模块:说明项目的参与人数和完成的模块,以及前端渲染的实现方式。
ECS架构优势:阐述ECS相比面向对象的主要优势,如更好的数据局部性和并行性、更灵活的组件组合方式。
序列化方案:了解常见的序列化方案(如protobuf、JSON等),以及其中可能涉及的大小端问题(不同平台对字节顺序的处理方式不同)。protobuf通过varint实现数据压缩,varint是一种可变长度的整数编码方式,通过使用变长字节表示整数,减少数据存储空间。
掌握C++中delete this的使用场景(通常在对象自己管理资源且确定不会被再次使用时调用),以及在nullptr上调用成员函数和虚函数的结果(调用成员函数可能产生未定义行为,调用虚函数通常不会执行任何操作)。
了解进程的内存空间分区(包括代码区、数据区、堆区、栈区等),以及堆和栈的内存地址增长方向(堆从低往高增长,栈从高往低增长)。
理解malloc的内部实现(通常通过链表管理内存块),以及页面置换的算法(如FIFO、LRU等)。
了解多线程编程的基本概念,掌握自旋锁和mutex的使用场景(自旋锁适用于短时间等待的场景,mutex适用于长时间等待的场景),以及mutex的缺点(如可能导致线程阻塞、上下文切换开销等)。
理解用普通int实现引用计数的线程安全问题(非线程安全,需使用原子操作或互斥锁保证线程安全)。
了解游戏渲染的基本流程和光栅化算法(如三角形的光栅化和线段的光栅化),以及深度测试的原理和作用。
对引擎内特效表现制作有一定了解,展示对游戏开发全流程的掌握。
了解项目组的分配情况(发Offer时才会给出)和可能被分配到的项目类型(新项目、老项目都有可能)。
询问校招生加入上线很久的项目后能做的工作(如技术迭代和升级)。