CocosCreator面试真题详解

最近有位同学面试Cocos Creator,我们把面试时问道的真题列举出来,并配上参考答案。

问题1: 你们公司项目时如何做战斗系统的?

面试官你好,做战斗系统和架构的时候,我们一般把代码逻辑分成3层来设计,同时把数据独立出来,我们的项目设计如下,不同公司可能不一样,我们之前公司是这样做的:

1: 我们会把战斗中的功能,做成组件,比如,动画切换,伤害计算等; 我们叫做功能层;

2: 我们会把战斗单元做一个组件,比如Charactor, 然后让Charactor来has 功能组件,并在Charactor中提供标准的通用的策略,比如,行走,技能释放等; 同时不是的角色,我们会编写Player, Enemy等来继承自Charactor,并绑定对应角色的战斗数据,用战斗数据来驱动统一的逻辑;

3: 操作层:我们会把战斗中的操作独立出来,比如UI操作,网络事件,AI事件等,通过事件模块,来调用到战斗中的具体策略,这样,可以实现不同操作层来驱动战斗,调用战斗策略;

4: 战斗中的数据,我们一般都用excel表格来给策划填写,更具策划的游戏需求来制定好对应的数据格式。如果有必要,还可以做一些可视化工具(技能编辑器),来给策划使用,最后导出战斗数据。

5: 技能编辑器:可视化的制定技能的一些数据,比如buff时间,攻击时间,等具体要根据游戏需求来定;

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

问题2: 项目中出现多个spine卡顿怎么办?

目前cocos creator 提供spine的动画组件,他有几种模式,性能最好的是预先Bake模式,就是把每个骨骼在某一帧的位置预先计算出来然后存起来,这样能提升性能。可以开启spine动画的合批模式,降低Drawcall,但是有限制,需要每个spine只有一种混合模式,一张贴图才能进行Drawcall合并。如果多个spine还是卡顿,那么就把spine换成帧动画,提升一些性能。

问题3: 百人同屏如何优化drawcall?

如果是2D游戏,只要保证角色的动画是同一个图集的帧动画(spine动画好像无法合批,待确认)就能最大限度地合批,同时把角色UI属性地相关内容,和原来的2D角色分开,把UI单独做,然后UI节点和角色节点做位置同步,这样,角色的动画就可以再一个图集合批,不会被自己的昵称,血条等打断合批。

如果是3D游戏,就要将3D动画的每个顶点的位置,Baker到一个纹理里面,然后使用GPU Instancing合批,来优化掉3D动画组件,从而合批,同样,UI等,都要单独独立开发,这样防止打乱合批。

问题4: 你们项目的场景切换是怎样做的?

目前主流的游戏开发中场景切换做法有3个,不同的公司可能不一样:

1:直接把场景做好,然后内容方场景里面,调用cocos API, 来直接加载与运行对应的场景;

2: 直接把场景做成场景资源,打入ab包中,来调用cocos API,从资源加载中加载场景,然后运行;

3: 直接只用一个场景,通过预制体来做相关的内容展示,不存在场景切换。

具体的选择,可以根据框架与项目来决定。比如,3D游戏中需要场景中做静态光照,我们就可以采用方法2,把场景看作是地图。比如简单的游戏就可以直接使用方法1 or方法3。

建议采用方法2, or 方法3。方法1最大的问题,是场景无法分ab包,全部都打入到main包里面,这样做分包的时候会有问题;

问题5: 动画的帧率是多少最为合适?

动画的帧率,要看,都可以,主要根据动画的类型来定,可以是15FPS, 30FPS, 60FPS.一般目前骨骼动画这些帧率都是控制在15~30FPS,有些可以是10FPS。具体要根据,帧率,资源大小等,做一个平衡,比如帧动画,帧过多,就会导致内存占用过大,帧过少,动画又不流畅。

问题6: Gpu Instance 怎么用的?

1: 要满足GPU instancing合批的条件,同一个材质,同一个shader,同一个mesh;

2: 渲染的时候,不能被别的物体打乱;

3: 在材质的地方勾选Gpu instancing选项,就可以实现Instancing 合批;

问题7: 你在游戏开发中是如何做内存管理得;

面试官你好,关于使用Cocos Creator开发做内存管理,可能需要注意得点,我是这样看的:

Cocos Creator开发游戏的内存占用主要是由以下部分组成,

1: 逻辑数据的内存占用,比如,节点,组件实例,字符串对象等;

2: 纹理,模型顶点等显存的内存占用;

3: 就是加载资源,场景切换过程中的一些中间状态的内存占用,比如,解码一个png的图片到内存,可能会要从资源里面把资源数据读到内存中再解码。

对于3的中间状态,最终会被引擎所释放,我们只要关注切换,加载时候的内存峰值,不要让内存峰值引发奔溃就可以了,如果内存峰值很高,这个时候,我们可以考虑

延后加载等。具体还要根据项目来定位。

对于2,我们一般是把不用的资源即时的给他释放掉,这个时候,我们做资源管理的时候,要尽量的把同一个功能场景的资源,打入一个ab包,这样,用的时候整个ab包都用,不用的时候都可以释放。

对于2,我们只要根据内存的峰值情况,再特定的时机,把不用的资源释放掉即可,如果我们的内存可以承受,那么可以不释放。

对于1, TypeScript/JavaScript 一般的都有垃圾回收的机制,我们一般不用考虑释放的问题,直接new 就可以了,但是也要避免大量的反复的new, 比如,在update里面不断地new 一个对象;

这种要尽量地避免。当我们地内存出现峰值地时候,可以主动地启动垃圾回收来进行回收处理。对于大量反复创建地节点,我们可以考虑使用缓存池来处理,这样避免直接像系统反复地new/free。

目前是我对Cocos Creator开发,关于内存要注意地点,可能有遗漏,具体项目还要根据实际情况具体分析。

问题8.你认为怎样的编码才算规范?

编码规范这个不同的项目,不同的公司可能要求不一样,我理解的规范的代码,大概从几个方面讲:

1: 用英文来做好命名,命名要能代表函数or变量or类的功能和作用,命名的习惯可以统一,比如

私有变量用_开头等;

2: 要注意权限,改私有的私有,改公有的公有;

3:命名规范的时候,可以和引擎做适当的一些区分;

4: 把逻辑流程的代码与具体功能代码来分开,流程代码负责流程,功能代码负责具体功能。

5: 写代码要符合项目的真实性,符合大家的习惯性认识,尽量少造概念等。

6:注释的一些要求,如果看具体项目和公司的团队成员的水平与协作来决定注释要写到什么程度

...

具体不同的项目规范不一样,还是可以提前规划好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux业务系统将/home目录删除并将空间扩给根目录

原有目录空间分配如下: [roothisdb ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 21G 10G 11G 50% / devtmpfs 905M 0 905M 0% /dev tmpfs 920M 177M 744M 20% /dev/shm tm…

千益畅行,共享旅游卡,有哪些优势和特点?

1、同行人数灵活: 与一般旅游卡相比,千益畅行旅游卡对同行人数的限制更宽松,单卡支持 2 至 6 人同时出行,能满足小团体、家庭等多人出行需求,为多人共同出游提供了便利和优惠。 2、服务模式多样: 1&#xf…

前端月中总结

1、领导一拍脑门想要一个内部聊天软件 --基于open IM二次开发 背景 前段时间不是接手了一个内部办公软件的项目嘛,这个项目已经写了三四年了,一代代的前端融合了不知到多少种代码风格,再加上最初搭这个项目架子的人不知道咋想的&#xff0c…

操作系统 ---- 进程的概念、组成、特征

学习路线: 一、进程的概念及组成 我们通过一个例子来说明进程的概念以及程序和进程的区别。 我们在Windows操作系统中打开任务管理器,在任务管理器当中能看到此时系统当中运行的进程有哪些,如下图所示: 此时&#…

H5漂流瓶社交系统源码

一个非常有创意的H5漂流瓶社交系统源码,带完整前端h5和后台管理系统。 环境:Nginx 1.20.1-MySQL 5.6.50-PHP-7.3 代码下载

一家电子信息企业终止,前五大客户收入占比超九成,募资合理性存疑

兴天科技终止原因如下:首先,兴天科技前五大客户收入占比约超九成,客户集中度较高且高于行业平均水平,其中近期来自第一大客户收入占比超七成,单一客户依赖程度进一步上升;其次,兴天科技除第一大…

Spring boot启动过程详解

程序设计的所有原则和方法论都是追求一件事——简单——功能简单、依赖简单、修改简单、理解简单。因为只有简单才好用,简单才好维护。因此,不应该以评论艺术品的眼光来评价程序设计是否优秀,程序设计的艺术不在于有多复杂多深沉,…

ffmpeg的安装和使用教程及案例

FFmpeg的安装与使用教程 一、FFmpeg简介 FFmpeg是一个开源的、跨平台的音视频处理工具,可以用来转换、播放、录制、流化音视频数据,以及进行多种音视频编码和解码。 二、安装FFmpeg 1. Windows系统安装 下载预编译的二进制文件:从FFmpeg…

starrocks结合同步和异步物化视图建立数据湖和数据仓库

StarRocks 是一个高性能的开源 MPP(大规模并行处理)数据库,主要用于 OLAP(联机分析处理)场景。它支持各种数据操作,包括数据仓库中的大规模查询处理。同步和异步物化视图是 StarRocks 中的数据处理特性&…

云原生学习交流

欢迎加入技术交流群&#xff0c;与阿里、腾讯、字节、华为等运维大佬面对面交流和互相学习。 请扫码备注 加群&#xff0c;<城市>-<公司/自由职业>-<昵称>&#xff0c;如“加群&#xff0c;广州-阿里-行则”&#xff1a;

LabVIEW灵活集成与调试的方法

在LabVIEW开发中&#xff0c;为了构建一个既便于调试又能灵活集成到主VI中的控制VI&#xff0c;开发者需要采用适当的编程方式和架构。常见的选择包括模块化设计、状态机架构以及事件驱动编程。这些方法有助于简化调试过程、提高系统的稳定性&#xff0c;并确保代码的重用性和可…

目标检测-YOLOv4

YOLOv4介绍 YOLOv4 是 YOLO 系列的第四个版本&#xff0c;继承了 YOLOv3 的高效性&#xff0c;并通过大量优化和改进&#xff0c;在目标检测任务中实现了更高的精度和速度。相比 YOLOv3&#xff0c;YOLOv4 在框架设计、特征提取、训练策略等方面进行了全面升级。它在保持实时检…

分布式事务Seata原理及其项目使用

0.Seata官方文档 1.Seata概念及原理 Seata是什么 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata主要由三个重要组…

SpringBoot整合分页助手

目录 1 导入依赖 2 测试使用 关于分页有些数据 默认访问首页,即默认当前页是 pageNum 1 数据有总条数, total select count(*) 页面大小/每页展示多少条数据, pageSize 10 总页数 , pageCount total / pageSize (需要注意除不尽情况) -- total共7条 select count(*) f…

JAVA基础:值传递和址传递

1 值传递和址传递 值传递 方法调用时&#xff0c;传递的实参是一个基本类型的数据 形参改变&#xff0c;实参不变 public static void doSum(int num1,int num2){} main(){doSum(10,20);int i 10 ;int j 20 ;doSum(i,j) ; } public static void t1(int num){num 20 ;Sys…

[数据集][目标检测]街头摊贩识别检测数据集VOC+YOLO格式758张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;758 标注数量(xml文件个数)&#xff1a;758 标注数量(txt文件个数)&#xff1a;758 标注类别…

苹果手机照片被删除?如何通过不同的方法来恢复照片

手机已经成为我们生活中不可或缺的一部分&#xff0c;它不仅仅是通讯工具&#xff0c;更是我们记录生活点滴的重要工具之一。然而&#xff0c;正如其他任何设备一样&#xff0c;iPhone上存储的照片有时也会不小心被删除或丢失。 别担心&#xff0c;即使你误删了重要的照片&…

opencv 实现两个图片的拼接去重功能

基础知识介绍 cv::Mat 是OpenCV库中用来表示图像和矩阵数据的核心类之一。它是一个多维数组&#xff0c;可以存储图像像素数据、矩阵数据以及其他类型的数据。以下是关于 cv::Mat 类的一些详细解释&#xff1a; 构造函数&#xff1a;cv::Mat 类有多个构造函数&#xff0c;可以用…

安防监控/视频汇聚平台EasyCVR无法启动并报错“error while loading shared libraries”,如何解决?

安防监控/视频汇聚平台EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作&#xff0c;用户可以轻松地进行远程视频监控、存储和查看&#xff0c;满足…

Linux学习-inotify和rsync同步

Inotify 是一个 Linux特性&#xff0c;它监控文件系统操作&#xff0c;比如读取、写入和创建。Inotify 反应灵敏&#xff0c;用法非常简单&#xff0c;并且比 cron 任务的繁忙轮询高效得多。 Inotify实际基于事件驱动机制&#xff0c;为应用程序监控文件系统事件提供了实时响应…