每一帧画面的渲染过程,大抵如下
i. CPU查抄场景中的每个对象来确定他是否必要渲染,而且将每个必要渲染的对象参加到DrawCall指令中,部门具有雷同属性的对象大概会Batch到同一个DrawCall中。
ii. CPU会向GPU发送SetPassCall指令,在当前RenderState与下次差别时,SetPassCall会告知GPU在下次渲染Mesh时要使用哪种设置。
iii. GPU根据CPU的指令实行使命,实行次序与指令发送次序雷同。
iv. DrawCall->GPU渲染Mesh,SetPassCall->GPU更新RenderState
渲染优化
添补率
i. 低沉游戏分辨率
ii. 使用光照贴图并镌汰逐像素灯光的数目
iii. 镌汰FragmentShader中复杂或非须要的盘算,不寻求高精度的部门盘算移至VertexShader中完成
iv. 镌汰粒子及透明物体的叠加或混淆(低沉OverDraw)
v. 镌汰后期效果的数目或优化其算法低沉盘算量。
显存带宽
i. 纹理的数目
ii. 纹理的尺寸
iii. 根据平台芯片选择对应的纹理压缩格式和修改项目设置中的TextureQuality。
iv. 会发生远近变革或缩放的物体必要使用Mipmap来镌汰带宽占用并提升体现效果,减轻摩尔纹或改善近隔断分辨率不敷的环境,其他环境下则可以关闭Mipmap来节省内存。
v. 关闭纹理的ReadWriteEnable,镌汰内存和带宽占用。
顶点数
i. 低沉模子复杂度,可使用法线纹理进步体现效果。
ii. 调解模子导入属性,选择相应的压缩品级。
iii. 在项目设置中调解顶点数据的压缩内容。
iv. 使用LOD调解体现细节。
v. 使用OcclusionCulling,举行遮挡剔除。
DrawCall
i. 静态批处理处罚,会增长网格的资源量,占用内存及磁盘空间。
ii. 动态批处理处罚,在游戏运行时举行Batching操纵,必要注意的是,动态批处理处罚的网格顶点属性要少于900个,以是在shader中使用到的顶点属性要尽大概的少,而且要制止使用多通道shader。
iii. 美术方面的预处理处罚,根据设定的可视范围,调解归并材质及网格,可以大概使用Tiling的纹理尽大概接纳Tilling的方式。
iv. 使用LOD调解体现细节。
v. 使用遮挡剔除,但部门环境下大概会造成额外开销。
内存分配
i. 起首查抄空闲内存是否充足。
ii. 假如不敷,举行一次GC,接纳内存。
iii. 假如仍然不敷,会向操纵体系申请内存,扩充现有堆内存。
iv. 已分配的内存不会交还给操纵体系,只会接纳到Mono的堆内存。
内存接纳过程
i. 制止必要分配内存的线程。
ii. 遍历内存,找到无引用的内存,并标志。
iii. 接纳被标志的内存到空闲内存。
iv. 继续启动被制止的线程。
内存走漏
i. 引用丢失,导致无法通过任何途径访问到,但该对象仍有引用关系,无法被标志成垃圾。
ii. 大部门环境都是由于静态对象引用导致的,静态对象中不再使用的对象应将其设置为null,使其可以被GC标志并接纳。
注意点
i. 字符勾通接的处理处罚,是在堆上分配的空间,竣事后原字符串会成为垃圾,新字符串为新分配的空间。
ii. 尽大概不要使用foreach,优先使用for
iii. 使用对象池,重复使用对象,镌汰实例化烧毁的操纵。
iv. 只管不要使用LINQ。
v. 优先使用局部变量。
vi. 必要频仍new的,优先使用布局体代替类。