OutWiker 4.0.0.968 beta 8. Ускорение отрисовки интерфейса
Продолжаю готовить OutWiker к новому релизу и исправлять всякие, в основном не критичные, шероховатости. Сегодня выложил очередную бета-версию под номером 4.0.0.968 beta 5. В этой версии я сосредоточился на оптимизации рисования элементов интерфейса: дерева заметок, облака меток и вкладок.
На исправления в этой версии меня подтолкнул запуск виндовой версии OutWiker под Wine в Linux. Я, конечно, не особо одобряю такой способ запуска, но поскольку мне писали, что таким образом используют OutWiker, чтобы не устанавливать нативный snap- или flatpak-пакет, то я проверяю, что OutWiker из-под Wine хотя бы запускается.
После того, как я в прошлом году переделал дерево заметок и оно стало отрисовываться вручную, оно стало жутко тормозить именно при запуске программы в Wine, но до сих пор все не доходили руки заняться этой проблемой. Пообщавшись с искусственным интеллектом на эту тему, он подсказал, что в Wine действительно очень медленно реализовано рисование через API Windows GDI (Graphics Device Interface), которое используется по умолчанию в библиотеке wxWidgets под Windows. При этом, если в коде для рисования использовать вместо класса wx.DC класс wx.GraphicsContext, то будет использоваться более новый программный интерфейс GDI+, который в Wine лучше реализован.
Начал экспериментировать. К счастью, интерфейсы классов wx.DC и wx.GraphicsContext похожи, хотя и есть небольшие различия. Переход на wx.GraphicsContext оказался достаточно простым. Запустив исправленную версию в Wine, я прям очень сильно удивился приросту скорости рисования, я надеялся, что скорость должна повыситься, но не ожидал, что настолько кардинально. В принципе, на этом уже можно было бы и успокоиться, но я уже морально настроился на более глубокую оптимизацию и вооружился профайлером для объективной оценки времени отрисовки контрола. Отступать от своей задумки я не стал и начал искать другие узкие места в коде и их исправлять. Точные цифры я сейчас не назову, в некоторых местах время работы удалось уменьшить на порядок. Если теперь сравнить скорость прокрутки большого дерева заметок под Windows, то можно заметить разницу между предыдущей и новой версией. Разумеется, формально под Linux тоже стало работать быстрее, но там изначально все рисовалось быстрее, и поэтому результат может быть не так заметен. Заодно сделал более аккуратную двойную буферизацию при рисовании, это нужно для устранения мерцания при перерисовке (хотя я ее не замечал и до этого). На следующей картинке показан скриншот OutWiker, запущенный с помощью Wine.
Потом я заметил, что переход на использование класса wx.GraphicsContext не везде сказался положительно. В версии под Windows текст стал отображаться как-то коряво, особенно при маленьких размерах шрифта. Искусственный интеллект тоже подтвердил эту проблему и предложил несколько решений. Часть из них заведомо не работали — он предложил использовать не существующие методы классов -, другое решение требует перекомпиляции wxWidgets, чтобы для рисования использовался Direct2D, были еще некоторые костыльные способы вроде такого, что сначала рисовать текст в bitmap, а потом его копировать в графический контекст контрола. Это очень муторно и непонятно, почему это должно помочь. Но самый простой способ писать текст более аккуратно состоял в том, чтобы все рисовать через wx.GraphicsContext, который использует GDI+, а текст писать через старый интерфейс wx.DC, который использует GDI. На таком способе я и остановился. Я боялся, что под Wine опять начнутся тормоза, но нет, после всех предварительных оптимизаций и под Wine дерево заметок продолжило работать достаточно быстро.
На этом я решил закончить работу над деревом заметок и провести подобную оптимизацию с другими контролами, которые рисуют сами себя в коде OutWiker. Следующий контрол, оптимизацией которого мне давно хотелось заняться, — это список значков, который всплывает в диалоге свойств страницы и используется в настройках для добавления значков пользователя.
В версии под Windows я давно заметил, что прокрутка большого списка значков происходит с заметными тормозами, не критичными, но все-таки неприятными. Код этого контрола я писал давно, поэтому пришлось вспоминать, как он устроен. Как оказалось, устроен он был несколько странно, я его явно переусложнил. Поэтому сначала провернул небольшой рефакторинг кода, потом перешел от использования класса wx.DC к классу wx.GraphicsContext и снова сделал более аккуратную двойную буферизацию. С помощью профайлера устранил несколько узких мест при рисовании. В результате всех этих действий список значков стал пролистываться заметно быстрее. Интересно, что при запуске OutWiker под Wine список значков и раньше работал не так уж и медленно. Но теперь еще быстрее.
Пока не ушел далеко от значков для заметок, решил их получше упорядочить. В результате появилось несколько новых групп значков (растения, спорт, страницы), и многие значки, которые раньше были без групп, переместил в какую-то группу. А заодно добавил несколько новых значков со страницами разных цветов:
Оставалось еще два самописных контрола, к которым у меня не было претензий в плане скорости, но к которым можно было применить те же изменения для ускорения — это вкладки и облако меток. Теперь они тоже рисуются через wx.GraphicsContext и GDI+ под Windows, но это позволило получить улучшения не в скорости, а в качестве отрисовки. Появилась возможность при рисовании закругленных элементов использовать сглаживание, что не позволяло делать GDI под Windows, поэтому закругления раньше выглядели ступеньками. На картинках ниже видно, как выглядели вкладки и метки в предыдущих версиях и в новой.
Здесь опять я должен похвалить операционку на основе Linux (даже не знаю, какую именно ее подсистему), но там все линии изначально рисовались сглаженными. Из технических моментов скажу, что, как и в дереве заметок, текст в этих контролах по-прежнему отображается через старый интерфейс wx.DC и GDI, так он выглядит более аккуратно.
Еще поправил баг в плагине TeXEquation, предназначенный для вставки формул. Баг проявлялся в том, что после открытия и закрытия окна с предпросмотром формулы начинал сильно тормозить основной редактор для ввода текста заметок. Эта проблема решилась легко, буквально добавлением одной проверки в одной строке.
Пожалуй, это все изменения, которые попали в эту версию. По моим оптимистичным прикидкам я планирую, чтобы следующая бета-версия стала последней перед релизом, поэтому пока никаких новых возможностей я не добавляю, а только исправляю найденные проблемы.
Последнюю бета-версию OutWiker, как обычно, можно скачать на этой странице.
Подписывайтесь на OutWiker в социальных сетях:
PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.








teap0t:
В документации не нашёл, куда обращаться с вопросами тоже не понял. Хочу уточнить вопрос с кодировкой вики-файлов. В шаблоне стоит стандартная utf-8. А можно ли её изменить ? Мне, скажем, гораздо удобнее работать с cp-1251.
Jenyay:
Нет, в программе везде предполагается, что используется кодировка utf-8.
teap0t:
Так и думал. Умом одобряю, но возмущён, конечно.