多网格优化

对于需要不断处理(并且需要保留一定数量的控制)的大量实例(以千计), using servers directly 是建议的优化。

当物体数量达到数十万或数百万时,这些方法都不再有效。不过,根据需求,还有一个可能的优化。

MultiMeshes

A MultiMesh 是一个单一的绘图原语,可以一次绘制数百万个对象。它非常高效,因为它使用GPU硬件来实现这一点(在OpenGLES2.0中,它的效率较低,因为它没有硬件支持)。

唯一的缺点是没有 屏幕截锥 个别实例可能会被剔除。这意味着,数以百万计的物体 总是从未 绘制,取决于整个多重网格的可见性。可以为它们提供自定义的可见性rect,但它始终是 all-or-none 能见度。

如果对象足够简单(只有几个顶点),这通常不是什么问题,因为大多数现代GPU都针对这个用例进行了优化。解决方法是为世界上不同的区域创建多个网格。

也可以在顶点着色器内执行一些逻辑(使用 INSTANCE_IDINSTANCE_CUSTOM 内置常量)。有关在多网格中设置数千个对象的动画的示例,请参见 Animating thousands of fish 辅导的。可以通过纹理(有浮点)向明暗器提供信息 Image 最适合这种情况的格式)。

另一种选择是使用GDATEATE和C++,这应该是非常有效的(可以通过线性存储器设置所有对象的整个状态)。 VisualServer.multimesh_set_as_bulk_array() 功能)。这样,可以使用多个线程创建数组,然后在一次调用中设置,从而提供高缓存效率。

最后,不需要所有多网格实例都可见。可见光的数量可以用 MultiMesh.visible_instance_count 属性。典型的工作流程是分配将要使用的实例的最大数量,然后根据当前需要的数量更改可见的数量。

多网格示例

下面是一个使用代码中的多网格的示例(使用gdscript)。对于数百万个对象来说,其他语言可能更高效,但是对于几千个对象来说,gdscript应该可以。

extends MultiMeshInstance

func _ready():
    # Create the multimesh.
    multimesh = MultiMesh.new()
    # Set the format first.
    multimesh.transform_format = MultiMesh.TRANSFORM_3D
    multimesh.color_format = MultiMesh.COLOR_NONE
    multimesh.custom_data_format = MultiMesh.CUSTOM_DATA_NONE
    # Then resize (otherwise, changing the format is not allowed).
    multimesh.instance_count = 10000
    # Maybe not all of them should be visible at first.
    multimesh.visible_instance_count = 1000
    # Set the transform of the instances.
    for i in multimesh.visible_instance_count:
        multimesh.set_instance_transform(i, Transform(Basis(), Vector3(i * 20, 0, 0)))