Переход с полигона, задававшего линию снега на 2D массив "осевшего снега". Стало работать значительно быстрее(Спасибо, Алексею Извалову за идею), но простор для оптимизаций по-прежнему широчайший. Даже без перевода циклов расчета ветра и поиска коллизий на с++.
Каждый раз после нахождения коллизии, точки столкновения снежинки с деревом, спрайт снежинки отпечатывается в полноэкранную ImgeTexture с координатами, где была коллизия:
func add_snf(pt):
image.blend_rect(img, Rect2(0,0,16,16),pt)
wasUpdate = true
После чего происходит тяжелая операция перезагрузки ImageTexture в видеокарту:
var wasUpdate = false
var dt = 0
func _process(delta):
dt += delta
if dt > 0.1 and wasUpdate:
imageTexture.set_data(image)
wasUpdate = false
dt = 0
Конечно, это не делается на добавление каждой снежинки, иначе тормозит ужасно, но все-таки делается довольно часто - если надо, то до 10 раз в сек. Без этого изменений будет не видать - снежинка не отобразится.
Думаю, как можно сделать по-другому, чтобы отпечатывать спрайты в видеопамять без перезагрузок большой текстуры.
Версия для тестирования здесь:
https://electronikas.ru/st/ Можно поиграть через браузер