Unity教程之记一次基于Unity的Profiler性能分析

 

本篇unity教程我们来学习下Unity的Profiler性能分析

A. WaitForTargetFPS: 
      Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间 
   B. Overhead: 
      Profiler总体时间-所有单项的记录时间总和。用于记录尚不明确的时间消耗,以帮助进一步完善Profiler的统计。 
        C. Physics.Simulate: 
      当前帧物理模拟的CPU占用时间。 
   D. Camera.Render: 
      相机渲染准备工作的CPU占用量 
   E. RenderTexture.SetActive: 
      设置RenderTexture操作. 
      底层实现:1.比对当前帧与前一帧的ColorSurface和DepthSurface. 
               2.如果这两个Buffer一致则不生成新的RT,否则则生成新的RT,并设置与之相对应的Viewport和空间转换矩阵. 
   F. Monobehaviour.OnMouse_ : 
      用于检测鼠标的输入消息接收和反馈,主要包括:SendMouseEvents和DoSendMouseEvents。(只要Edtor开起来,这个就会存在) 
   G. HandleUtility.SetViewInfo: 
      仅用于Editor中,作用是将GUI和Editor中的显示看起来与发布版本的显示一致。  More

Unity教程之再谈Unity中的优化技术

 

这篇unity教程旨在简要地说明一下常见的各种优化策略。不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料。上一篇文章Unity3d优化之从Draw Calls到GC 我们也关于unity3d优化做了详细的讲解,本篇文章我们再来继续谈一下unity优化技术

影响性能的因素

首先,我们得了解,影响游戏性能的因素哪些,才能对症下药。对于一个游戏来说,有两种主要的计算资源:CPU和GPU。它们会互相合作,来让我们的游戏可以在预期的帧率和分辨率下工作。CPU负责其中的帧率,GPU主要负责分辨率相关的一些东西。

总结起来,主要的性能瓶颈在于:

  • CPU
    • 过多的Draw Calls
    • 复杂的脚本或者物理模拟
  • 顶点处理
    • 过多的顶点
    • 过多的逐顶点计算
  • 像素(Fragment)处理
    • 过多的fragment,overdraws
    • 过多的逐像素计算
  • 带宽
    • 尺寸很大且未压缩的纹理
    • 分辨率过高的framebuffer

对于CPU来说,限制它的主要是游戏中的Draw Calls。那么什么是Draw Call呢?如果你学过OpenGL,那么你一定还记得在每次绘图前,我们都需要先准备好顶点数据(位置、法线、颜色、纹理坐标等),然后调用一系列API把它们放到GPU可以访问到的指定位置,最后,我们需要调用_glDraw*命令,来告诉GPU,“嘿,我把东西都准备好了,你个懒家伙赶紧出来干活(渲染)吧!”。而调用_glDraw*命令的时候,就是一次Draw Call。那么为什么Draw Call会成为性能瓶颈呢(而且是CPU的瓶颈)?上面说到过,我们想要绘制图像时,就一定需要调用Draw Call。例如,一个场景里有水有树,我们渲染水的时候使用的是一个material以及一个shader,但渲染树的时候就需要一个完全不同的material和shader,那么就需要CPU重新准备顶点数据、重新设置shader,而这种工作实际是非常耗时的。如果场景中,每一个物体都使用不同的material、不同的纹理,那么就会产生太多Draw Call,影响帧率,游戏性能就会下降。当然,这里说得很简单,更详细的请自行谷歌。其他CPU的性能瓶颈还有物理、布料模拟、粒子模拟等,都是计算量很大的操作。

而对于GPU来说,它负责整个渲染流水线。它会从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。因此它的性能瓶颈可能和需要处理的顶点数目的、屏幕分辨率、显存等因素有关。总体包含了顶点和像素两方面的性能瓶颈。在像素处理中,最常见的性能瓶颈之一是overdraw。Overdraw指的是,我们可能对屏幕上的像素绘制了多次。

了解了上面基本的内容后,下面涉及到的优化技术有:

  • 顶点优化
    • 优化几何体
    • 使用LOD(Level of detail)技术
    • 使用遮挡剔除(Occlusion culling)技术
  • 像素优化
    • 控制绘制顺序
    • 警惕透明物体
    • 减少实时光照
  • CPU优化
    • 减少Draw Calls
  • 带宽优化
    • 减少纹理大小
    • 利用缩放

More

Unity教程之-Unity网格合并及材质合并

 

写在前面:

从优化角度,Mesh需要合并。

从换装的角度(这里指的是换形状、换组成部件的换装,而不是挂点型的换装),都需要网格合并、材质合并。如果是人物的换装,那么需要合并SkinnedMeshRenderer,并重刷对应的骨骼列表。结合网格有利于性能最优化。如果mergeSubMeshes为true,所有的网格会被结合成一个单个子网格。否则每一个网格都将变成单个不同的子网格。如果所有的网格共享同一种材质,设定它为真。如果useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。

示例:

1,新建两个Cube,和一个Cylinder。分别作为坦克的底盘(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。如下图所示。

More

Unity教程之-Unity3d发布安卓:三步教你发布自己的apk文件

 

在我们写完游戏之后每个人都想发布成.apk文件,然后安装在自己的手机里,一来测试效果怎么样,二来可以玩玩自己发布的安卓游戏,感觉都是挺不错的,下面就介绍一下unity发布成安卓apk文件的一些设置,其实也很简单,三步教你发布自己的安卓游戏。
第一步:JAVA环境变量设置:
下载安装jdk-7u40-windows-x64,我自己电脑是64位,你可以下载适合你电脑操作系统的jdk然后来安装..我的安装目录是:.C:\Program Files\Java\jdk1.7.0_40(这个就是你自己的安装目录,你可以自己设置),配置java环境变量,这些配置网上都有我也把配置给大家说下:
1.在系统变量新建JAVA_HOME变量,变量值:C:\Program Files\Java\jdk1.7.0_40(这个就是你自己的安装目录
 
More

Unity3d Shader编程之实时动态反射周围世界

 

先截出一个效果图:

要反射出周围世界
我们只需要一个周围世界的cubemap

先来看反射的shader

首先声明变量:
_Cubemap                  需要反射的cubemap
_ReflAmount              反射的强度

More

Unity教程之-Unity脚本自带函数执行顺序

 

在unity的脚本中,有大量的脚本执行按照预先确定的顺序执行的事件函数,由于篇幅有限,无法一一列举,这里只列举一些常用的自带函数的顺序,并论述他们之间的区别。
在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的。
Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy
秉着实践是检验真理的唯一标准,咱们可以将下面脚本挂在一个物体运行,从打印结果中便可以看到执行顺序 More

Unity教程之-Unity3d游戏开发之小地图的再实现

 

本篇教程,我们再来学习下unity3d中小地图的实现,在我之前的文章《Unity3D游戏开发之小地图的实现》一文中,我为大家讲解了基于OnGUI()方法绘制贴图实现小地图的方法。那么,今天呢,博主再来为大家分享一种实现小地图的方法。在正式开始今天的文章之前,我们先来了解下Unity3D中的相机吧。在Unity3D中,相机是一个能够为玩家捕获并显示游戏世界的设备。通过操纵相机,我们可以使得我们的游戏场景以更加真实和独特的方式显示出来。在Unity3D中默认有一个主相机Main Camera用来显示我们设计的游戏场景,其实呢,在一个游戏场景中我们是可以设置多个相机对象的,而且它们可以被设置为任意的渲染序列、任意的渲染部分和任意的渲染位置。下面我们来讲解一些比较重要的东西吧!

1、Clera  Flags:决定场景的哪个部分需要清除。当需要使用多个相机以显示不同的游戏元素时这是非常有用的。

2、Background Color:处于所有对象之后的背景颜色,设置此属性后,天空盒子(SkyBox)将失效。

3、Normalized View Port Rect:在屏幕坐标系下使用四个值来确定相机的哪些部分将显示在屏幕上。

4、Near Clip Plane:相对于相机昀近绘制点。

5、Far Clip Plane:相对于相机昀远的绘制点。

6、Field of view:沿着局部 Y轴的相机视角宽度。

7、Is orthographic:打开或关闭相机的景深效果

8、正交视大小(Orthographic size):在正交模式下的视口大小。

9、Depth:相机的绘制顺序,相当于ZIndex属性,具有较高深度的相机将绘制在较低深度相机的上面。

好了,有了上面的基础,我们就可以开始今天的正式内容了,如图是博主自己创建的一个游戏场景,游戏场景是在一个没有光照的黑暗的屋子里面,我们的游戏主角头顶上添加了一个点光源,所以当游戏主角运动的时候,其经过的场景会被主角头顶上的光源照亮,我们现在要做的就是为这个游戏场景添加一个小地图,以保证玩家在玩游戏的时候不会在黑暗的屋子里迷路。 More

Unity教程之-Unity3d游戏开发之小地图的实现

 

本篇文章我们来学习下如何在unity中实现小地图

今天我们来讲一下在Unity3D中如何实现小地图。首先,我们来一起看看最终实现的效果:

More

Unity教程之-如何不绑定脚本且不继承MonoBehaviour做unity3d开发

 

本篇文章我们开始新的unity3d教程,在不绑定脚本且不继承MonoBehaviour来实现我们的游戏开发。

要点:我们把脚本绑在对象上为什么不把对象抓到脚本里殴打呢?

问题:那不继承Mono的话,协同以及实例化,以及每帧运算该怎么去做呢?

最近看到一个做技能冷却的话题,所以也想去尝试一下。

1.这是界面2D和3D摄像机

More

Unity教程之-C#特性Attribute与自动化在unity3d中的应用

 

这篇文章主要讲一下C#里面Attribute的使用方法及其在unity3d中可能的应用场景。
比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要根据这个枚举获取属性的描述文本。
比如你做网络框架的时候,一个协议号对应一个类的处理或者一个方法。
比如你做ORM,一个类的属性是否映射持久化文件中的属性,映射过去的属性名是什么。

1、什么是Attribute
如果用过Java的Annotation的同学,可以把Attribute当成Annotation来看待。
还不了解Attribute的同学不用急,我们看一下官方的解释:

Attribute class associates predefined system information or user-defined custom information with a target element. A target element can be an assembly, class, constructor, delegate, enum, event, field, interface, method, portable executable file module, parameter, property, return value, struct, or another attribute.
Information provided by an attribute is also known as metadata. Metadata can be examined at run time by your application to control how your program processes data, or before run time by external tools to control how your application itself is processed or maintained. For example, the .NET Framework predefines and uses attribute types to control run-time behavior, and some programming languages use attribute types to represent language features not directly supported by the .NET Framework common type system.
Attribute class. Attributes can be applied to any target element; multiple attributes can be applied to the same target element; and attributes can be inherited by an element derived from a target element. AttributeTargets class to specify the target element to which the attribute is applied.
Attribute class provides convenient methods to retrieve and test custom attributes. Applying Attributes and Extending Metadata Using Attributes.

翻译过来就是:

Attribute类可以把目标元素和一个预定义的信息或者是用户自定义信息关联起来。这里的目标元素可以是assembly,class,constructor,delegate,enum,event,field,interface,method,可执行文件模块,parameter,property,return value,struct或其它的Attribute。
Attribute提供的信息也被称为元数据(metadata)。元数据能用于在运行时控制怎样访问你的程序数据,或者在运行前通过额外的工具来控制怎样处理你的程序或部署它。例如.NET Framework预定义并使用attribute去控制运行时行为,一些编程语言使用attribute类型来描述.NET Framework中通用类型不直接支持的语言特性。
所有的Attribute类型直接或间接从Attribute类继承。Attribute能应用到任何target元素;多个Attribute能应用到相同的元素;
Attribute类提供遍历的方法去取出和测试自定义Attribute。更多关于Attribute的信息,可以看Applying Attributes和Extending Metadata Using Attributes。
如果你看了官方的解释不明白,看了我的翻译也不明白。也没事。。。我们接下来举个例子看看Attribute能做啥。

More