面试总结

数据占用空间大小:

char 1字节(C#中占2字节),int 4字节,short 2字节,float 4字节(1位符号位,8位指数位,23位小数位),double 8字节


内存对齐规则:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3、收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

注:每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。规则:以上所有对齐规则需要与指定的“对齐系数”作比较,以较小的为准。


编码转换:

字符编码先转换为统一字符编码(Unicode),再转换到想要转换的字符编码。

如GBK转换为UTF-8的过程,实际上是先由GBK转换为Unicode,在使用UTF-8显示出来。


UI与特效叠层问题:

可以通过控制Renderer.SortingOrder及Renderer.Material.RenderQueue来实现,且优先级Renderer.SortingOrder>Renderer.Material.RenderQueue


构造函数与析构函数的调用顺序:

基类构造函数->派生类构造函数->派生类析构函数->基类析构函数


重载与非重载:

1、非重载

public class ClassA
{
    public int GetValue()
    {
        Debug.Log("Class A GetValue");
        return 1;
    }
}

public class ClassB : ClassA
{
    public int GetValue()
    {
        Debug.Log("Class B GetValue");
        return 2;
    }
}

public class Test : MonoBehaviour
{
    void Start()
    {
        ClassA b = new ClassB();
        Debug.Log(b.GetValue());
    }
}
打印结果: 
Class A GetValue 
1
2、重载

public class ClassA
{
    public virtual int GetValue()
    {
        Debug.Log("Class A GetValue");
        return 1;
    }
}

public class ClassB : ClassA
{
    public override int GetValue()
    {
        Debug.Log("Class B GetValue");
        return 2;
    }
}

public class Test : MonoBehaviour
{
    void Start()
    {
        ClassA b = new ClassB();
        Debug.Log(b.GetValue());
    }
}
打印结果: 
Class B GetValue 
2

不用中间参数交换两个数字a,b

a=a+b;

b=a-b;

a=a-b;


请描述游戏动画有哪几种,以及其原理。
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
1.关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。
2.单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)


Unity打包,如何控制包体大小:

1.替换jpg,使用psd,减少重复资源
2.剔除不必要的资源
3.打包时查看log纪录,由此判断需要减少的文件类型
4.优化,压缩图片,减少图片大小
5.优化,压缩网格和动画,减少文件大小
6.剔除system.dll和system.xml.dll ,尽量不要依赖他们,或用其他组件来代替。

另外可以使用www.LoadFromCacheOrDownload。把包分成三段:

1.基础包(里面包含了最最必要的资源)。

2.首次进入包加载(加载游戏运行必要的资源)。

3.游戏运行中资源加载(按每个游戏不同各自定义,以场景和单位个体为主要,在画面进入时加载资源,加载结束后再运行并显示)。

www.LoadFromCacheOrDownload在加载AssetBundle后会将其解压后的资源存储到本地文件夹中,这样虽然下载的包小,但解压后的包依旧很大。解决方法:首先将资源包打包中加密并命名为.bytes后缀,最后再加载是就不会被解压为资源存储再本地,因为它无法识别我们加密后的AssetBundle资源,再读取资源时需要使用AssetBundle.CreateFromMemory将,解码后的2进至数据变为我们可用的AssetBundle。
这个方法能灵活运用这如下方式:将n个资源包加密后打包成n个2进至文件,再将这些加密文件再次打包成1个正常的AssetBundle文件,在使用www.LoadFromCacheOrDownload时从网络加载完成后,本地应用存储的就时n个我们加密后的2进至文件了,而并非被u3d解压后的正常的资源文件。这样做进一步缩小了本地资源的大小。


如何优化游戏性能

你可能感兴趣的:(Unity3D开发,C#开发)