Unity3D游戏开发笔记-2

  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. GPU优化

    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. CPU优化

    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的,优先使用结构体代替类。

原文地址:https://blog.csdn.net/ss5214423/article/details/96136274

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先