Приветствую.
За эту неделю я довольно много чего переписал в Штурмане. Просьба потестировать, у кого есть возможность и желание.
Значительно ускорены открытие каталогов и рендеринг содержимого. (Кроме режима таблицы, она рисуется отдельным компонентом, за который я пока не брался.)
Теперь всё, что можно грузить в фоне, грузится в фоне (в отдельном потоке). А именно: mime-типы файлов и иконки. (Исключение: если включена сортировка файлов по типу. Чтобы показать файлы с сортировкой по типу, программа вынуждена сначала дождаться, пока все типы файлов прогрузятся.)
Вы можете заметить, что иконки, которые не успели прогрузиться, сначала рисуются в виде стандартной иконки "неизвестный тип файла", а позже заменяются на настоящие иконки. Таким образом, обычные иконки теперь загружаются в фоне точно так же, как уже реализована загрузка мининиатюр.
На моей машине (со слабым процессором Celeron B800 и медленным ноутбучным жестким диском) открытие каталога /usr/bin, содержащего почти 5000 файлов, занимает не более двух секунд. Это примерно столько же, за сколько этот каталог открывается в миднайт коммандере. Все остальные известные мне файловые менеджеры работают медленнее, при чем, в разы медленнее.
"Сборка" выводимого на экран контента теперь выполняется пошагово.
Например, если у нас есть 5000 файлов в каталоге, прежде чем мы сможем их показать пользователю нужно для каждого файла рассчитать размеры и координаты текста и иконок, т.е. выполнить 5000 довольно тяжеловесных операций. Даже на современном железе такие вычисления могут приводить к подтормаживаниям. Чтобы UI не тормозило, я переписал этот код так, чтобы он работал по проходам. Один проход занимает 0.2 секунды. Если за это время программа не успела обработать все файлы, она завершает проход, выполняет все другие неотложные дела и начинает следующий проход. Это позволяет интерфейсу не тормозить на слабом железе.
Также добавлено кэширование объектов PangoLayout, которые используются для рендеринга текста. Раньше они создавались заново каждый раз, когда программе нужно вывести имя файла на экран или рассчитать его размеры на экране. Это довольно "дорогая" операция, включающая в себя парсинг utf8, работу со шрифтами и т.п. Теперь несколько тысяч элементов может храниться в кэше.
Однако при этом существенно возросло потребление памяти. Если это для кого-то покажется существенным, позже добавлю опцию для отключения этой фичи.
Это еще не предел оптимизации. Есть как минимум еще два места в программе, где можно поднять производительность в разы. Позже доберусь и до них.
У меня с завтрашнего дня полный завал дел по работе, не знаю, когда я смогу снова уделить внимание проекту.
Насчёт waterline - займусь... эээ... когда-нибудь) Точно не в ближайшие дней 10.