Мне нужно эмулировать стратегию размещения окон в диспетчере окон Fluxbox .
В качестве приблизительного ориентира визуализируйте окна произвольного размера, заполняющие экран по одному за раз, когда приблизительный размер каждого окна в среднем составляет 80 окон на экране без какого-либо окна, перекрывающего другое.
Если в вашей системе установлены Fluxbox и Xterm, вы можете попробовать сценарий xwinmidiarptoy BASH, чтобы увидеть грубый прототип того, что я хочу, чтобы происходило. См. xwinmidiarptoy.txt заметки, которые я написал об этом, объясняющие, что он делает и как его следует использовать.
Важно отметить, что окна закроются, и пространство, которое закрыло ранее занятые окна, снова станет доступным для размещения новых окон.
Алгоритм должен быть Онлайн-алгоритм обработка данных "по частям последовательно, т. Е. В том порядке, в котором входные данные подаются в алгоритм, без полного доступа к входным данным. с самого начала. "
Стратегия размещения окна Fluxbox имеет три двоичных параметра, которые я хочу эмулировать:
Windows строит горизонтальные ряды или вертикальные столбцы (потенциально)
Окна располагаются слева направо или справа налево
Окна располагаются сверху вниз или снизу вверх
Различия между целевым алгоритмом и алгоритмом размещения окна
Единицы координат не являются пикселями. Сетка, в которой будут размещаться блоки, будет 128 х 128 единиц. Кроме того, область размещения может быть дополнительно уменьшена границей, размещенной в сетке.
Почему алгоритм является проблемой?
Он должен работать до крайних сроков потока в реальном времени в аудиоприложении.
На данный момент Меня интересует только быстрый алгоритм , не беспокойтесь о последствиях потоков реального времени и всех препятствиях в программировании, которые это приносит.
И хотя алгоритм никогда не будет размещать окно, которое перекрывает другое, пользователь сможет размещать и перемещать блоки определенных типов, перекрывающиеся окна будут существовать. Структура данных, используемая для хранения окон и / или свободного места, должна быть в состоянии справиться с этим перекрытием.
Пока у меня есть два варианта, для которых я построил свободные прототипы:
1) Порт алгоритма размещения Fluxbox в мой код.
Проблема в том, что клиент (моя программа) выгружается с аудиосервера ( JACK ), когда я пытаюсь разместить наихудший сценарий из 256 блоков с использованием алгоритма. Этот алгоритм выполняет более 14000 полных (линейных) проверок списка блоков, уже размещенных при размещении 256-го окна.
Для демонстрации этого я создал программу под названием text_boxer-0.0.2.tar.bz2 , которая принимает текстовый файл в качестве входных данных и размещает его в полях ASCII. Выполните команду make
, чтобы собрать ее. Немного недружелюбно, используйте --help
(или любой другой недопустимый параметр) для списка параметров командной строки. Вы должны указать текстовый файл, используя опцию.
2) Мой альтернативный подход.
Только частично реализованный, этот подход использует структуру данных для каждой области прямоугольного свободного неиспользуемого пространства (список окон может быть полностью отдельным, и не требуется для тестирования этого алгоритма). Структура данных действует как узел в двусвязном списке (с сортированной вставкой), а также содержит координаты верхнего левого угла, ширину и высоту.
Кроме того, каждая структура данных блока также содержит четыре ссылки, которые соединяются с каждым непосредственно смежным (касающимся) блоком на каждой из четырех сторон.
ВАЖНОЕ ПРАВИЛО: Каждый блок может касаться только одним блоком с каждой стороны. Это правило относится к алгоритму хранения свободного неиспользуемого пространства и не учитывает, сколько реальных окон могут касаться друг друга.
Проблема с этим подходом в том, что очень сложный . Я реализовал простые случаи, когда 1) пространство удаляется из одного угла блока, 2) разбивает соседние блоки так, чтобы соблюдалось ВАЖНОЕ ПРАВИЛО .
Менее простой случай, когда удаляемое пространство можно найти только в столбце или ряду блоков, реализуется только частично - если один из удаляемых блоков точно соответствует ширине (то есть столбцу) или высота (то есть ряд), то возникают проблемы. И даже не упомяните тот факт, что проверяются только столбцы шириной в один ящик и строки в один ящик высотой.
Я реализовал этот алгоритм на C - языке, который я использую для этого проекта (я не использовал C ++ в течение нескольких лет, и мне неудобно его использовать после того, как я сосредоточил все свое внимание на разработке на C, это хобби) , Реализация состоит из 700+ строк кода (включая множество пустых строк, фигурных скобок, комментариев и т. Д.). Реализация работает только для стратегии размещения горизонтальных рядов + левый-правый + верхний-нижний.
Таким образом, я должен добавить какой-либо способ заставить работать эти 700 строк кода для других 7 вариантов стратегии размещения, или мне придется дублировать эти 7 800 строк кода для остальных семи вариантов. , Ни один из них не является привлекательным, во-первых, потому что существующий код достаточно сложен, во-вторых, из-за раздувания.
Алгоритм находится даже не на той стадии, когда я могу использовать его в наихудшем сценарии реального времени из-за отсутствия функциональности, поэтому я до сих пор не знаю, действительно ли он работает лучше или хуже первого подхода.
Текущее состояние реализации этого алгоритма на C: freespace.c . Я использую gcc -O0 -ggdb freespace.c
для сборки и запускаю его в xterm размером не менее 124 x 60 символов.
Что еще там?
Я проскользнул и со скидкой:
Bin Packing алгоритмы: их
акцент на оптимальной посадке не
соответствовать требованиям этого
алгоритм.
Рекурсивное размещение пополам алгоритмы: звучит многообещающе, но
это для схемотехники. Их
выделение оптимальной длины провода.
Оба из них, особенно последние, все элементы, которые должны быть размещены / упакованы, известны до начала алгоритма.
Что вы думаете об этом? Как бы вы подошли к этому? Какие еще алгоритмы мне следует посмотреть? Или даже какие концепции мне следует изучить, поскольку я не изучал компьютерные науки / разработку программного обеспечения?
Пожалуйста, задавайте вопросы в комментариях, если необходима дополнительная информация.
Дальнейшие идеи возникли после того, как я задал этот вопрос
Некоторая комбинация моего «альтернативного алгоритма» с пространственной хэш-картой для определения того, будет ли большое окно, которое нужно разместить, охватить несколько блоков свободного пространства.