欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。
今天是我们的第三期笔试面试题总结。
C#部分:
1、泛型的约束有哪几种?
答案:
1.值类型约束 T:struct
2.引用类型约束 T:class
3.公共无参构造约束 T:new()
4.类约束 T:类名
5.接口约束 T:接口名
6.另一个泛型约束 T:U
2、什么是闭包?可以举例说明
答案:
闭包是指有权访问另一个函数作用域中的变量的函数
所以闭包一般都是指的一个函数
创建这种特殊闭包函数的方式往往是在一个函数中创建另一个函数
3、内存泄漏指什么?常见的内存泄漏有哪些?
答案:
内存泄漏指的就是对象超过生命周期后而不能被GC回收,一般指不会再使用的引用对象由于某些操作而不能被GC垃圾回收,而一直占用着内存
更风趣通俗一点的说就是:没用的家伙没有被当成垃圾回收
常见的内存泄漏有:
1.静态引用
2.不使用的引用对象没有置null,一直被引用
3.文件操作时,没有使用using或者没有进行Dispose()
4.委托或事件注册后没有解除注册(有加就有减)
等等
4、序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?
答案:
序列化是将程序中数据对象转换为可以存储或传输的形式 的过程。
举例:
比如我们常见的序列化方式 xml、Json、2进制等。就是将内存中的数据按照我们自己定义的规则进行序列化,序列化之后就可以用于存储和传输,当读取和接受数据时,只需要按照对应规则进行反序列化便可得到原始数据
所谓的存储读取和传输接受,其实一般指的就是数据持久化和网络通讯
所以我们经常会在这两块知识点看到序列化反序列化这两个关键词
5、请问A、B、C 三处打印结果分别为多少?为什么?
答案:
A是10,B和C为100
Test1处参数传递进去后,函数内部的形参value是在栈上重新开辟的空间,将传入参数的值拷贝到了该空间中,和传入参数没有关系
Test2处参数是指针类型,指针是用于存储内存地址的变量,我们传入的是值得地址&test2Value,在函数内部改变的是地址中存储的值,所以外部的test2Value会随之改变
Test3处ref关键字,底层逻辑中是将value作为test3Value的一个别名,他们指向的空间一致,所以value改变后,外部的test3Value也会改变
Unity部分:
1、transform.forward和Vector3.forword的区别
答案:
Vector3.forword始终时(0,0,1)
可以认为是世界坐标系的Z轴朝向
transform.forword是当前物体的局部坐标系的Z轴在世界坐标系下的朝向
可以认为是物体自己的Z轴朝向
2、Unity中如何解决过多创建和删除对象带来的卡顿问题?
答案:
可以通过协同程序,分时分步创建或删除
原理是避免一帧中处理太多对象
3、游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作?为什么?
答案:
观察者模式
4、请简述热更新的流程
答案:
第一步:客户端到服务器端获取资源服务器地址
第二步:在资源服务器中下载资源对比文件,通过资源对比文件把远程的AB包和本地的AB包进行一个对比,然后更新
5、我们应该如何优化UI(基于UGUI)
答案:
性能上
1.打图集,将同一画面的图片放入一个图集中,目的是减少DrawCall
2.面板中的图片和文字尽量不要交叉,因为这样会产生多余的DrawCall
3.取消勾选不必要的射线检测,UI组件上的
4.减少透明图片的重叠使用
等等
内存上
1.大图尽量使用9宫格缩放,让美术设计UI面板底图时不要过于复杂
尽量是有规律的纹理和颜色变化
2.图片的RGBA通道分离
等等