名词解释:
装箱:在值类型向引用类型转换时发生;
拆箱:在引用类型向值类型转换时发生;
值类型:直接将内存存储在栈内;
引用类型:由类型的实际引用(类似于指针)表示的数据类型,通俗点说就是在编程时需要new出来的变量类型都是引用型,引用类型是存放在内存的堆中;
内存堆跟栈的定义跟数据结构的堆栈是不同的:
栈:由大致小的分配,先进后厨,直接存放值类型的地方;我们一般出现的内存溢出就是由于栈位都分配完了;
堆:由小至大的分配,随意存储,存放引用类型的地方;
C#的值类型
整型:Int; 长整型:long; 浮点型:float; 字符型:char; 布尔型:bool; 枚举:enum; 结构:struct;
口语化自我理解:ArrayList是定长的,而List是变长的,在内存的分配上ArrayList由于是定长内存的分配上也是固定的,而就List而言,List因为是变长的,内存内配上也是不一样的,通常来说List会有一个最大的内存上线,以此用来限制。
本质上的区别:
List 和 ArrayList 都是在 .NET Framework 中用于存储多个元素的数据结构,但是它们在语法、性能和功能上有一些区别:
类型:List 是泛型类型,而 ArrayList 是非泛型类型。
类型安全:List 是类型安全的,因为在定义时需要指定元素的类型,因此只能存储同一种类型的元素。而 ArrayList 则不是类型安全的,它可以存储任何类型的元素,但需要进行强制类型转换。
性能:List 的查询和遍历速度比 ArrayList 快,因为它是类型安全的。
功能:List 提供了更多的功能,如排序、查询、删除等,而 ArrayList 功能较少。
因此,通常情况下,建议使用 List 而不是 ArrayList。
使用上的区别:
由于使用ArrayList会涉及到较多的装箱和拆箱的操作,而List由于引入了泛型的概念,相比ArrayList而言会相对节省装箱和拆箱的操作。
引用自ChatGPT以及ArrayList和List本质上和使用上的区别详解_别The Crossing的博客-CSDN博客_list和arraylist的区别(侵权必删)
口语化自我理解:值类型需在创建时需要开辟新的内存空间,而引用类型则不用,就创建时的时间来看,值类型的创建时间是要比引用类型的创建时间要长的,引用类型的创建是创建一个索引对应着所引用的那一块内存的地址。
创建引用类型时,runtime会为其分配两个空间,一块空间分配在堆上,存储引用类型本身的数据,另一块空间分配在栈上,存储对堆上的数据的引用(实际上存储的是堆上的内存地址,也就是指针)。
创建值类型时,runtime会为其分配一个空间,这个空间分配在变量创建的地方,如:
如果值类型时在方法内部创建,则跟随方法入栈,分配到栈上存储。
如果值类型时引用类型的成员变量,则跟随引用类型,存储在堆上。
引用自:C#中的值类型和引用类型 - xiaodongy - 博客园(侵权必删)
口语化自我理解:
在我经手的项目中对于优化并不做太多的要求,但是也需要适当考虑一般而言对我来说优化即只是减少DC,对于使用同一材质(图集)的UI来说需要将它尽量安排在同一面上才好使用到Unity中的合批操作。
且在项目的过程中有跟同事对不可见物体的渲染问题上进行适当的讨论,在摄像机的选项中有将不可见的物体不渲染的选项出现,只需要合理运用Unity Camera的一些组件即可。
在对Camera的一些处理中还有LOD技术的出现,也能够对游戏进行优化。
使用MipMap
口语化自我理解:不清楚,用得场景很少,搜索时间复杂度应该是N吧,全便利一遍检索我是这么想的
Hash算法
hash算法是一种数字摘要算法,它能将不定长度的二进制数据集给映射到一个较短的二进制长度数据集,常见的MD5算法就是一种Hash算法,通过MD5算法可对任何数据生成数字摘要。而实现了Hash算法的函数我们叫他Hash函数。Hash函数有以下几点特征:
- 相同的数据进行Hash运算,得到的结果一定相同。
HashFunc(key1) == HashFunc(key1)
- 不同的数据进行Hash运算,其结果也可能会相同,(Hash会产生碰撞)。
key1 != key2 => HashFunc(key1) == HashFunc(key2)
.- Hash运算时不可逆的,不能由key获取原始的数据。
key1 => hashCode
但是hashCode ==> key1
。
两个关键的算法:1、Hush算法 2、用于应对Hash碰撞冲突解决算法。
搜索时间复杂度接近 1
需要更加细致地了解这个原理详情见这个链接:浅析C# Dictionary实现原理_W8023Y2014的博客-CSDN博客
接口Interface
- 接口不能示例化
- 接口的成员包括方法、属性、索引器、事件、方法只有声明
- 接口中不能包含常量、字段、构造函数、静态成员
- 接口中的所有成员默认为public,因此接口中不能有private修饰符
- 派生类必须实现接口的所有成员
- 一个类可以实现继承多个接口
- 接口也可以继承多个接口,实现父接口所有成员
- 接口是完全抽象,多继承
抽象类 abstract class
- 抽象类中的抽象方法,只做声明,有方法体,但不包含实现
- 抽象类不一定有抽象方法或抽象属性,但声明了抽象方法,这个类就必须是抽象类
- 抽象类的派生类必须要实现抽象方法
- 抽象类不能实例化
- 抽象类是单继承,部分抽象
相同点:
- 1、都可以被继承
- 2、都不能被实例化
- 3、都可以包含方法声明
- 4、派生类必须实现未实现的方法
区别:
- 1、抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
- 2、抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”
- 3、接口可以被多重实现,抽象类只能被单一继承
- 4、抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
- 5、抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
- 6、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法
- 7、接口可以用于支持回调,而继承并不具备这个特点
- 8、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
- 9、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
使用规则:
- 1、抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能
- 2、如果要设计大的功能单元,则使用抽象类;如果要设计小而简练的功能块,则使用接口。
- 3、如果预计要创建组件的多个版本,则创建抽象类。接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
- 4、如果创建的功能将在大范围的全异对象间使用,则使用接口;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
- 5、分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”。为外部提供调用或功能需要扩充时优先使用接口
- 6、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染
- 7、尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如 asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则
如果抽象类中实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口方法
目标 | 选择 |
创建多个组件版本 | 抽象类 |
设计小而简练的功能块 | 接口 |
设计大型功能单元 | 抽象类 |
使用规则:
- 当在差异较大的对象间寻求功能上的共性时,使用接口。
- 当在共性较多的对象间寻求功能上的差异时,使用抽象基类。
口语化自我理解:点乘是为了计算两个向量所组成的平行四边形的面积 叉乘是计算出垂直于两向量构成的平面的向量 归一化的意思是得到一个向量的方向noramlze
点乘的几何意义:一条边的长度乘以另一条边在这条边上的投影 根据公式 x*y = |x||y|sin两向量的夹角
叉乘的几何意义:叉乘等于两向量构成的平行四边形的面积
口语化自我理解:Draw Call即由CPU告诉GPU一个渲染列表让GPU渲染出来的一个命令
Draw Call 就是一个命令,它的发起方是CPU,接收方是GPU。这个命令仅仅会指向一个需要被渲染的图元列表,而不会再包含任何材质信息。
口语化自我理解:不同分辨率的图片,适用于根据视角的远近用来呈现物体的纹理细节上的不同
MipMap技术类似于LOD技术,只不过针对的资源不同,MipMap针对的纹理贴图资源,使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。
口语化自我理解:优点是能够减少内存消耗,适用于在户外的一些大型场景中,缺点是通过LOD呈现出的远景在细节上会十分粗糙
根据物体在游戏画面中所占视图的百分比来调用不同复杂度的模型的。优点是减少渲染时的压力,缺点是需要占用大量的内存。典型的用空间换时间的方式来进行解决。
【转】透视矩阵详解 - zhangbaochong - 博客园