Оптимизация ядерной графики

Kernel-side graphics support

POLL Ваше мнение об оптимизации GUI ядра

Total votes: 68
Оставить как было
24%
16
Убрать только CGA и VGA, оставить VESA1.2
7%
5
Оставить только VESA2-режимы (без изменения)
10%
7
Разделить 24 и 32bpp графику в условно-компилируемые блоки
26%
18
Оставить в ядре единственный 32bpp-режим
32%
22

  • art_zh
    Можно паковать в png изображения (без потери качества) или другой подходящий формат. Количество памяти значительно сократится. Однако, можно использовать такую методику:
    1) Активное окно храниться в raw формате, как и последние 5 или 10 открытых окон. Менеджер предсказывает какое из окон может понадобиться пользователю и быстро преобразует png в raw. Конечно, память будет кушать, но все будет зависеть от потребности пользователя.
  • art_zh

    Это на будущее. Сначала надо сделать стабильно работающий блиттер.
  • Цитата: "Но в любом случае имхо назрел вопрос раздельной компиляции ядра для разных платформ. Так можно снять из ядра 30-40 килобайт ненужного кода и дублирующих проверок. И только так можно обеспечить эффективную работу системы на все более непохожих друг на друга платформах.

    Наилучшим вариантом здесь мне видится аналог линуксовского config.h
    "

    Полностью с этим согласен.
  • Похоже, ЭТО всё, что можно выжать из того что есть.

    Для горизонтальной/вертикальной линии из N точек число умножений уменьшено с 2N (3N в случае инверсии цвета) до 2, число проверок границ - с 3N до N+3.

    Дальнейшее ускорение возможно только если опрокинуть всю оконную графику вверх тормашками, построив ее не на базе PUTPIXEL (как сейчас), а с прицелом на буферизацию GUI с последующей максимально быстрой отрисовкой отдельных окон (см. выше).

    Serge
    этот подход можно попробовать и без блиттера, с простым копированием отдельных оконных блоков в общий экранный фреймбуфер. Работы здесь прорва, но делать ее когда-нибудь все равно придется.
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • art_zh
    Неплохо было бы видеть результаты полученные от тестирующей программы MGB, при текущем коде и при новом.
  • art_zh

    Две проверки в основном цикле hline.draw на инверсию цвета и edi=1 не есть true coolhacker assembler style. Такой вариант:

    Code: Select all

    bt ecx, 24
    rcl edi, 1
    jmp [hline.draw_table+edi*4]
    
    .align 4
    hline.draw_table:
    dd .draw
    dd .draw_negative
    dd .draw_forced
    dd .draw_forced_negative
    
    Четыре цикла для разных вариантов отрисовки. Заметный выигрыш будет для развёрнутых циклов при отрисовке в системную память. Адреса циклов надо обязательно выровнять.
  • Serge

    Офигеть! :shock:

    P.S. Вообще-то я электронщик, и под кулхацкера никогда не косил. Хотя с вами тут совсем опрограммёришься...

    Спасибо, учту!
  • Ну, мой личный опыт 8 лет радиокружка, плюс 2,5 года Слесарь КИП и Автоматики - какбэ не в счет. :lol:
  • art_zh

    Я подумал что таким образом легко сделать код для разных режимов и расширений команд. Общий код с проверкой координат и отсечением, а дальше вызов или переход на функцию из таблицы с кодом для ALU, MMX, SSE2

    Code: Select all

    bt ecx, 24
    rcl edi, 1
    shl edi, 2
    add edi, [hline_draw_table]
    jmp [edi]
    или если есть свободный регистр

    Code: Select all

    mov reg, [hline_draw_table]
    bt ecx, 24
    rcl edi, 1
    jmp [reg+edi*4]
    этом случае [hline_draw_table] хранит заранее установленный адрес одной из таблицы с учётом возможностей процессора.
  • Сделал, вроде все по-уму получилось.
    Замерил бенчмарк и еще раз офигел:

    Реально ускорилось (на 20%) только рисование горизонтальных линий. Все остальное - в пределах процента за счет незначительной оптимизации базовой процедуры putpixel.
    Конечно, в сисфункции прирост скорости заметен меньше, чем в ядре, но все равно фифект не стоил выделки.
    Платформа - та же rs780 с 3.4-гигагерцовым атлоном во главе. На таких моторах на одном умножении много не сэкономишь, особенно если память притормаживает...
    Attachments
    слева - оптимизированная VESA #1708, справа - дремучий транк
    MGB.png (8.5 KiB)
    слева - оптимизированная VESA #1708, справа - дремучий транк Viewed 5180 times
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • art_zh
    Как проводил замеры? Обычно, проводят 10-20 замеров, получают среднее значение. Разброс не очень велик и по некоторым тестам находится в пределах погрешности измерений.
  • art_zh
    Не переживай, так достаточно часто бывает - оптимизируешь, а в результате прироста нет.
    Основные тормоза возникают на делении, даже больше чем на умножении.
  • <Lrz>
    На скриншоте конечно - два типичных измерения. Повторные замеры пляшут плюс-минус полкопейки.
    Усреднять и вычислять дисперсию особого резона не было - эффект и в самом деле чуть выше погрешностей.
    На старых CPU разница должна быть более заметна, но у меня сейчас VESA-графика допилена только для ядра-А (Атлон64 и выше), проверить не на чем.

    Mario
    Да я особенно и не переживаю, хуже-то ведь не стало :wink:
    И тот факт, что современные монстры научились разгрызать целочисленное умножение за 2-3 такта, вовсе не означает, что оптимизация стала совсем бесполезной.
    Так или иначе, для сложения требуется переключить несколько десятков вентилей, а для умножения - несколько сотен. Пусть два процесса занимают одно и то же время, но в первом случае будет потребляться значительно меньшая мощность - это реальная и нужная оптимизация.

    Меня совсем другое заинтересовало: почему горизонтальная линия рисуется с такой дикой скоростью (100Мпикс/с) - в 15 раз быстрее, чем аналогичная по алгоритму вертикальная?

    Насколько я помню, фреймбуфер у нас не кэшируется, и ему должно быть фиолетово, как в него пишутся пиксели - по строчкам или по столбцам.
    Так что причина может сидеть только в проверке экранной карты [_WinMapAddress], в которой для каждой точки на экране прописана её оконная принадлежность.

    имхо, кэшировать экранную карту - это клинический идиотизм. Никакого прироста в рисовании это не дает (разве что для длинных горизонтальных линий), зато регулярно ломает стэк ядра и программ. И чем шире экран - тем хуже общая производительность системы.
  • art_zh wrote: Меня совсем другое заинтересовало: почему горизонтальная линия рисуется с такой дикой скоростью (100Мпикс/с) - в 15 раз быстрее, чем аналогичная по алгоритму вертикальная?
    Ну, хотя бы потому что горизонтальная это запись последовательных соседних ячеек, а вертикальная это таки выборка произвольных. Контроллер памяти имхо так работает.
  • Who is online

    Users browsing this forum: No registered users and 9 guests