C#与C++混淆点梳理

从C++到C#,发现C#写多了里面有些知识和C++混淆了,记下来理一理。
1、C++的类定义不会在class关键字前使用访问修饰符,即不会有public class Base {…}这种定义,而C#有。
C#的访问修饰符除了用于修饰member外还用于修饰type,其访问修饰符除了有和C++一样的public、protected和private外,还有internal和protected internal。
public:访问不受限制。
protected:访问仅限于包含类和包含类的派生类。
private:访问仅限于包含类。
internal:访问仅限于当前程序集。
protected internal:访问仅限于当前程序集和包含类的派生类。

修饰type时,如果是top-level types(没有被其它类型嵌套包含)只能使用public和internal,默认是internal。
如果是nested types则访问修饰符的情况有以下情况:
class默认修饰符是private,可以使用public、protected、private、internal、protected internal。
interface默认修饰符是public,只能使用public。
struct默认修饰符是private,可以使用public、private、internal。
enum默认修饰符是public,只能使用public。

当定义一个类型时需要考虑它的可访问级别是否依赖于其它类型或成员。例如一个基类的可访问级别最低要和派生类一致:
class BaseClass {…}
public class MyClass: BaseClass {…} // Error
上面的代码因为BaseClass的可访问级别internal低于MyClass的public编译器会报错。

参考:https://msdn.microsoft.com/zh-cn/library/wxh6fsc7.aspx

2、C++没有静态类,即不会有static class Base {…}这种定义,而C#有。
C#静态类中的成员变量和函数必须都是static的。它不能被继承,不能实例化,不能有实例化的构造函数,但可以有静态构造函数。

参考:http://blog.csdn.net/xiaobai1593/article/details/7278014
https://msdn.microsoft.com/zh-cn/library/98f28cdx.aspx

Unity LOD

LOD全称Level of Detail,是Unity提供的一项提高渲染性能的特性。它根据摄像机和对象的距离来渲染对象不同精度的mesh,越远时所需渲染的mesh精度会越低。

Unity中GameObject通过添加LOD Group组件来使用LOD特性。参考:http://docs.unity3d.com/Manual/class-LODGroup.html

InspectorLODGroup

LOD Group中可以设置多个level,如LOD:0、LOD:1、LOD:2等。不同level会设置一个百分比,当对象包围盒的高度相对屏幕高度的百分比小于这个百分比时就会进入这个level。

需要注意的是当QualitySettings中LOD Bias的设置不为1时,发生两个level间的过渡,摄像机所在的位置不会是两个level间之前设置好的位置(百分比),而是会有个由LOD Bias决定的偏差。LOD Bias的设置越趋近于0,对象越趋近于Culled。

不同level还可以设置它们的renderers,renderer实际上是一个拥有相应level的mesh的GameObject,通常它就是使用LOD Group组件的对象的孩子节点。

LOD的详细介绍参考:http://docs.unity3d.com/Manual/LevelOfDetail.html

Unity编辑器环境和项目出的手机版本可能会出现LOD表现不一致的情况,通常是由于LOD Bias引起的。Unity的默认QualitySettings在编辑器下会选择Fantastic而出版本会选择Fasttest。

1

如图Fantastic项上有白色蒙板表示编辑器下选择的品质,而绿色的checkbox表示不同平台出版本时的品质。不同品质下的Lod Bias默认设置会不一样。

2

Unity各品质的Lod Bias默认值分别为:Fastest 0.3、Fast 0.4、Simple 0.7、Good 1、Beautiful 1.5、Fantastic 2。在编辑器中可以通过LOD Group组件查看当前的LOD Bias的值,如下图。

3

当出现不同平台LOD表现不一致时记得检查QualitySettings。参考:http://docs.unity3d.com/Manual/class-QualitySettings.html