如何在Unity场景中批量绘制网格?

时间:2018-09-30 06:19:12

标签: unity3d batch-drawing

我正在使用Unity3d显示停靠场景there are thousands of container in my scene

根据实时消息更新容器。我正在优化此场景的绘图调用。我发现容器正在使用draw mesh方法一一绘制。我在代码中所做的是从预制中加载容器并设置颜色

instance = (GameObject)Instantiate(Resources.Load("Prefabs/box1"));
Material material = instance.GetComponent<MeshRenderer>().material;
material.color = new Color(r / 255f, g / 255f, b / 255f, 1f);

然后将gameObject一一添加到场景中。有什么方法可以批量处理gameObject并将它们绘制一次?

更新: 我对容器预制件进行了一些更改以启用GPU实例化。是的,通过动态批处理,绘图调用从6k降至2k。但这会引起另一个问题。自从我使用

以来,所有容器的颜色都相同

gameObject.GetComponent<MeshRenderer>().sharedMaterial.color = ContainerColor

设置容器颜色。有什么办法可以解决吗? enter image description here

3 个答案:

答案 0 :(得分:0)

取决于您需要对容器执行的操作,如果它们是静态的,则应查看 $style .='.'.$element_class.' .team-intro h5{color: '.$membar_info_color.';}'; $style .='.'.$element_class.' .team-intro span{color: '.$membar_info_color.';}'; $style .='.'.$element_class.' .team-intro {background: '.$membar_info_bg.';}'; $style .='.'.$element_class.' .team-hover {background: '.$overlay_bg.';}'; $style .='.'.$element_class.' .desk, .desk h4, p, .team-hover .s-link a {color: '.$desc_color.'; box-shadow:none;}'; $style .='.'.$element_class.' .desk, .desk h4, p, .team-hover .s-link a:hover {color: '.$hover_color.';}'; echo $border; if (empty($border)) { $style .= '.'.$element_class.' .team-hover {border: 20px solid '.$border_color.';}'; }else{ $style .= '.'.$element_class.' .team-hover {}'; } $style .= '</style>'; $output = ''; $output .= $style; $output .= '<div class="team-member '.$element_class.' '.$element_id.'"> HTML Code..... </div>'; return $output; https://docs.unity3d.com/ScriptReference/StaticBatchingUtility.Combine.html

但是,如果需要它们是动态的,则应对所有网格使用1种材质,只需在着色器中更改颜色即可减少setPass调用的次数。

答案 1 :(得分:0)

您还可以使用Graphics.DrawMeshInstanced。它使用GPU实例化绘制网格。但是,一次最多只能绘制1023个实例。因此,您需要添加自定义批次。

https://docs.unity3d.com/2018.1/Documentation/ScriptReference/Graphics.DrawMeshInstanced.html

答案 2 :(得分:0)

您使用了 .material。这会创建一个新的材质实例,所以不要这样做。

使用.sharedMaterial。要使用不同的颜色,请为每种颜色创建一种材质并缓存它。