91Act客户端笔试分享(19秋招)

1.假设你在制作一款FPS手游,请基于如下代码,回答下列问题。回答程序代码问题时,实现语言不限。

const float MAX_VISION_DISTANCE = 10;
const float MAX_VISION_ANGLE = 45;

struct vec
{
float x;
float y;
float z;
}

vec vecAdd(const vec& a, const vec& b);
vec vecSub(const vec& a, const vec& b);
float vecDot(const vec& a, const vec& b);
vec vecCross(const vec& a, const vec& b);
vec vecNormalize(const vec& a);
float vecLength(const vec& a);

对于游戏的AI部分,当玩家进入到AI角色的扇形视野范围内时,AI需要作出相应的反应。请实现下列位置判断函数,检查玩家位置是否在AI角色的扇形视野范围内:

bool IsPlayerInVision(const vec& aiPosition, const vec& aiDirection, const vec& playerPosition)

2.当玩家射击时,如果子弹从AI角色身旁近身飞过,AI需要作出反应。请实现下列判断函数,检查子弹是否是在一定距离内(NEAR_MISS_DISTANCE),从AI身旁飞过。

const float NEAR_MISS_DISTANCE = 2;

bool IsBulletNearMiss(const vec& aiPosition, const vec& bulletOriginPosition, const vec& bulletDirection);

3.对于AI角色整体行为,策划决定设计为:普通情况下,他按既定路线巡逻;当发现玩家在视野范围内后追击玩家;当距离靠近到一定范围内时对玩家射击;若命中玩家或玩家离开视野,则回到巡逻路线;若玩家射击AI角色,子弹命中被击杀,子弹近身飞过则播放受惊吓动画。

请简述你在程序上会通过怎样的方法来实现这段策划需求。然后通过简要的伪代码或者画图表的方式,表述你实现方法中的主要逻辑。

  • 抽象出AI的状态,即:巡逻、追击玩家、射击、被击杀、受惊吓,以及这些状态之间的转移条件:发现玩家、接近玩家、命中玩家、被子弹击中等。
  • 实现这些逻辑
  • 用behaviortree或playmaker等插件,将这些逻辑抽象为节点,提供给策划进行节点的自由组合

4.在游戏中会出现约1000个AI角色,玩家需要不断跟踪距离最近的100个AI角色,因此这100个AI角色会随时变化。请描述你会通过什么数据结构(比如链表,连续数组,等等)来实现,以及这种数据结构会利于对这100个AI角色元素进行哪种类型的操作。

hashtable,除了初次建表耗时稍多以及空间稍多之外,插入删除查询操作的时间复杂度都是O(1)

5.假如在不断追踪AI角色的过程中,因为数量较大,出现了性能瓶颈,导致帧率较低,需要你调查。请简述你的解决方案。

  • 将AI追踪角色的每帧轮询减少为固定时间间隔轮询,如每隔0.5秒追踪一次
  • 限制AI追踪角色的条件,如至少在一定距离内才追踪(其实就是让其休眠)
  • 将AI追踪角色分解为搜索玩家->向玩家移动->其他逻辑,如果在搜索玩家阶段没有找到,则不进行之后的逻辑

6.在这款FPS游戏的所有程序实现上,请简述你觉得可以使用的设计模式,以及对应的具体场景,和使用它的意义。

  • 状态模式:将实体的行为分解到不同状态中,方便管理不易出错,容易修改,可复用(如敌人B除了外观不同,与敌人A的行为逻辑一致,或者说有不少共同状态如待机、追踪等,那么即可复用这些逻辑)
  • 对象池模式:缓存子弹等经常创建、销毁的物体,减少GC

7.如果这款射击游戏支持多人联机PVP模式。你会使用TCP还是UDP网络协议,这样选择的优势和劣势有哪些?

8.在PVP模式中,你会通过怎样的网络同步机制来实现玩家与玩家之间的同步,为什么选择这种方法。除此以外,你是否还了解其他的同步方法,以及此方法适合的游戏类型/特征。

9.在你之前的开发经历中,遇到过哪些棘手的问题,简述你是怎样解决的。(比如,在开发的程序运行时,有时会出现莫名其妙的闪退(Crash)现象。运行的结果不符合预期,你花了很长时间才解决。)

10.在这款游戏的开发过程中,如果可以使用任意语言完成不同游戏模块(比如基础框架,Gameplay,UI,网络通信,等等)、工具(比如pipeline中可以引入的自动化处理脚本,编辑器,等等)的制作。请描述你更愿意或熟悉在哪个部分使用哪种语言,以及为什么选择这款语言完成这部分工作。

  • 网络通信:C++,效率优先
  • GamePlay:用支持热更新的语言,如Lua,因为GamePlay改动需求多
  • 不经常变更的主要模块:用引擎的脚本所支持的语言

11.如果游戏是用Unity引擎开发,发现游戏中渲染效率低下,且和DrawCall相关,请简述你可能会采用的优化方法。

12.请简述Unity中协程(Coroutine)的用途,使用方法,和你会使用它的场景。

  • 用途:可以很方便地让一段逻辑以异步的方式执行
  • 使用场景:资源加载、延时逻辑等不希望阻塞主线程的行为
  • 使用方法:WaitForSeconds实现通用的逻辑延迟

13.是否有在Unity中编写过Shader?如果有,请简述vertex shader和fragment shader的用途。

14.是否了解Unity工程中Native插件的工作原理?以及如果开发过,请列举开发过Native的插件。

来源:

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值