Система сигналов
24.11.2007 Антон ВолковПрактически во всех известных мне 3D-движках на Flash пересчёт графики происходит постоянно, даже когда ничего не меняется. Учитывая один из принципов оптимизации “не считай того, что уже посчитано” мы ещё в первых версиях движка задумались над расчётом лишь изменённых элементов.
Самым простым и логичным способом мы посчитали систему флагов. Например, при установке новых координат объекту, устанавливаем его флаг coordsChanged = true. Далее, через систему разнообразных проверок визуализатор решал, что нужно всего лишь подвинуть графику объекта не перерисовывая его графику. Так эта система дожила до 4-й версии и, во многом благодаря ей, мы имеем хорошую производительность в демке.
По мере развития движка, зависимости между флагами становились сложнее и запутаннее. Где-то происходила избыточная проверка, где-то наоборот. Да и очистка флагов после каждого пересчёта тоже оказалась затратной задачей, т.к. объектов, точек, граней, материалов много, флаги разнообразные, да ещё и составные (в виде списков) встречаются. В итоге мы получили непрозрачную систему, которая ещё и давала паразитную нагрузку на процессор (30-40% при отсутствии изменений на среднесложной сцене с тенями) из-за постоянных проверок и очистки флагов.
Это стало одной из главных причин пересмотра архитектуры движка. На данный момент разработана и проходит обкатку новая система отслеживания изменений — система сигналов.

