Как создать экземпляр объекта в Godot? - PullRequest
0 голосов
/ 26 мая 2020

Итак, я в основном неплохо разбираюсь в Opengl 4.0. В OpenGL вы можете визуализировать один и тот же объект во многих местах. Это техника под названием Instancing. Это экономит некоторые вызовы процессора или что-то в этом роде.

Я хотел сделать это в Godot. Итак, я поискал в документации, и в основном мне предлагалось продублировать объект. Но я думаю, что это не сохраняет вызовы CPU в GPU, как это делает Instancing (пожалуйста, дайте мне знать, если я ошибаюсь).

Плюс я не могу заранее получить все узлы. Поскольку количество раз, которое мне нужно визуализировать объект (в разных местах), определяется во время выполнения и может измениться.

Есть ли решение? Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Создание экземпляра можно рассматривать как создание копий объекта из чертежа. Причина, по которой он экономит память и вызовы отрисовки, заключается в том, что, по сути, в памяти должен храниться только «план». Рекомендуемый способ решения этой проблемы (согласно документации) - использование (упакованных) сцен.

Для этого создайте объект как его собственную сцену - помните, что вы можете щелкнуть правой кнопкой мыши узел root сцены (даже пустой) и измените тип на какой хотите. Как только вы настроите объект так, как вам нравится, сохраните его как свою собственную сцену (например: myInstance.tscn).

Оттуда вы можете вызвать экземпляр из вашей основной сцены (или любой другой сцены, которую вы нужно в). Для этого вам нужно сделать несколько вещей:

Сначала создайте переменную для вашего экземпляра в скрипте, из которого вы хотите его вызвать, объявив что-то вроде onready var instancedObject = preload("res://myInstance.tscn"). (Используя любой путь, который вы использовали для сцены).

Оттуда вы вызываете переменную из любой нужной вам функции, записывая что-то вроде: var myObject = instancedObject.instance()

Затем вы должны добавить экземпляр в текущая сцена с add_child(myObject)

После этого вы можете (необязательно) указать такие вещи, как преобразования и вращения, чтобы определить, где будет помещен экземпляр (Пример: myObject.transform.origin = Vector3(0,10,0) - для 3D или myObject.position = Vector2(10,0) для 2D )

В качестве альтернативы вы можете инициализировать и создать экземпляр объекта одновременно, написав onready var instancedObject = preload(res://myInstance.tscn).instance(), а затем добавив его в функции, используя add_child(instancedObject), однако, хотя для этого требуется меньше шагов, есть ограничения на выполнение это так, и я лично добился гораздо большего успеха, используя первый подход.

Если, однако, вы хотите создать несколько тысяч объектов (или более) в одной сцене, я рекомендую использовать ответ Калину и используя MultiMeshInstance. Тем не менее, одним из ограничений MultiMeshInstance является то, что он использует подход к рисованию «все или ничего», то есть все экземпляры будут либо рисоваться сразу, либо не рисоваться совсем. Промежуточного нет. Это может быть хорошо или плохо, в зависимости от того, для чего вам это нужно.

Надеюсь, это поможет.

0 голосов
/ 27 мая 2020

Создание экземпляров в Godot обрабатывается с помощью узла MultiMeshInstance. Это экземплярный аналог MeshInstance. См. Оптимизация с использованием MultiMeshes в документации для получения дополнительной информации.

Имейте в виду, что MultiMeshes не подходят, если вам нужно перемещать объекты в разных направлениях в каждом кадре (хотя вы можете добиться этого с помощью INSTANCE_ID в шейдере, общем для всех экземпляров). MultiMeshInstance позволяет вам изменить количество видимых экземпляров, установив его свойство visible_instance_count.

...