ПрограммированиеФорумГрафика

Попиксельный упаковщик лайтмапы: оптимизация

#0
14:13, 13 фев 2024

Вот с какой проблемой столкнулся. Попиксельный упаковщик лайтмапы на большом кол-ве кусочков и страниц работает адски долго.
Любые попытки оптимизации приводят к двум негативным результатам. Либо увеличивается скорость, но теряется плотность упаковки, ради которой, собственно, попиксельный упаковщик и используется, либо просто скорость работы падает ещё сильнее.
Попытки нагородить поверх некие ускоряющие структуры проблему не решают: в большом куске вполне могут оказаться дыры, в которые поместится ещё несколько маленьких кусочков, т.е. fast-reject тут просто не сработает. Я так и не придумал что с этим делать.
Может есть какие-то общеизвестные способы оптимизации, просто я не в курсе?
У меня сам алгоритм - просто два вложенных цикла, первый цикл идёт по линиям, второй пытается найти свободное пространство, начиная с незанятого пикселя текущей линии. Ну и конечно же эта проверка предполагает бесконечное сканирование одной и той же страницы атласа для каждого нового кусочка лайтмапы. Какие-то попытки считать число уже использованных пикселей только замедляют алгоритм.

#1
14:43, 13 фев 2024

Дерево разбиений + очередь с приоритетом?

#2
15:05, 13 фев 2024

CatsCanFly
> Дерево разбиений
внутри любого куска может оказаться дырка произвольной формы. Как её описать деревом, чтобы это не замедлило работу ещё больше\не привело к ухудшению плотности упаковки я не представляю.

#3
22:40, 13 фев 2024

g-cont
> внутри любого куска может оказаться дырка произвольной формы
Для дырок строй описанную геометрию, для текущего куска — вписанную, рекурсивно уменьшай разрешение и более детальный уровень проверяй только если прошла проверка более грубого.

В порядке бреда: поиск дырки произвольной формы можно ускорить с помощью FFT. В идеале FFT должно быть не обычное, а на каком-нибудь дискретном поле, чтобы все было в целых числах и не было потерь точности на плавучке.

#4
9:11, 14 фев 2024

Это пробовал: Packing Lightmaps

#5
10:50, 14 фев 2024

}:+()___ [Smile]
проблема в том, что эффект от применения дерева (грубо говоря) предполагается при условии что размер структуры узла дерева заведомо меньше тех данных, на которые он ссылается. Здесь же строго обратная ситуация, минимальная единица данных = 1 байт (один маркер использованного пикселя).
И очень часто бывают ситуации когда атлас наполовину забит лайтмапами размером 1х1 люксель - например для травы, кустов.
Либо это дерево вырастет до чудовищных размеров и начнёт тормозить. Либо его после каждого добавления кусочка надо будет как-то перестраивать - и снова получим тормоза.

}:+()___ [Smile]
> можно ускорить с помощью FFT
я подозреваю тогда ухудшится плотность упаковки.

RyKrys
> Это пробовал
Это один из вариантов быстрых методов, аппроксимация до бокса. Но ничто не сравнится по плотности упаковки с попиксельным.

#6
11:27, 14 фев 2024

Шел 2024 год ... Рейтрейсинг был в каждом тостере и вот такая проблема

#7
12:14, 14 фев 2024

g-cont

Для разработки используй быстрые упаковщики. Для продакшена - более агрессивные.

#8
15:02, 14 фев 2024

0xc0de
ну я собственно так и делаю сейчас.

#9
0:44, 15 фев 2024

g-cont
> проблема в том, что эффект от применения дерева
Это не дерево, это, скорее, набор mip-map-ов, т. е. полный размер всего в 4/3 раза больше.

> я подозреваю тогда ухудшится плотность упаковки.
FFT — это точное решение (при условии бесконечно точной плавучки): ищет дырки в которые гарантированно поместится текущий спрайт за время, не зависящее от размера этого спрайта.

#10
10:22, 15 фев 2024

}:+()___ [Smile]
А причем тут плааучка ?
Dft?

ПрограммированиеФорумГрафика

Тема в архиве.