根据实时消息更新容器。我正在优化此场景的绘图调用。我发现容器正在使用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
答案 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
。要使用不同的颜色,请为每种颜色创建一种材质并缓存它。