多网格优化¶
对于需要不断处理(并且需要保留一定数量的控制)的大量实例(以千计), using servers directly 是建议的优化。
当物体数量达到数十万或数百万时,这些方法都不再有效。不过,根据需求,还有一个可能的优化。
MultiMeshes¶
A MultiMesh 是一个单一的绘图原语,可以一次绘制数百万个对象。它非常高效,因为它使用GPU硬件来实现这一点(在OpenGLES2.0中,它的效率较低,因为它没有硬件支持)。
唯一的缺点是没有 屏幕 或 截锥 个别实例可能会被剔除。这意味着,数以百万计的物体 总是 或 从未 绘制,取决于整个多重网格的可见性。可以为它们提供自定义的可见性rect,但它始终是 all-or-none 能见度。
如果对象足够简单(只有几个顶点),这通常不是什么问题,因为大多数现代GPU都针对这个用例进行了优化。解决方法是为世界上不同的区域创建多个网格。
也可以在顶点着色器内执行一些逻辑(使用 INSTANCE_ID
或 INSTANCE_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)))