unity能让草只产生一个unity drawcall 查看吗

如何降低Unity程序的Drawcall_百度知道你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
我有2个模型,都是用maya做的。
导入设置都一样。我将他们存为预设,然后用GameObject.Instantiate实例化出来。问题来了,为什么其中一个模型随着实例化物体增加Batches(dc)也跟着增加?而另一个确是正常的。
他们都是用同样的实例化方法实例化的。没有做过任何更改。我将会增加Batches的预设的Mesh改为正常的那个预设的Mesh就正常了。这是为什么?又如何解决?
急,求大神解答。。。
各种搜索,然后在贴吧搜到一个14年和我问一样问题的童鞋。
u3d对于超过300个顶点的Mesh不会进行合并处理,所以Batches会增加....
我把模型拆几个就好了。蛋疼的是模型不是一个整体,而是一个父子级物体......
好神奇。没有遇到过。期待一下。
你的那个mesh用到的纹理和材质是不是处理的有问题?多张纹理?多个材质球?
要回复问题请先或
浏览: 3867
关注: 3 人有谁知道:在场景中,导入一个模型有一个drawcall,复制N份相同的模型会有N个drawcall。而NGUI中,生成一个面片有一个drawcall,复制N份相同的面片也只有一个DrawCall。请问怎么实现NGUI这样的功能?
要评论请先&或者&
MeshRenderer不一样,带动画的3D模型必须是SkinnedMeshRenderer无法通过batch处理减少draw call。如果自己做成2D的角色,可以使用一般的MeshRenderer进行batch处理。
U3D支持代理物体吗?就像Max的渲染器Vray和Finalrender那样的
是这样的,NGUI之所以可以做到一个drawcall,是因为它将texture拼成一个atlas,即进行了texture packing,所以使得ui object共享了一个material,所以可以利用unity自身的static batching机制来获得1drawcall的效果。而复制n个相同模型无法得到一个drawcall是可能有以下几种原因:1、不是static物体;2、没有使用static batching。如果是static物体,即便copy n份,理论上也是1个drawcall(现实中是几个drawcall需要由硬件所决定)
:MeshRenderer不一样,带动画的3D模型必须是SkinnedMeshRenderer无法通过batch处理减少draw call。如果自己做成2D的角色,可以使用一般的MeshRenderer进行batch处理。 ( 21:44) 这样说的话,3d的骨骼动画就没有办法优化掉drawcall了,不知道这样理解有没有错误。如果有该怎么做?
:U3D支持代理物体吗?就像Max的渲染器Vray和Finalrender那样的 ( 22:39) 不清楚。
:是这样的,NGUI之所以可以做到一个drawcall,是因为它将texture拼成一个atlas,即进行了texture packing,所以使得ui object共享了一个material,所以可以利用unity自身的static batching机制来获得1drawcall的效果。 .. ( 23:14) 1.Unity can automatically batch moving objects into the same draw call if they share the same material. 2.If your shader is using Vertex Position, Normal and single UV, then you can batch up to 300 verts and if your shader is using Vertex Position, Normal, UV0, UV1 and Tangent, then only 180 verts. 我用的Shader是 &Unlit/Texture& ,里面只有一个 &_MainTex&属性。.不知道这个_MainTex属性里有没有包含Vertex Position, Normal and single UV, 这些值。如果包含,包含的是什么样的值 ?
:1.Unity can automatically batch moving objects into the same draw call if they share the same material. 2.If your shader is using Vertex Position, Normal and single UV, then you can batch up to 300 verts and if your shader is using Vertex Position, Normal, &.. ( 14:43) dynamic batching对物体的数据大小有着非常严格的控制,如果是场景中的静态物体,则建议直接打上static,如果是角色或npc,一般来说dynamic batching没有办法进行优化,因为数据基本上都超标,自然无法合批。_MainTex是指你所用的texture,你要看是否用到了uv,postion等值,你可以直接打开shader进行查看,看其在subshader的计算过程中是否用到了这些。
:dynamic batching对物体的数据大小有着非常严格的控制,如果是场景中的静态物体,则建议直接打上static,如果是角色或npc,一般来说dynamic batching没有办法进行优化,因为数据基本上都超标,自然无 .. ( 15:00) 我做了个骨骼动画测试:1.顶点数为550左右的时候,拖放一个物体到scene中,DrawCall为一。复制了4个相同的物体,DrawCall为5。&官方文档上有这样几句话:1. 批处理动态物体需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体。2.如果你的着色器使用顶点位置,法线和UV值三种属性,那么你只能批处理300顶点以下的物体;如果你的着色器需要使用顶点位置,法线,UV0,UV1和切向量,那你只能批处理180顶点以下的物体。这是翻译网址:http://blog.csdn.net/amazonzx/article/details/7437587&&我的shader是这样的:Shader &Unlit/Texture& {Properties {&& &_MainTex (&Base (RGB)&, 2D) = &white& {}}SubShader {&& &Tags { &RenderType&=&Opaque& }&& &LOD 100&& &&& &Pass {&& & & &Lighting Off&& & & &SetTexture [_MainTex] { combine texture } && &}}}&我的Shader中没有用到顶点位置,法线和UV值等属性,这样的话只要顶点数小于900就会Batching dynamic,这意味着drawcall应该为一。我不知道这是什么原因?我把我的测试程序上传了,里面有两个例子。第一个例子里面模型顶点数为550左右。第二个例子里面模型定点数不到300。这两个例子实验都没有成功。注:.FBX文件倒进去是带骨骼的,在Hierarchy窗口中,我把骨骼删掉了,发现删掉骨骼没有影响。不知道是不是这个原因导致了没有Batching dynamic。&&&&&unity(49)
.cn/s/blog_gbfr.html
原创文章如需转载请注明:转载自
&&&&&&&&&&&&&&&&&&&&&&DrawCall优化
一 Mesh Renderer
二 Skinned Mesh Renderer
三 合并要求对比
五 场景制作建议
DrawCall优化合并,即DrawCall Batching. 通过减少Draw call数 和对显卡性能的消耗来提高性能。
一 Mesh Renderer
分为Dynamic Batching和 Static Batching
Dynamic Batching
不需要任何操作,只要共享材质(即使是不同的Mesh模型也可以),就会自动被合并。可以自由移动旋转。但有以下使用要求:
(1)&模型文件共计点数不超过900。(重复使用同一个Mesh不计)
(2) 单个物体可以不超过300点,Shader可以有法线UV。
&&&&但如果Shader使用了 UV0 UV1两套UV,或者Tangent切线的话,单个物体只能不超过180点
(3)游戏对象使用相同模型和材质时,只有相同缩放(即xyz等比缩放,浮点尾数可以有细微差)的会被合并。
(1,1,1)与(1,1,1)
(2,2,2)与(2,2,2)
(0.5,0.5,0.5)与 (0.5,0.5,0.5)
(2,2,2)与(2,2,2.0001)
(4)场景烘焙:烘焙后同材质将不会被烘焙。lightmap 有隐藏的材质参数:offset/scale, 所以使用lightmap的物体不会被合并
(5)Shader不能使用多Pass:多Pass的Shader会破坏Dynamic Batching
Static Batching
运行游戏后将一组游戏对象的多个模型会被动态合并为1个。这组游戏对象所有使用同一材质的在一个DrawCall来完成。这些游戏对象运行后无法移动缩放旋转。但是Drawcall一定是最大化合并的,并且不受动态合并的诸多限制(见下文详述)。
注意:即使物体都使用了同样的模型,在batch后每一个物体都会创建一份模型对应的geometry,在新的Combined Mesh里。所以过多的batch会增加内存占用。例如场景里的树群就不适合Static Batch,而适合动态合并。
(1)MeshRenderer勾选Batching Static: 勾了即可
(2)代码中使用UnityEngine.StaticBatchingUtility实现(可以在任何平台调用):
&&&&&&1)将所有要合并的静态物体(不须勾Batching Static)放入统一一个root
&&&&&&2)StaticBatchingUtility.Combine(root);
&&&&&&之后就合并好了!
勾选Batching Static:
完全自动合并,在MeshFilter里显示的是 Combined Mesh(root:scene)。合并后不能移动
StaticBatchingUtility:
合并到一个游戏对象下。合并后可以移动父节点游戏对象
二 Skinned Mesh Renderer
没有任何batching, 故不是人物的话尽量少用。
(1)修改Renderer.material将会创建一份新的material,应使用Renderer.sharedMaterial来保持材质公用。
(2)可以使用Mesh.Optimize()&优化模型。导入模型不需要调用此接口,在导入模型至Unity3d时已自动处理。
代码创建的模型有可能需要调用此接口来优化。
三 合并要求对比
1 只能是MeshRenderer不能是SkinnedMeshRenderer
2 Shader必须是单Pass
3 不能被场景烘焙(不能标注为Light map static)
4 网格模型文件总点数要求
5 网格模型单个文件点数要求
6 限制缩放
7 限制位移旋转
三种方式:
1 动态合并
&&&&优点:
&&&&&&&&内存消耗小
&&&&&&&&可以自由位移旋转
&&&&缺点:
&&&&&&&&要求众多()
2 标记Light map static合并
&&&&优点:
&&&&&&&&最方便快捷,要求最少
&&&&缺点:
&&&&&&&&完全不能移动
&&&&&&&&内存有消耗
&&&&&&&&只能处理在Scene中默认放置的物体
3 代码StaticBatchingUtility合并
&&&&优点:
&&&&&&&&方便快捷,要求少
&&&&&&&&可整体移动
&&&&&&&&可处理代码动态加载的场景或物体
&&&&缺点:
&&&&&&&&内存有消耗
代码合并是要求最少的,并可以整体移动。而动态合并可以移动旋转,并做Animation动画。故推荐StaticBatchingUtility + 动态合并。
五 场景制作建议
美术人员在制作某场景时,尽量:
静态物体:使用静态合并
&&&1 用Mesh Renderer,也就是不绑定骨骼
&&&2 不是Wrap循环UV的贴图,尽量合并到一张大图集
&&&标注Batching Static即可
动态物体:使用动态合并,动画可以用Unity的动画去做
&&&1 无骨骼
&&&2 不参与场景烘焙
&&&3 相同物体相同缩放
&&&4&模型点数小于300或180
&&&5 模型文件总点数小于900
&&&6 Shader单Pass
&&&满足条件Unity自动优化
(不满足动态合并要求的。场景动画可以用骨骼动画去做。但应尽量避免或者少的使用这种方式。因为没有Drawcall优化效率较低)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:193026次
积分:2765
积分:2765
排名:第9310名
原创:11篇
转载:512篇
(3)(2)(20)(6)(1)(2)(11)(27)(4)(4)(5)(4)(4)(12)(3)(22)(2)(1)(17)(5)(3)(4)(9)(1)(16)(5)(6)(4)(18)(51)(13)(8)(50)(23)(12)(8)(5)(7)(8)(18)(7)(11)(6)(17)(11)(7)(6)(5)(28)(5)

我要回帖

更多关于 unity3d drawcall 的文章

 

随机推荐