多乐游戏
多乐游戏一面(技术面)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.如何比较两个包的差异,来从资源服务器下载呢?通过比较资源包的版本号也就是MD...
哈乐沃德面试
在你的类银河恶魔城中是如何控制人物状态的切换的?在我的这个项目中,我使用的是有限状态机来实现人物状态的切换的,使用PlayerStateMachine类作为中间类,在该类初始化人物的初始状态,同时提供了一个ChangeState类作为状态切换的方法。同时使用PlayerState作为人物状态的基类,当检测到人物状态需要改变时,调用相应的ChangeState方法来修改状态 在你的项目中,你的人物的速度是线性增加的还是直接为设置的速度?如果实现人物速度的逐渐增加?物速度是直接使用设置的固定值(如moveSpeed、dashSpeed等)。例如PlayerMoveState中通过player.SetVelocity(xInput * player.moveSpeed, rb.velocity.y)直接应用设定的速度。我们可以使用自带的函数方法 1234567891011121314// 在Player类中添加加速相关变量public float acceleration = 2f; // 加速度private float currentSpeed;// 在移动状态的Update中使用...
冰川网络客户端笔试
1.2.3.4.
冰川网络客户端实习笔试
冰川网络ref,out的区别以及各自的应用场景?ref 关键字 传递前必须初始化:调用方法前,实参必须被赋值(初始化),否则编译报错。 作用:既可以将外部变量的值传入方法,也允许方法修改该变量的值并反馈给调用者。 本质:”双向传递”—— 输入 + 输出。 out 关键字 传递前可以不初始化:调用方法前,实参可以未赋值,方法内部必须为其赋值(否则编译报错)。 作用:主要用于让方法返回多个值(除了方法的返回值外,通过 out 参数输出额外结果)。 本质:”单向输出”—— 仅输出(方法必须给 out 参数赋值)。 一款游戏再游玩的过程中内存消耗大,帧率低,定位原因以及怎么解决(C#,xlua的游戏)?问题定位方法 内存消耗大: 用 Unity Profiler 区分托管内存(C# 对象)和非托管内存(资源),关注 GC 分配和内存泄漏(如场景切换后内存未下降)。 xLua 侧检查闭包、全局变量泄漏,用 xLua Profiler 分析 table 创建释放情况。 帧率低: 用 Unity Profiler 定位 CPU/GPU 瓶颈(如 Main Thread 耗时、...
八股文
C#相关1.值类型和引用类型值类型:bool,float,int,double,struct,enum 引用类型:string ,class,object,delegate,array,interface 区别: 值类型存储再栈上,引用类型存储在堆上。相应的栈上的值类型存储快,堆上的引用类型存储满 值类型存储的为真实的值也就是实际数据,引用类型指向的是内存堆中的指针和引用 值类型在使用后自动释放,引用类型使用GC来释放 值类型的继承是System.ValueType ,System.ValueType继承于System.Object,引用类型继承System.Object 值类型在栈中存储的是直接的值,引用类型数据本身实在堆中,栈中存放的是一个引用的地址 底层: 引用类型在实例化时,先在栈内开辟空间,用于存储堆中对象的地址,然后在堆内开辟空间,存储引用对象。 而值类型直接在栈中开辟空间存储对象。值类型也有引用地址,但都在栈内的同一空间。 在参数对象进入方法体内,实则是在栈中开辟了新的临时空间。(也就是参数对象的副本)栈内值类型的修改,由于栈中地址不同,所以值类型不...
儒意景秀一面
1.快速排序的原理随机选一个基准值 pivot(避免最坏情况 O (n²)) 把基准交换到数组末尾(方便统一处理) 用一个指针标记 “小于基准区” 的边界 从头遍历数组: 遇到比基准小的元素 → 放到 “小于区”,指针右移 遇到比基准大的元素 → 跳过 遍历结束后,把基准放回 “小于区” 和 “大于区” 中间 递归处理左右两部分 2.Mask以及Rect Mask 2D的区别是什么?都是两者都是图形遮罩 Mask的使用场景更通用可以用任意形状的 Image / Sprite 做遮罩,而Rect Mask2D主要用于矩形遮罩,不能做圆形、异形遮罩 Mask开销大,容易打断 UI 合批,大量使用会掉帧,Rect Mask 2D性能极高,几乎无额外开销,适合滚动列表、背包等大量遮罩 Mask:基于 Stencil Buffer(模板缓冲),GPU 层面实现,会打断合批,Rect Mask 2D:基于 裁剪矩形,纯 CPU 计算裁剪范围,不占用 Stencil(模板) Mask:支持多层嵌套 Rect Mask 2D:不支持嵌套,只能一层 3.OutLine的实现方式是...
乐易网络
一面二面
乐信圣文面经
帧同步和状态同步区别 帧同步只同步玩家输入指令,所有客户端运行相同的确定性逻辑,保证相同输入产生相同结果,适合RTS、MOBA类游戏;状态同步则直接同步游戏对象的状态数据(如位置、血量等),服务器作为权威来源,客户端主要负责表现,适合MMORPG、FPS等游戏。两者核心区别在于同步的内容不同:帧同步同步”操作”,状态同步同步”结果”。 帧同步注意事项及不同步原因 帧同步必须保证所有客户端逻辑代码完全一致,使用定点数避免浮点精度问题,统一随机数种子,避免使用本地时间。不同步原因包括:浮点数计算精度差异、随机数未同步种子、逻辑代码版本不一致、网络丢包导致指令丢失、多线程执行顺序差异等,在实际项目中经常遇到因浮点数运算或时间戳使用不当导致的同步问题。 预测、插值与校正实现方式 客户端预测先在本地执行操作并显示结果,服务器验证后发送权威状态;插值通过平滑过渡 between 历史状态来消除网络抖动,保持画面流畅;校正当客户端预测与服务器状态不一致时,以服务器数据为准进行位置修正,并通过插值平滑过渡到正确状态,避免瞬间跳跃。 逻辑层与表现层分离原因 分离逻辑层和表现层主要为了确保游戏逻辑的...
乐信圣文笔试题
乐信圣文5进制的1023转换为10进制是多少?转换为7进制是多少?计算过程: 1023(5) => 15^3 + 0 + 25^1 + 3*5^0 = 125+10+3= 138(10) 138(10) => 138/7= 19…5 19/7 = 2….5 2/7=0…..2 255(7) = 51+57+2*49= 40+98= 138(10) 答:5进制的1023转换为10进制是138。转换为7进制是255。 比较四种排序算法的时间复杂度,空间复杂度,稳定性,适用场景(插入,快排,归并,堆排) 排序算法 时间复杂度(平均) 时间复杂度(最坏) 空间复杂度 稳定性 插入排序 O(n²) O(n²) O(1) 稳定 快速排序 O(nlogn) O(n²) O (logn)(递归栈) 不稳定 归并排序 O(nlogn) O(nlogn) O (n)(辅助数组) 稳定 堆排序 O(nlogn) O(nlogn...