秋招第一次面试,凉的透透的,面试还死机了。。 记录一下吧
1:Unicode和UTF-8的区别
Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号,每个符号的编码都不一样。Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
UTF-8是目前使用最广的一种Unicode的实现方式。它最大的特点就是变长编码的方式,采用了1~4个子节来表示一个符号,根据不同的符号而变化字节长度。
UTF-8的规则:
(1) : 对于单字节的符号,字节的第一位设置为0,后面7位位这个符号的Unicode编码。因此对于英文字母,UTF-8和ASCII码是一样的。
(2) : 对于n字节的符号,第一个字节的前N位设置为1,第n+1位设置为0,后面字节的前两位一律设置为10。剩下的没有提及的二进制位全部设置为这个符号的Unicode
所以总结来说,UTF-8便阿门就是如果一个字节的第一位位0,则这个字节单独就是一个祖父,如果是1,那么连续多少个1就表示它占用了多少个字节。
2:unity的静态合批和动态合批
静态合批:在场景里面有有一些共享同一材质的模型存在,并且这些模型都一直不会移动,旋转和缩放那么就设置这些模型为static。
在build的时候,unity会将这些共享材质的静态模型的vertex buffer和index buffer,根据他们在场景的最终状态的信息,将模型的顶点转化为世界坐标下,储存在大的Vertex buffer和index buffer。并且记录子模型的index buffer数据在大的buffer的起始位置和结束位置。在后续的绘制中,一次性提交合并模型的数据,根据场景管理系统判断子模型的可见性然后设置一次渲染状态调用多次draw call分别绘制一次模型。
由于控制的时候使用的是index buffer,所以起到了降低draw call的效果而且子模型的顶点数据已经变化到了世界坐标下,共享材质所以多次draw call下没有渲染状态的切换起到了优化的目的。
静态合批也会带了一些负面影响,比如打包后体积增大,运行时占用更多的内存。当有许多不同的game object引用一个模型的情况下,共享模型只会在内存中保存一份,如果开始batch static,那么在build的时候会复制所有的game object引用的模型,导致体积增大。
面试的时候问到了动态合批的顶点限制和原因,当时写合批工具的时候只是简单看了一下,原因没有搞明白所以没答上来。
动态合批:动态合批在每一帧都会有一些CPU的性能消耗,如果开始了dynamic batching,unity会自动把所有共享了同一个材质的game object在一个draw call绘制
动态合批的原理:进行绘制之前将所有的共享同一个材质的模型的顶点信息变换到世界空间中,通过一次draw call绘制多个模型达到合批的目的。由于坐标变换是由CPU进行操作的,所以会带来一些性能消耗,所以计算的模型顶点数不能太多,否则CPU串行计算耗费的时间太长会造成卡顿。目前unity限制dynamic batching的模型最高含有900个顶点属性。而不是顶点。
3 :new和malloc的区别