游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)
1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么?
原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。
限制条件:
静态:不移动,相同材质
动态:较大顶点开销,仅支持小于900顶点网格物体,顶点着色器使用属性越多,顶点开销数量限制越大,
也要相同材质,不同缩放尺度不能动态合批。
原因:相同材质,纹理相同,同时渲染。同时运行着色器代码。
cpu: 减少cpu提交drawcall
gpu:让gpu一次搞定,减少等待时间。
2.一个正方体多少个顶点和三角形,为什么?如何合并顶点?
24(38),12(62)
顶点24原因:立方体上贴一张二维图形会走样,所以每个面重复贴一张,一个顶点同时是三张图片uv,所以需要三个顶点,三组UV。三顶点重合。
3.相机中如何做分层渲染?底层原理是什么
多相机控制图层渲染不同图层的内容,原理:应该跟双缓冲区有关系吧,相机渲染的区域修改颜色缓冲区,不渲染的使用黑边。
4.项目中的打包工具做了什么事情?
0.设置包签名
1.编译 dll
2.拷贝引擎dll文件
3.加密lua文件
4.设置资源ab路径,导出映射文件。
5.打包图集
6.打包ab
7.最后打包apk
5.lua的闭包是什么?闭包产生的内存泄露如何解决?
函数内使用外部变量,例如嵌套函数的父函数的变量
解决方法:函数内的局部变量都会在栈上面,函数执行后不释放引用的闭包函数,由于闭包内有引用的外部变量,闭包也不会自动释放,所以需要释放闭包函数的引用就行了。
6.、A*寻路算法的原理是什么?还知道其他寻路算法吗?
地图分块
8个方向
估价函数,估价出最适合的格子前进。两个列表,open,Close,从open中找出f(n)最小的格子,将它周边的格子加入到open中,并将自己从open中删除加入到close中,如此循环。边界判断。
Dijkstra
寻找出有向权重图中指定节点(“源节点”)到所有其他节点的最短路径。
https://chinese.freecodecamp.org/news/dijkstras-shortest-path-algorithm-visual-introduction/
7.什么是堆,堆排序又是怎么样的
完全二叉树,非终端结点的值不大于(或不小于)左,右孩子结点的值,数组结构。左孩子不一定小于右孩子,所以不是二叉查找树。
8.求一个大型排行榜的Top100用什么算法,过程是怎么样的
客户端:topk问题,原地建个100的最小堆解决。遍历一遍数据集合解决
服务器:不全局全服,分服。
9.lua的table的底层实现原理是什么?为什么这么设计?
array数组和hashtable(哈希表)两种数据的结合。 提高table的插入查找效率
部分整形key作为下标放在数组中, 其余的整形key和其他类型的key都放在hash表中。
10.lua与C#或C语言相互调用的底层实现原理是什么?
lua 底层c语言实现的。
C#与Lua交互过程:
C# Call Lua : 由C#文件调用Lua解析器底层dll库(由C语言编写),再由dll文件执行相应的Lua文件;
Lua Call C# :
1.Wrap方式 首先生成C#源文件所对应的Wrap文件,由Lua文件调用Wrap文件,再由Wrap文件调用C#文件
2. 反射方法
C#与Lua交互原理:
C#与Lua进行交互主要通过虚拟栈实现,栈的索引分为正数与负数,若果索引为正数,则1表示栈底,若果索引为负数,则-1表示栈顶。
C# Call Lua:由C#先将数据放入栈中,由lua去栈中获取数据,然后返回数据对应的值到栈顶,再由栈顶返回至C#。
Lua Call C#:先生成C#源文件所对应的Wrap文件或者编写C#源文件所对应的c模块,然后将源文件内容通过Wrap文件或者C模块注册到Lua解释器中,然后由Lua去调用这个模块的函数。
代码层面:
CSharp调用Lua过程:
C#生成Bridge文件,Bridge调dll文件(dll是用C写的库),先调用lua中dll文件,由dll文件执行lua代码
C#->Bridge->dll->Lua OR C#->dll->Lua
11.装拆箱
值类型和引用类型互相转换,泛型解决。
12.哈希表
本质数组,散列函数算出索引所在位置,去除值。键值对。
13.为什么红黑树能加快查询速度
树高度少,左右子树高度相差不大于1,二叉查找树,左<中<右
14.c和lua那个占用内存更高
lua,因为lua弱类型,每个都是引用对象,并且虚拟机加载环境需要更大的内存。
15.c和lua那个更快
c,因为lua解释型要虚拟机翻译
16.lua和c交互
当C要调用Lua数据时,Lua把值压入栈中,C再从栈中取值; 当Lua调用C数据时,C要将数据压入栈中,让Lua从栈中取值
https://www.cnblogs.com/KillerAery/p/9249145.html
17.LineRender底层实现原理
顶点数组,两点确定一条直线,DDA或者Bresenham直线算法绘制像素
17.二维碰撞算法:AABB
从反面来思考,简单迅捷。
18.cpu缓存
减少处理器访问内存时间的部件,处理器发出内存访问请求时,会先查看缓存内是否有请求数据,CPU运算速度快,内存读写跟不上。
缓存命中:请求数据在缓存中。 不在会请求内存先写入缓存在返回。