Unity3d开发(十一)编辑器DrawCall参数解析

对于Unity运行场景中,有许多可以标记场景状况的参数。这篇文章主要探讨这些参数的意义,其中如果有错误欢迎指正。

Game Stats

点击游戏Tab下的Stats可以展开如下界面,可以方便我们查看游戏运行状态。

FPS & Time per frame

FPS是通常说的帧率。每帧用时指的是渲染一帧需要消耗的用时,这个值只包含每帧更新游戏视图的时间,不受其他在编辑器中功能的影响,例如Profiler。FPS是这个数字的倒数。值得注意的是,这个值会比我们通常说的帧率要高,因为我们是直接计算两帧之间的时间差的。我猜想手机打包之后两个值的差会变小,但也不会绝对一样。

Batches & DrawCall

这个是绘制图像的重要指标,可以作为衡量场景绘制效率的首要参考。

一个 Draw Call,等于呼叫一次 DrawIndexedPrimitive (DX) or glDrawElements (OGL),等于一个 Batch。

NVIDIA 在GDC上曾提出 25k batch/sec的渲染量会使1GHz的CPU达到100%的使用率,因此使用公式

25K?n(GHZ)?Percentage/Framerate=Batch/Frame

可以推算出某些CPU可以抗多少Batch。例如红米手机CPU为1.5GHz,假设分出20%资源供渲染,希望游戏跑到30帧。那么能抗多少DrawCall? 25k * 1.5 * 0.2 / 30 = 250。因此从这方面也能看出,如果CPU不能分出更多的资源供渲染计算,能抗的DrawCall就会变少。

在Stats面板中看到的Batches是渲染的总Batch这个值等于同于DrawCall。但Unity中可以获取到未批次处理之前的DrawCall。因此需要注意不要混淆概念。

Saved By Batching

这个值是由于Batch减少的DrawCall,可以间接的看到场景优化的效果。这个值由两部分组成:Static BatchingDynamic Batching。这个由Unity内建自动合并虽然优点多多,但也不是没有缺陷。静态合并会引发内存和存储的额外开销,动态合并会增加CPU的负担。 这部分内容参考Unity官方文档

总体上讲所以希望批次渲染的元素要有相同的材质。通常两个材质如果只有贴图不同,可以将贴图合并到一张大图中,这就是所谓的和图。另外在使用ShadowCaster时,只要材质相同,即使贴图不同也可以合并渲染。

Dynamic Batches

动态合并在满足以下条件时是自动完成的:

  • 模型总顶点数小于900。
  • 不包含镜像transform改变。不改变Scale。
  • 如果使用动态lightmap需要指定正确。
  • 不使用多Pass的Shader.

由于需要在合并时通过CPU计算转为世界坐标,这项技术只在CPU消耗比DrawCall消耗“便宜”时才值得。这个衡量标准会根据平台产生差异,例如苹果平台上DrawCall的消耗便宜,就不应该使用这项技术。这个功能可以在Editor->Project Setting->Player中进行设置打开与关闭。

Static Batches

场景中不能移动的物件可以使用静态合并,它不受顶点数的限制,可以大幅减少DrawCall。但为了将元素合并到一个大模型中,这项技术需要额外的内存。主要的内存消耗在于共享多边形会在内存中重复创建。因此有时候需要牺牲渲染效率来避免静态合并,来保证内存够小。例如在茂密的树林中使用这项技术会导致大量的内存消耗。

Tris & Verts

摄像机下的所有三角形和顶点这个在低端硬件上也是主要瓶颈。

脚本获取值

其他数据暂时先不关注了,有必要以后可以再单写一篇。在编辑模式下这些数据是可以通过脚本获取到的,不过打出包来不太成。简单写了一下,效果如下:

其中所有的立方体使用静态合并,面片使用动态合并。场景UI一共17个Batch。动态批次1个,静态批次2个(不知拆分规则),批次渲染一共20。每一个动态物体1个DrawCall,共20个,4个动态物体1个DrawCall,17个UI产生的DrawCall,共38个。

相关代码如下:

using UnityEngine;
using System.Collections;
using UnityEditor;

public class testDC : MonoBehaviour
{
    #region Unity Messages

    void OnGUI()
    {
        GUILayout.TextField("Total DrawCall: " + UnityStats.drawCalls);
        GUILayout.TextField("Batch: " + UnityStats.batches);
        GUILayout.TextField("Static Batch DC: " + UnityStats.staticBatchedDrawCalls);
        GUILayout.TextField("Static Batch: " + UnityStats.staticBatches);
        GUILayout.TextField("DynamicBatch DC: " + UnityStats.dynamicBatchedDrawCalls);
        GUILayout.TextField("DynamicBatch: " + UnityStats.dynamicBatches);

        GUILayout.TextField("Tri: " + UnityStats.triangles);
        GUILayout.TextField("Ver: " + UnityStats.vertices);
    }

    #endregion
}
时间: 2024-10-11 02:53:12

Unity3d开发(十一)编辑器DrawCall参数解析的相关文章

QT开发(四十一)——XML文件解析基础

QT开发(四十一)--XML文件解析基础 一.XML文档简介 XML(Extensible Markup Language,可扩展标记语言),是一种通用的文本格式,被广泛运用于数据交换和数据存储,而不是显示数据.XML的标签没有被预定义,用户需要在使用时自行进行定义.XML是W3C(万维网联盟)的推荐标准.相对于数据库表格的二维表示,XML使用的树形结构更能表现出数据的包含关系,作为一种文本文件格式,XML简单明了的特性使得它在信息存储和描述领域非常流行. <?xml version="1

Unity3D开发Windows Store应用程序 注意事项

原地址:http://blog.csdn.net/jbjwpzyl3611421/article/details/12704491 针对最近在移植window store项目中遇到的问题,我整理了官方说明, 在此和各位开发者分享,避免在移植过程中走弯路!     Platform status 平台现状   Currently if you want to build a Windows Store apps player, you have to do it on Windows 8, thi

document.execCommand()函数可用参数解析

隐藏在暗处的方法-execCommand() 关键字: javascript document document.execCommand()方法可用来执行很多我们无法实现的操作. execCommand方法是执行一个对当前文档,当前选择或者给出范围的命令. document.execCommand()方法处理Html数据时常用语法格式如下: 复制内容到剪贴板 代码: document.execCommand(sCommand[,交互方式, 动态参数]) 其中:sCommand为指令参数(如下例中

NGINX模块开发 之 验证URL参数

作者:邹祁峰 邮箱:[email protected] 博客:http://blog.csdn.net/qifengzou 日期:2014.05.26 16:45 转载请注明来自"祁峰"的CSDN博客 要求在浏览器地址栏中输入"localhost/login?user=qifeng&passwd=123456",并在浏览器上显示验证结果(Success 或 Failed).以下是在NGINX中添加一个LOGIN模块的整个处理过程. 1 修改配置 修改配置文件

Unity3D开发基础组件提取总结

在游戏开发过程中,除了逻辑功能的开发之外,还有非常多基础的模块.这些模块,对大部分手机网络游戏来说都是一样的.所以,在上个游戏已经上线运营大半年之际,我认为有必要将这些模块整理出来.让后面其它游戏的开发,能够不用从0開始.该游戏client採用Unity3D开发,那么我们这里抽取的基础组件也就是针对Unity3D引擎来的. 简单的梳理之后,我发现主要有下面一些模块,能够独立抽取出来,当然各个模块之间也有一个依赖关系.比方日志模块,差点儿是全部模块都须要依赖的. 1.日志模块 游戏开发中,我们避免

十一.jQuery源码解析之.pushStack()

pushStack()顾明思意,就是像桟中添加东西呗,现在看看他是如何添加东西的. 创建一个空的jQuery对象,然后把Dom元素集合放入这个jQuery对象中, 并保留对当前jQuery对象的引用. pushStack是核心方法之一,它为以下方法提供支持: jQuery对象遍历:.eq(),first(),.last(),.slice(),.map(); Dom查找,过滤:.find(),.not(),.filter(),.closest(),.add(),.andSelf(). Dom遍历:

Python命令行选项参数解析策略

概述 在Python的项目开发过程中,我们有时需要为程序提供一些可以通过命令行进行调用的接口.不过,并不是直接使用 command + 当前文件 就ok的,我们需要对其设置可选的各种各样的操作类型.所以,这种情况下我们就有必要对传入的参数进行解析操作.下面就此问题提出几种不同的解决策略,希望于你有益. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga 发表日期: 2016年3月18日 链接:http://blog.csdn.net/l

iOS网络编程开发—JSON和XML数据解析

iOS网络编程开发—JSON解析 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的

Scala深入浅出实战经典---001-Scala开发环境搭建和HelloWorld解析

001-Scala开发环境搭建和HelloWorld解析 Scala 函数式编程和面向对象结合的语言 函数式编程擅长数值计算 面向对象擅长大型工程和项目的组织以及团队的分工协作 Scala会是下一个伟大的语言吗? Spark是用Scala语言编写的 Hadoop是用Java语言编写的 少动一根手指 Scala开发环境 基于JVM的运行环境 需要安装JAVA 建议7或者8版本 注意选择匹配的位数和系统的JAVA 配置环境变量 JAVA_HOME PATH中添加bin目录 CLASS_PATH dt