Cocos creator游戏开发面试题
1.2D游戏开发的角色动画有哪些方式,各有什么优缺点
角色动画(动作动画):人物,怪物等
动画分为两类:
·动作动画:
~帧动画:动画根据一帧一帧的时间间隔来播放也就是切换我们的图片
~骨骼动画:角色动作就是一个一个的骨骼 通过我们的骨骼动画工具来编辑,每个骨骼在动画每一帧的位置和运动的情况
·位移动画:动画编辑器来控制动画路径来做,或者用程序来控制角色,按照路径来走
·帧动画和骨骼动画的优缺点:
帧动画:性能好,每次渲染的时候只要把贴图贴过去。缺点:占内存,每个帧都是图片,所以占内存(适用于一些RPG游戏,有角色,怪物 ,但也会有骨骼动画)
骨骼动画:用spine,dragbonus--》导出的就是图集图片+骨骼在图集中的位置+运动控制参数。省内存,省空间-》图片的空间,都是一个一个骨骼,和骨骼的位置没有关系。缺点:每一帧都要CPU来根据骨骼运动的控制参数来计算骨骼每帧的 位置(pos,rot旋转等)-》消耗CPU
·选择帧动画和骨骼动画:要在内存和性能做一个取舍,选择最合适的就可以
2.2D游戏的Drawcall如何优化
图片(Sprite)+文字(Label)
Drawcall:CPU给GPU下达draw cmd的次数
性能优化而言,把越多的东西一起提交给GPU一起绘制性能会更好,Drawcall越低性能越好
·能够在一个Drawcall渲染的必要条件:
就是要在同一个图集里面:SpriteA和SpriteB一起绘制-->就需要AB对应的图片在一个大图里面。然后CPU把一个大的纹理给GPU。AB只是uv坐标不一样。
AB是同一个mesh(纹理)也就是一个quad(两个三角形)。都是用Sprite Shader 也就是AB可以一起合并,提交给GPU一起渲染。所以就只需要使用一次Drawcall
·场景的层级关系决定要渲染哪些物体:
渲染物体的提交顺序-->GPU
A1A2A3...AN|B1B2B3...BN|...
同一个图集A里面的不同Sprite;同一个图集B里面的不同Sprite;
游戏引擎就会尽可能将能够一个批次的物体一起提交给我们的GPU
A1A2A3...AN-->GPU-->GPU绘制-->drawcall
B1B2B3...BN-->GPU-->GPU绘制-->drawcall
·2D drawcall优化:(1)尽可能让渲染的物体在同一个图集里面
(2)不要让其他图集的物体打乱了我们渲染顺序
(3)Label 其实是把文字用适量渲染工具(freetype)放到文字纹理里面
多个Label 使用Chat模式可以放在一张text纹理里面
每个Label生成一个纹理的话就无法合批
3.Creator如何支持地图的分块加载
·制作2D游戏地图的方式:
(1)用ps (2)Tiledmap (3)Cocos自己的编辑器来拼接游戏地图
·地图分块是怎么回事?
内存和计算资源吃不消
·地图的分块原则:逻辑不分,视图分
*地图分块以后,我们的动态加载:
·核心思想:只加载角色周围的地图块,不是在角色周围的,我们就把这些地图块卸载
在角色周围的我们就动态加载进来
1.我们根据实际的情况,将大地图分块。多大一块?根据实际需求来,也取决于动态加载的算法
2.选取一个动态加载的算法-->九宫格的算法
九宫格:就是加载角色周围的9个块,卸载之前不用了的块。
地图分块的大小,就是结合九宫格以后,周围的地图的大小足够覆盖你的视野(手机屏幕)
在资源够的情况下,分的块越少越好,对玩家是更流畅的
3.九宫格算法,是如何触发地图“视图”
·初始化,当主角玩家出生到地图以后,首先根据玩家在大地图的位置,算出来玩家所在游戏地图的块以及周围8个块,然后把这8个块的地图视图资源加载进来,创建到我们的游戏场景中。
·玩家的移动,是触发地图动态加载的原因
4.2D游戏如何实现地图跟随玩家滚动? 边界情况如何处理?
·地图的大小,超过了屏幕的大小。玩家移动多少,摄像机就跟着移动多少,玩家始终就会保持在屏幕的中央
·边界情况:
1.根据地图大小,根据屏幕大小,计算出摄像机的位置可以移动的坐标范围
2.当摄像机跟随玩家的时候,还是跟着玩家的坐标来更新,但是更新完后,要判断一些,x的限定范围和y限定范围。x<x_min(max),x摄像机=x_min(max)
·
5.2D游戏中物理引擎如何优化?
·游戏开发中的性能热点:渲染,物理引擎,逻辑代码(可能不大)
·物理引擎性能和刚体数目挂钩
·物理引擎非常消耗开销:
运动的物体都是要参与计算,无法待机
1.物理引擎的内核:(改善不大)
Box2D作为2D物理引擎的内核;
common内置的物理引擎内核
2.选取形状简单的shape,collider碰撞器:圆形>矩形>多边形
3.物理引擎的迭代的时间间隔设置,项目通用设置里面
4.给代替方案。地图做成格子
6.游戏开发中如何处理excel表格?
*如何解析excel:
excel表格是策划比较喜欢使用的一个表格,但Cocos无法直接处理,需要转换
·1.excel->json文件,用flashexcel
·-》csv文件
2.加载文本文件->TestAsset来加载
json,csv都是TestAsset加载-》就可以得到文本的内容
3.解析
json-->JavaScript/typescript--》直接使用API,就可以解码成object对象直接使用
csv-->内置的csv文本解析库--》直接使用API解析
*如何与策划配合
提炼策划的需求
字段ID 字段1,字段2,字段3.。。
string string number int
内容1
内容2
内容3
内容4
解析,使用->查询对应的数据
7.说说屏幕适配的原理与常用手段
分析题目:
1.美术:设计分辨率
2.适配策略
=== >
1:美术在设计我们的UI的时候,他以一个设计分辨率来做设计?
a:我们要能适配当下目标主流的机型;1920x1080
b:我们还要考虑我们的内存大小:1920x1080 --- >设计 --- 》内存占用,960x540内存占用大;
用户的手机屏幕+内存大小 --- 》设计分辨率;
1920x1080, 1280x720;
2:当我们设计分辨率定下来了以后,我们所有的设计基于这个分辨率来做;
我们的UI --- 》不同的手机屏幕 1280x720设计分辨率 ---- 》1920x1080这个目标屏幕上;
横向的维度来进行调整,纵向的维度来进行调整;
游戏引擎引入了一个逻辑分辨率的概念;就是将我们的适配的 --- 》逻辑分辨率,在逻辑分辨率上做适配;
逻辑分辨率:就是让一个维度不变,另外一个维度来适配 --- 》2个维度需要适配的问题 --- 》只在一个维度上做适配;
做一个决定:你到底是哪个维度不变?FixedWidth,FixedHeight,假设我们是1280x720,采用固定高度的模式;
游戏引擎就可以根据手机屏幕 --- 》算出来我们的逻辑分辨率;
scale = 1080 / 720 = 1.5
逻辑分辨率:(1920/1.5=1280) x720 === > 1280x720
ipad:1024x768 设计分辨率是 1280×720,适配策略是固定高度;
scale = 768 / 720 = 1.0667
逻辑分辨率:(1024/1.0667 = 959.97 )x720==> 959.97x720
适配问题就变成了,我们基于逻辑分辨率来排布,把1280×720==== > 959.97×720
渲染的时候:Node --- >大小 逻辑大小*scale=渲染的大小 ;---- >GPU渲染出来就可以了
3.常用手段:
布局:基于我们的停靠点来布局,基于某些特定位置来停靠--》widget
大小:widget
背景图片:1.加缩放,让背景铺满整个屏幕
2:我们就是做一个大一点的图,让所有主流的手机分辨率都能盖住屏幕,就可以了;
2D地图超过屏幕,那么这个时候我们就可以做地图滚动;
2D地图是一个页面里面,不允许滚动 ?--- >消消乐这种;
你就可以把地图,部署在公共区域,其它的背景做衍生就可以了。