Система сигналов

24.11.2007 Антон Волков

Практически во всех известных мне 3D-движках на Flash пересчёт графики происходит постоянно, даже когда ничего не меняется. Учитывая один из принципов оптимизации “не считай того, что уже посчитано” мы ещё в первых версиях движка задумались над расчётом лишь изменённых элементов.

Самым простым и логичным способом мы посчитали систему флагов. Например, при установке новых координат объекту, устанавливаем его флаг coordsChanged = true. Далее, через систему разнообразных проверок визуализатор решал, что нужно всего лишь подвинуть графику объекта не перерисовывая его графику. Так эта система дожила до 4-й версии и, во многом благодаря ей, мы имеем хорошую производительность в демке.

По мере развития движка, зависимости между флагами становились сложнее и запутаннее. Где-то происходила избыточная проверка, где-то наоборот. Да и очистка флагов после каждого пересчёта тоже оказалась затратной задачей, т.к. объектов, точек, граней, материалов много, флаги разнообразные, да ещё и составные (в виде списков) встречаются. В итоге мы получили непрозрачную систему, которая ещё и давала паразитную нагрузку на процессор (30-40% при отсутствии изменений на среднесложной сцене с тенями) из-за постоянных проверок и очистки флагов.

Это стало одной из главных причин пересмотра архитектуры движка. На данный момент разработана и проходит обкатку новая система отслеживания изменений — система сигналов.

signals.gif

Вводим понятие сигнал и операция. Сигнал — аналог события (Event). Каждый сигнал уникален и принадлежит определённому объекту. Операция — это ссылка на определённый метод у конкретного объекта.

Сигналы могут порождать и отменять другие сигналы, запускать операции. Таким образом, при создании сцены формируются взаимосвязи между объектами, их сигналами и операциями. На схеме последствия сигнала названы “Sequels”, а отменяемые сигналы — “Cancels”.

Каждое изменение объектов сцены порождает соответствующий сигнал. На схеме перемещение Object2 и поворот его дочернего объекта Subobject2 генерирует два сигнала — move и transform.

При очередном расчёте сцены система анализирует накопившийся список и добавляет в этот список порождённые сигналы. На схеме перемещение Object2 порождает перемещение дочерних объектов Subobject1 и Subobject2.

После чего из списка вычёркиваются отменённые сигналы. В нашем примере сигнал transform у Subobject2 отменяет свой сигнал move, т.к. трансформация объекта включает в себя и поворот, и масштабирование, и перемещение, поэтому срабатывание move не имеет смысла и его можно проигнорировать.

В конце из списка сигналов формируется список операций, которые необходимо выполнить, чтобы сцена корректно изменилась. Однако, тут ещё загвоздка — операции должны выполняться в определённом порядке. Например, нет смысла расчитать освещение объекта, а потом его куда-нибудь переместить. Поэтому операциям добавлен приоритет исполнения.

Тут возникла ещё одна проблема — для одинаковых по приоритету операций иногда также важен порядок. В нашем примере не корректно сначала расчитывать трансформацию Subobject2, т.к. ещё не пересчитаны координаты родителя Object2. Поэтому для некоторых операций может быть указан уровень (в нашем случае уровень вложенности объекта).

Теперь сортируем список операций по этим двум полям и последовательно их выполняем.

Первые тесты показали, что паразитная нагрузка исчезла вообще, а сама система сигналов работает быстрее флагов на 15-20%. В плане прозрачности система стала лучше благодаря концентрации зависимостей сигналов в одном месте и возможности легко протрассировать какие сигналы сработали, какие были порождены и отменены, какие и в какой последовательности выполнились операции.

Комментарии (7) на “Система сигналов”

  1. Super Man Says:

    Да интересная система событий! Я тож думал над чем то подобным! Не думал что флаги могут так влиять, наверно их было слишком много!
    Интересно вы используете кватернионы? Поворот с их помощью очень шустрый!
    И как там дела обстоят с БСП?

  2. Антон Волков Says:

    Насчёт кватернионов думали, но не уверен, что будем ли внедрять. По оптимизации ничего там такого не углядел, т.к. матрица трансформации создаётся на базе всех параметров поворота, масштаба, позиции. И там не важно как - всё в куче. Единственный плюс, который я увидел, это мягкая и корректная интерполяция поворота.

    С BSP более менее всё понятно, но пока заняты перетряхиванием архитектуры. Скоро дойдём и до этого.

  3. Say Says:

    Читая блог, мне стало очень интересно посмотреть на реализацию клиент-сервер, а в частности скорости передачи данных.
    В связи с идеей для одного интересного проекта я и сам задумываюсь над скоростной передачей и обработкой данных как со стороны клиента так и сервера. Прочитав про вашу реализацию, мне стало любопытно взглянуть на результат.

    Будет ли в скором времени дамка на тестирование клиент-серверной части?

  4. Антон Волков Says:

    Видимо речь об этом http://blog.alternativaplatform.com/ru/2007/07/19/obmen-dannymi-mezhdu-serverom-i-klientom/

    На данный момент сетевая библиотека сильно модернизирована, введены составные типы (структуры) данных, что также уменьшило трафик и ускорило кодирование/декодирование данных.

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

  5. Квиринг Алексей Says:

    2Say - на данный момент мы действительно не будем открывать сетевую библиотеку в открытый доступ, но всегда готовы к обмену идеями. Если есть вопросы или готовы поделится идеями - пишите, будем рады помочь.

  6. Flop Says:

    вотжет в этой системе будет полезен такой параметр как _время жизни_ (на аналогии с сетевым TTL)
    если он в течении этого времени не обработался то его уже и ненадо обрабатывать…

    может это полезно?… особенно для управления

    в некоторых случаях например долго рендерит а я в это время еще кнопки нажимаю…
    потом отпускаю а движок только начинает обрабатывать те команды которые я ему послал…

  7. nayk’s web » Alternativa3D 5.0 (сборка 1) Says:

    […] Система сигналов — расчет производится только по потребностям; […]

Оставить комментарий

(Регистрация)