《面试》游戏开发常用面试问题以及答案

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运算速度快,内存读写跟不上。
缓存命中:请求数据在缓存中。 不在会请求内存先写入缓存在返回。

19.迭代器是什么

看c++源码,迭代器内部就是一个指针指向个内存,不停移动。

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

某某某某某某某某某某某某某某某

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值