多乐游戏
多乐游戏一面(技术面)
1.自我介绍
2.Lua热更新
Lua热更新一般是结合AssetBundle来实现资源和代码的热更新。
首先是代码层面,会把需要热更的逻辑用Lua编写,再把lua脚本打包成AB包,游戏启动时先加载基础的C#核心框架,然后通过Lua虚拟机加载Lua代码;如果后续有代码更新,就从服务器拉取新的LuaAB包,替换本地的旧包,重启游戏或者重载Lua虚拟机就能生效,不用重新安装整个游戏。
资源热更新也就是类似的,把UI贴图,场景资源这些打成AB包,标记好版本号,客户端对比服务器版本,下载更新后的AB包替换本地资源,就能实现资源的热替换。
3.AB包和Lua脚本一般放在那里
1.在本地测试的阶段一般放在Unity项目的StreamingAssets目录下,这个目录的内容会被打进安装包,游戏刚启动就可以从这里读取初始的Lua代码和AB包。
2.正式上线后更新的LuaAB包会下载到PersistentDataPath目录,这个是游戏在设备上的可读写目录,重启游戏会优先加载这个目录的新包,会覆盖旧逻辑
4.如何比较两个包的差异,来从资源服务器下载呢?
通过比较资源包的版本号也就是MD5号。因为每个文件都会生产对于的MD5值作为标识,它相当于文件的“指纹”,能精准反映文件内容。我们会把本地文件的MD5和服务器上最新文件的MD5作比较,一旦发现不一致,就说明文件有更新,就会拉取服务器上的最新文件替换本地旧文件。
5.假如说本地有1000个文件,其中修改了100个文件,如何对比呢
首先游戏启动时,先会从服务器拉取最新的文件MD5清单和本地存储的旧清单做对比。接着找出100个MD5值不一致的旧文件,生成差异更新列表。然后只下载总这100个更新后的文件,替换本地对应路径的旧文件,然后更新本地的MD5清单,下次启动就会用新的文件了
6.如果在下载文件的时候传输断了会续上上吗?
比如说在热更新的时候,它是文件一个一个比对,如果说比对到50个的时候,网络断开。
1.普通断点续传:一般会把每个要下载的文件分块,比如分成1MB大小的块,每次下载完一块就把已经完成的块信息存在本地的临时文件里。如果中途断了,下次下载的时候就会先读取这个临时文件,只下载没完成的那些块,最后再把完整的块合并成完整文件
2.如果没做每块处理,那只能重新下载整个文件
7.相比C++,C语言,C#有什么优势
1.开发效率高
2.和Unity深度适配
3.语法简洁容易维护
4.学习成本低
8.C#中的GC在什么时候执行呢?
9.struct和class有什么区别?如果是频繁创建的话,哪个比较合适?开销上的区别大吗?
10.async和await必定一起出现吗?Await还会在什么场景出现呢
11.await内部的实现原理
12.Finalize,Dispose有什么关系?Dispose方法安全吗?
13.this指针的内容?以及在C++中如何理解它的?
接下来就是一些C++的需要你判断代码的正确以及一些C++的选择题
14.虚函数的原理
15.两个手撕(一个是单例模式,一个翻转链表)
多乐游戏二面(技术面)
1.自我介绍
2.对自己在学校的情况作自我介绍,围绕3个点?
3.第一点:将一下计算机相关的重点开场的学校情况,成绩说一下
4.第二点:谈谈自己的项目,挑挑一两个有代表性的项目,重点围绕技术成长,技术收获,遇到了什么问题,怎么解决的
5.第三点:谈谈自己的职业规划
6.面试官开始介绍公司
7.技术面试部分(主要是C++方向)
- 描述C++和C#for循环中,循环变量初始化,条件判断,循环迭代变化,循环体四个部分的执行顺序,描述2个循环周期
- 一个单层for循环的时间复杂度受到哪些因素的影响
- 如果for循环的循环遍历变为i * 2,它的时间复杂度是多少
- i++和++i有区别吗,区别在哪
- i++和++i在循环是等效的吗?循环次数有没有变化?
- 怎么理解C++多态
- 函数重载的函数列表相同但是返回值不同正常吗,能通过编译吗?
- 了解函数签名吗?
- 子类对虚函数进行重写或者不重写的2种情况,其虚函数表,虚函数指针在处理上有什么差异?
- 具有继承关系且包含该虚函数的两个对象,一般是怎么进行类型转换
- 了解动态类型转换的几个关键字吗?
- 用过dynamic这个关键字吗?
- 堆和栈在功能性上的差异,使用上的差异在哪里?
- 用过C++的智能指针吗?
- C#是怎么进行内存管理的
- 细化一下C#GC回收的触发时机
- 聊聊全局变量和静态全局变量
- 谈谈链表和线性表的基本特质以及适用场景
- 说说堆排序的实现思路以及时间复杂度
- 聊聊drawcall是什么以及降低drawcall的方法
- 结合自身经历,阐述图片最终呈现在手机的过程中,计算机系统及程序员参与的工作有哪些?
