游戏开发(客户端)面试题及答案.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

游戏开发(客户端)面试题及答案

一、基础技术题

问题:在Unity/Cocos中,如何避免频繁创建销毁游戏对象导致的性能问题?实际开发中你是怎么做的?

答案:主要用对象池(ObjectPool)。比如做子弹系统时,先初始化一批子弹存到列表里,需要发射时从池里取出来激活,销毁时不真删,而是禁用后放回池。注意两点:一是池的初始大小要根据实际需求设(比如每秒最多100发子弹,池初始设80个,避免频繁扩容);二是放回时要重置状态(比如子弹位置、速度、碰撞检测开关),防止下次复用出问题。之前做射击游戏时,没重置子弹碰撞体导致过“幽灵子弹”,后来加了重置步骤才解决。

问题:C++开发中,智能指针(shared_ptr/unique_ptr)在游戏资源管理里怎么用?要注意什么坑?

答案:shared_ptr适合管理多个对象共享的资源,比如场景里多个怪物引用同一份模型资源;unique_ptr适合独占资源,比如单个角色的动画控制器。坑点主要是循环引用,比如A对象存了B的shared_ptr,B又存了A的,会导致内存泄漏。解决办法是一方用weak_ptr,比如怪物A引用玩家B用shared_ptr,玩家B引用怪物A用weak_ptr,需要访问时先lock()检查是否有效。另外别滥用shared_ptr,比如频繁创建的临时对象用unique_ptr更高效,之前做背包系统时用shared_ptr管理道具,后来发现频繁拷贝开销大,换成unique_ptr加移动语义后帧率提了5帧。

问题:怎么优化游戏中的DrawCall?举个你实际优化过的例子。

答案:核心是减少批次,常用方法有静态合批、动态合批、Instancing。比如之前做3D场景时,地面上有几百个相同的石头模型,一开始每个石头一个DrawCall,帧率只有30多。后来把石头设为静态(Static),Unity自动合批后,DrawCall从300+降到20+,帧率直接到60。但要注意动态合批有上限(比如Unity默认动态合批顶点数不超过300),如果模型顶点多,就得用Instancing,比如做森林时,大量相同的树用GPUInstancing,只需要1个DrawCall。

二、进阶应用题

问题:游戏运行中出现“刚体穿透”(比如快速移动的角色穿过墙壁),你会怎么排查和解决?

答案:先排查原因:一是物理步长问题,比如FixedTimestep设太大(默认0.02秒),快速移动的物体在两步之间跳过了碰撞体;二是碰撞体精度不够,比如用了胶囊体代替复杂模型,导致检测不精准;三是物体移动方式错了,比如直接改transform.position,没走物理引擎的MovePosition。

解决过一个赛车游戏的穿透问题:赛车速度快时穿墙,先把FixedTimestep从0.02调到0.01,同时给赛车和墙壁开了连续碰撞检测(CCD),再把移动逻辑从改position换成rb.MovePosition,最后加了一层“边界触发器”,穿透时强制拉回,问题就解决了。

问题:移动端游戏shader优化有哪些关键点?举个你踩过的坑。

答案:关键是减少计算量和带宽消耗:①少用纹理采样,能用纹理图集就别分多个纹理;②避免分支(if/else、for循环),比如判断角色是否受伤,用step(受伤值,0)代替if;③降低精度,移动端用half代替float(比如颜色值),复杂计算放顶点着色器(vs)而不是片元着色器(ps),因为ps每像素都算,vs只算顶点。

之前做2D角色shader,在ps里写了for循环做渐变效果,在高端机没问题,低端机直接掉帧到20。后来改成用uv.x乘以系数做线性渐变,去掉循环,帧率立刻回到50+。

问题:游戏保存存档时,怎么保证数据不丢失、不被篡改?

答案:分三步:①数据序列化,用protobuf或Json(别用Xml,太占空间),把玩家等级、道具等数据转成二进制;②加密,简单的用XOR异或(适合小规模数据),复杂的用AES加密,密钥存在代码里(别存在本地文件,容易被反编译);③校验,加CRC32或MD5校验码,存档时计算数据的校验码一起存,读档时重新计算校验码对比,不一致就提示存档损坏。之前做单机游戏时,没加校验,玩家改存档文件导致数据错乱,加了CRC校验后就没再出现过。

三、项目实操题

问题:你负责的游戏模块出现内存泄漏,怎么定位和解决?举个实际案例。

答案:定位用工具:Unity用Profiler的Memory模块,C++用Visua

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档