Я ищу реализовать модуль, который управляет блиц-очередью. Существует единственная поверхность, и части этой поверхности (ограниченные прямоугольниками) копируются в другое место на поверхности:
add_blt(rect src, point dst);
В очередь может быть помещено любое количество операций по порядку. В конце концов пользователь очереди перестанет отправлять сообщения и запросит оптимальный набор операций, которые он фактически должен выполнять на поверхности. Задача модуля - убедиться, что ни один пиксель не скопирован без необходимости.
Это становится сложно из-за частичного совпадения. Блит может повторно копировать ранее скопированный пиксель. В идеале операции блита должны быть разделены на этапе оптимизации таким образом, чтобы каждый блок шел к своему конечному месту с помощью одной операции.
Это сложно, но не невозможно собрать это вместе. Я просто пытаюсь не изобретать велосипед.
Я огляделся в сети, и единственное, что я нашел, была SDL_BlitPool Library , которая предполагает, что исходная поверхность отличается от места назначения. Он также выполняет большую работу, казалось бы, излишне: регионы и подобные строительные блоки - это данность. Я ищу что-то более высокого уровня. Конечно, я не собираюсь смотреть лошадям в подарок, и я также не возражаю против выполнения реальной работы ... Если кто-то может выдвинуть основную идею, которая делает эту проблему менее сложной, чем правильно теперь это тоже было бы здорово.
РЕДАКТИРОВАТЬ:
Думая об ответе Ааронастерлинга ... может ли это сработать?
Реализация настроенного кода обработчика области, который может поддерживать метаданные для каждого прямоугольника, который он содержит. Когда обработчик области разделяет прямоугольник, он автоматически связывает метаданные этого прямоугольника с результирующими под прямоугольниками.
Когда запускается оптимизация, создайте пустую область, обработанную указанным выше настраиваемым кодом, назовите это master region
Итерация по очереди blt
и для каждой записи:
Пусть srcrect
будет исходным прямоугольником для blt
изученного бенга
Получите пересечение srcrect
и master region
в temp region
Удалить temp region
из master region
, поэтому master region
больше не покрывает temp region
Повысить srcrect
до региона (srcrgn
) и вычесть temp region
из него
Смещение temp region
и srcrgn
с вектором текущего blt
: их объединение будет охватывать область назначения текущего blt
Добавьте к master region
все ректы в temp region
, сохранив исходные метаданные источника (первый шаг добавления текущего blt
к master region
)
Добавьте к master region
все повторы в srcrgn
, добавив информацию об источнике для текущего blt
(второй шаг добавления текущего blt
к master region
)
Оптимизируйте master region
, проверяя, имеют ли смежные под прямоугольники, которые являются кандидатами на слияние, одинаковые метаданные. Два под прямоугольника являются кандидатами на слияние, если (r1.x1 == r2.x1 && r1.x2 == r2.x2) | (r1.y1 == r2.y1 && r1.y2 == r2.y2)
. Если да, объедините их.
Перечислять под прямоугольники master region
. Каждый возвращаемый прямоугольник является оптимизированным местом назначения blt-операции. Соответствующие метаданные являются источником операции blt.