设为首页 收藏本站
开启辅助访问 快捷导航
菜单
猿人部落 主页 资讯 查看内容

Unity3D游戏开发笔记-2【优化】

2019-8-1 05:11 发布者: 古田高山 评论 0 查看 1540
渲染流程 起首汲取用户提供的多少数据,而且将他们输入到一系列着色器阶段中举行处理处罚,末了将数据转换到终极
  1. 渲染流程

    1. 起首汲取用户提供的多少数据,而且将他们输入到一系列着色器阶段中举行处理处罚,末了将数据转换到终极渲染的图像。顶点数据->顶点着色器->细分控制着色器->细分盘算着色器->多少着色器->图元设置->剪切剔除->光栅化->片元着色器->终极渲染的图像。

    2. 不肯定会用到全部的着色阶段,只有顶点着色器和片元着色器是必须的。一个复杂的引用步调大概包罗许多个顶点着色器,但在同一时候只能有一个顶点着色器起作用。

    3. 每一帧画面的渲染过程,大抵如下
      i. CPU查抄场景中的每个对象来确定他是否必要渲染,而且将每个必要渲染的对象参加到DrawCall指令中,部门具有雷同属性的对象大概会Batch到同一个DrawCall中。
      ii. CPU会向GPU发送SetPassCall指令,在当前RenderState与下次差别时,SetPassCall会告知GPU在下次渲染Mesh时要使用哪种设置。
      iii. GPU根据CPU的指令实行使命,实行次序与指令发送次序雷同。
      iv. DrawCall->GPU渲染Mesh,SetPassCall->GPU更新RenderState

  2. 渲染优化

    1. 添补率
      i. 低沉游戏分辨率
      ii. 使用光照贴图并镌汰逐像素灯光的数目
      iii. 镌汰FragmentShader中复杂或非须要的盘算,不寻求高精度的部门盘算移至VertexShader中完成
      iv. 镌汰粒子及透明物体的叠加或混淆(低沉OverDraw)
      v. 镌汰后期效果的数目或优化其算法低沉盘算量。
    2. 显存带宽
      i. 纹理的数目
      ii. 纹理的尺寸
      iii. 根据平台芯片选择对应的纹理压缩格式和修改项目设置中的TextureQuality。
      iv. 会发生远近变革或缩放的物体必要使用Mipmap来镌汰带宽占用并提升体现效果,减轻摩尔纹或改善近隔断分辨率不敷的环境,其他环境下则可以关闭Mipmap来节省内存。
      v. 关闭纹理的ReadWriteEnable,镌汰内存和带宽占用。
    3. 顶点数
      i. 低沉模子复杂度,可使用法线纹理进步体现效果。
      ii. 调解模子导入属性,选择相应的压缩品级。
      iii. 在项目设置中调解顶点数据的压缩内容。
      iv. 使用LOD调解体现细节。
      v. 使用OcclusionCulling,举行遮挡剔除。
    4. DrawCall
      i. 静态批处理处罚,会增长网格的资源量,占用内存及磁盘空间。
      ii. 动态批处理处罚,在游戏运行时举行Batching操纵,必要注意的是,动态批处理处罚的网格顶点属性要少于900个,以是在shader中使用到的顶点属性要尽大概的少,而且要制止使用多通道shader。
      iii. 美术方面的预处理处罚,根据设定的可视范围,调解归并材质及网格,可以大概使用Tiling的纹理尽大概接纳Tilling的方式。
      iv. 使用LOD调解体现细节。
      v. 使用遮挡剔除,但部门环境下大概会造成额外开销。
    5. 镌汰反射,阴影,深度图的影响范围及调解相机的裁剪范围,会显着低沉渲染开销。
  3. 脚本优化

    1. 移除脚本中的无效代码和空方法。
    2. 频仍使用的变量可以声明为全局变量。
    3. 镌汰游戏运行时获取组件的操纵,应尽大概在全局变量中缓存。
    4. 可以大概在资源制作过程中序列化的,优先思量通过序列化的方法得到组件。
    5. 客户端的可见组件,可以通过检测OnBecameVisible/OnBecameInvisible来确认是否在可见范围内,而且据此调解逻辑更新频率或内容。
    6. 频仍体现关闭的组件对象,可以通过移出屏幕的方式低沉开销。
    7. 镌汰Object的实例化和烧毁操纵,尽大概使用对象池重复使用。
    8. 必要在Update中频仍查找的同一组件,尽大概的在初始化阶段缓存起来。
    9. 字符串拼接,最好使用StringBuilder。
    10. 镌汰高频的复杂盘算,如及时性需求不高,可做分帧处理处罚。
  4. 物理碰撞

    1. 调解Fixed Timestep,控制物理盘算频率。
    2. 镌汰MeshCollider,优先使用BoxCollider,SphereCollider。
    3. 网络同步操纵若必要使用物理组件,应打开IsKinematic,并接纳相应的活动公式控制移动,检测方式为OnTrigger。
  5. GC

    1. Mono运行时的托管堆,重要是类实例,字符串和数组。
    2. 触发方式
      i. 堆内存不敷时,自动调用GC
      ii. 手动调用GC
    3. 内存分配
      i. 起首查抄空闲内存是否充足。
      ii. 假如不敷,举行一次GC,接纳内存。
      iii. 假如仍然不敷,会向操纵体系申请内存,扩充现有堆内存。
      iv. 已分配的内存不会交还给操纵体系,只会接纳到Mono的堆内存。
    4. 内存接纳过程
      i. 制止必要分配内存的线程。
      ii. 遍历内存,找到无引用的内存,并标志。
      iii. 接纳被标志的内存到空闲内存。
      iv. 继续启动被制止的线程。
    5. 内存走漏
      i. 引用丢失,导致无法通过任何途径访问到,但该对象仍有引用关系,无法被标志成垃圾。
      ii. 大部门环境都是由于静态对象引用导致的,静态对象中不再使用的对象应将其设置为null,使其可以被GC标志并接纳。
    6. 注意点
      i. 字符勾通接的处理处罚,是在堆上分配的空间,竣事后原字符串会成为垃圾,新字符串为新分配的空间。
      ii. 尽大概不要使用foreach,优先使用for
      iii. 使用对象池,重复使用对象,镌汰实例化烧毁的操纵。
      iv. 只管不要使用LINQ。
      v. 优先使用局部变量。
      vi. 必要频仍new的,优先使用布局体代替类。


路过

雷人

握手

鲜花

鸡蛋
收藏 邀请
上一篇:python棋牌游戏开发之斗地主下一篇:C++连连看游戏开发,简单编程实例,一看就会!

相关阅读

一周热门

头条攻略!

日排行榜

相关分类