2017-07-03 18:57:01 ewankiller 阅读数 2464

1.动态批处理仅支持顶点数小于900的网格物体。

2.如果Shader使用了顶点位置、法线、UV值三种属性,则只能动态批处理300个顶点以下的物体。如果Shader使用了顶点位置、法线、UV0、UV1 和切向量,那么只能动态批处理180个顶点以下的物体。

3.不要使用缩放,分别有缩放(1,1,1)和(2,2,2)的两个物体将不会进行批处理。

4.统一缩放的物体不会与非统一缩放的物体进行批处理。

5.使用缩放比例(1,1,1)和(1,2,1)的两个物体将不会进行批处理,但使用缩放尺度(1,2,1)和(1,3,1)的两个物体可以进行批处理。

6.使用不同材质的实例化物体将会导致批处理失败。

7.拥有lightmap的物体不会进行批处理,除非他们指向lightmap的同一部分。

8.多通道的Shader会妨碍批处理。因为几乎Unity中所有的着色器都在前向渲染中支持多个光源,并为其有效开辟多个通道。

9.预制体的实例化会自动使用相同的网格模型和材质。

2019-10-31 11:25:58 songhuanfei2017 阅读数 65

比如游戏各个模型是独立的,它们的材质以及贴图很有可能是完全一样的,但是由于一些模型数据不一样,放入Unity中会占很多DrawCall,所以Unity提供了一个属性来做静态合批,可以将它们合并在一个Mesh里。

//--设置静态合批

首先在Edit→Project Settings→Player中勾选Static Batching静态合批和Dynamic Batching动态合批复选框。

接着,比如两个Cube都选中Batching Static标记,然后运行游戏。

Mesh Filter会自动生成一个新的Mesh。

这样如果有相同材质 Shader 并且参数一致的话,就会合并DrawCall。

静态合批的最大顶点数是65535,如果定点数超过了它,Unity就会自动合并出多个Mesh。

//--脚本静态合批

自动的静态合批用起来很方便,但是也是有隐患。加入场景很大,合并出来的Mesh就会很大。游戏运行后只要有一小部分出现在摄像机内,那么整个大的Mesh都需要参与渲染。还有最大定点数的限制。

我们可以利用脚本来动态设置需要合并在一起的游戏对象,游戏对象不需要选中Static标记。

using UnityEngine;

public class StaticBatchingByScript : MonoBehaviour
{
    public GameObject[] cubes;

    private void Start()
    {
        StaticBatchingUtility.Combine(cubes, gameObject);
    }
}

 如图:

 

代码含义就是将数组中的游戏对象合并在同一个Root节点下,也就是第二个参数。

另外运行游戏后合并过的Mesh 对象是不可以发生位移的,但是可以移动他们指定的Root节点。

//--动态合批

动态合批是全自动的,我们不需要做任何事情。但是它是有要求的,Mesh的顶点数量要小于300。如果Shader中使用了顶点位置 法线 UV0 UV1 和切线,Mesh的定点数必须小于180。(在粒子特效中它发挥了很大的优势)。

//--静态合批的隐患

静态合批的原理就是自动生成Mesh,但是不同的Mesh保存的信息可能是不同的。例如Mesh中可能会保存color 和 tangent,但是大部分Mesh都是不需要这个信息的,如果静态合批中有一个Mesh包含了这个信息,那么合并后整个Mesh都会带上它,这样无疑会增加一些额外的开销。

很多时候是美术在导出FBX时,操作不当导致添加了没用的color 和 tangent信息,所以可以利用FBX官网提供的FBX接口,自己写一个Python脚本来删除它们。

没有脚本,我不会Python,哈哈。等会了加上。

2019-11-20 17:00:53 qq_27534999 阅读数 37

半透明粒子特效 Prefab,内含多个 ParticleSystem,复制多个后 DrawCall 增加明显,在 FrameDebugger 里发现粒子特效无法动态合批,说是材质球不同,但其实材质球明明是相同的,令人疑惑。

查阅官方文档 https://docs.unity3d.com/Manual/DrawCallBatching.html,发现下边这一段话:

Semi-transparent Shaders usually require GameObjects to be rendered in back-to-front order for transparency to work. Unity first orders GameObjects in this order, and then tries to batch them, but because the order must be strictly satisfied, this often means less batching can be achieved than with opaque GameObjects.

表述有些模糊,但判断和 RenderQueue 有关。

之后将相同材质球单独设置不同的 RenderQueue。

Prefab里有四个东西,都是ParticleSystem组件:

1、最靠前的硬币 设为 3004

2、其次的背光 设为3003

3、星星闪光 设为3002

4、最后一条竖光 设为 3001

设好后,发现合批成了4个 DrawCall ,非常舒服。(如果其他场景有共用材质球得注意一下,别乱改,层级会乱,得新建一个)

 

 

2019-11-28 23:40:00 cgExplorer 阅读数 25

在unity2018.3官方API文档基础上整理一些链接,更好理解官方文档内容

一、ColorSpace(色彩空间):Unity3D - 颜色空间 (Color Space)

二、static Btching(静态批处理)和DynamicBatching(动态批处理):Unity动态合批(Dynamic Batching)与静态合批(Static Batching)

这个批处理对于unity制作的2D游戏是否勾选这两项还有些疑问,望知情者讲解一下

三、ScriptingBackend:Unity优化之IL2CPP & Mono

四、Target Architectures(目标架构):个人总结这个的选择主要看发布目标处理器情况,不过也有大神因系统版本遇坑案例

遇坑者:【我的Android进阶之旅】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

五、InstallLocation(安装位置):找一个android关于此处的讲解,感觉很到位:installLocation 之深入理解和使用注意事项

六、Optimize Mesh Data(优化mesh数据):虽然这里可以优化材质渲染,但是有时会由于优化后减少了mesh定点数等情况,造成内部脚本错误,所以小心使用

七、Managed Stripping Level(托管剥离级别):此处视情况设定,太高可能将用到的脚本剥离造成不必要的麻烦,此处可能需要了解AOT和JIT帮你更好的理解脚本处理模式和脚本剥除原因:AOT,JIT区别,各自优劣,混合编译

八、最后分享一个人的每周分享,感觉写的问题挺多的,可以多看看:Unity3d 周分享(13期 2019.3.23 )

附录:主要是为了优化游戏,所以重点提出以下几点:

1、Batching 动态和静态批处理在2d游戏中是由很多四边形组成
2、启用TextureStreaming 开始加载大内存转为加载小内存
3、mute other Audio source 禁用后台来的其他音频源
4、Disable HW Statistics:禁用硬件统计
5、TargetArchitectures目标引擎主要是不同处理器arm还是inter
6、install Location:Force Internal将app安装到内部存储,外部存储有风险例如api8级一下不支持
7、optimize Mesh Data:优化网格数据,删除材质不需要的任何数据(不要勾选,选择后可能会逻辑出错)

2015-05-09 15:49:10 d814617937 阅读数 2424

在unity3d开发中,为了降低场景的运行消耗,通常要利用Unity3d的静态合批和动态合批。因为动态合批要求的条件比较苛刻。所以大部分用的都是静态核批。
利用静态核批就需要尽量的合并场景的贴图,用相同的材质。并把场景物件设置成静态的。这样unity在运行的时候就会自动进行合批,从而降低drawcall。
这样的静态设置在打包的时候就有问题了。因为当你把预设设置成静态之后,在打包的时候是不会进行去重打包的。也就是同样的两个预设只要设置成静态的,就会被打成两份,最终占用两份的包空间。这在游戏项目的空间浪费是很客观的。因为目前游戏的关卡基本都是分章节的。每章用的基本都是一样的模型,只是位置不同。
如果不设置成静态,drawcall又会很多。为了两者都兼备,这里可以利用unity提供的一个api。在打包的时候所以的场景预设都取消静态设置,在运行的时候调用StaticBatchingUtility.Combine(gameObject);gameobject就是场景预设。这样就可以进行静态合批,无论你有没有设置预设为静态。这样就既减少了drawcall又节省了包体空间。

unity3d中添加场景UI

阅读数 144

没有更多推荐了,返回首页