OSDev http://osdev.su/ |
|
Вывод пикселя в VESA http://osdev.su/viewtopic.php?f=6&t=1880 |
Страница 2 из 3 |
Автор: | Himik [ 19 мар 2018, 19:00 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
Здесь это периодически обсуждается. Надо задать тип кэширования видеопамяти - "Write Combine". Есть разные способы, в зависимости от того, включена страничная адресация или нет. viewtopic.php?f=5&t=1014&hilit=MTRR+PAT&start=10 viewtopic.php?f=7&t=834&hilit=MTRR+PAT&start=10 viewtopic.php?f=6&t=1134&hilit=MTRR+PAT&start=10 |
Автор: | pavia [ 19 мар 2018, 19:54 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
grenders22 писал(а): С выводом картинок и примитовов я разобрался. Но больно уже медленно весь экран обновлять. Прочитал про двойную буферизацию, но опять таки надо обновлять весь экран. Проблемы возникают когда я ввожу текст. Очень медленно каждый символ добавляется. Особенно заметно на реальном железе. Предположим у меня есть окно и как мне обновлять буфер лишь в пределах этого окна? Для примера приведу цифры: -весь экран 1024х768 -координаты окна 200х200 -ширина и длинна окна 500х350 соответственно На реальном железе надо включить WC(Write Combine) ускоряет в десятки раз! Графика вещь такая. Она требует оптимизации и ещё раз оптимизации. Лучше взять готовую библиотеку такую как agg. Символы вы храните в упакованном виде поэтому много тратите на распаковку. Распакуйте под ваш видео режим. При выводе не используйте PuPixel, а обрабатывайте пролётами span(). Копируйте не по байту, а по 8 или 16 байт. А вывод картинки вы должны сами уметь сделать - тыж программист как никак. |
Автор: | grenders22 [ 20 мар 2018, 12:52 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
pavia писал(а): На реальном железе надо включить WC(Write Combine) ускоряет в десятки раз! С ускорением все понятно. Спасибо! Но основной вопрос остался без ответа. Думаю я не правильно выразился. Я подключил драйвер мыши, но само собой мышь на месте не стоит, перемещаем ее. Как мне правильнее будет подтереть мышь из предыдущего "кадра"? Имею сейчас лишь задний и передний буфер. У меня есть пока лишь одна мысль иметь картинку мыши и структуру с данными (координаты и размеры) и накладывать в определенное место экрана после заднего буфера сразу на передний. Но чтото больно странное решение я вижу, а хорошего нет. Ведь как мне быть будет потом когда я начну перемещать окна по экрану. К тому же уже сейчас не подходит это решение, ведь таким образом привычный ввод не организовать. Да, я сделал ввод текста, но как же его удаление.... В общем как организовывать именно локальное обновление заднего буфера я не придумал. PS в данный момент я, как вы писали выше, перемещение из заднего в передний буфер произвожу копированием по 8 байт. Подскажите как правильнее, да хотя бы как нибудь организовать работу с буфера, учитывая что есть мышь, надо как то текст подтирать и тд |
Автор: | pavia [ 20 мар 2018, 18:43 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
grenders22 писал(а): Да, я сделал ввод текста, но как же его удаление.... В общем как организовывать именно локальное обновление заднего буфера я не придумал. Что такое сигналы и слоты в QT знаете? Или что такое события и их обработчики в Builder? По события локально обновляете вычисляете какое прямоугольник обновился далее проверяете все окна на пересечения с прямоугольником. Отсылаете им сообщение с событием перерисовка (Painting) Окна обрабатывают событие и в обработчике OnPaint рисуют своё содержимое. При рисование используются функции с клиппингом те. с обрезкой по краям окна. Это такая обертка которая математически вычисляет пересечения к примеру линии и окна тем самым усекает эту линию и отправляет её на рисование в алгоритма брезенхема, для окружностей так же используется итератор обходится граница окружности вычисляется пролеты от лева края до правого затем математически усекаются до видимой части и Далее пролёты выводятся. Для мыши есть несколько путей. К примеру VGA/EGA имеют аппаратное ускорение мыши. Можно как вы писали по события перемещения мыши вызывается сигнал OnPaint в котором вы копируете из заднего буфера на передний прямоугольник в старые координаты. А после на новом месте рисуете новую мышь. Если заднего буфера нет, то можно ввести слой абстракции. Вызов функций черчения(gdiLine,gdiCircle,gdiSplyne,gdiPolyLine,gdiBezier,gdiPolyBezier, gdiBitblit) должен гасить мышь затем вызываются уже функции из низшего уровня абстракции gmLine, gdiCircle,gdiSplyne и тд они будут чертить на переднем буфере, а затем с нова включать мышь. На OnShow вы копируете из первичного буфера во временный буфер-мыши картинку размером с указатель мыши. Тем самым сохраняете исходное изображение.Потом выводите свой значок мыши. А по OnHide восстанавливаете исходный участок изображения из буфера-мыши. |
Автор: | Himik [ 21 мар 2018, 00:19 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
Я использовал задний буфер в качестве образцового изображения, туда курсор мыши не рисуется. Курсор мыши рисуется прямо на экран, а при перемещении курсора - на него копируется участок из заднего буфера и затирается след мыши. Это программный аналог аппаратного курсора, поэтому обработка событий не нужна. По таймеру раз в секунду курсор дополнительно прорисовывается - на случай затирания выводимой информацией. Если использовать события перерисовки, то может получиться слишком часто при обильном выводе информации - весь пар уйдёт в гудок как говорится. |
Автор: | grenders22 [ 17 апр 2018, 22:44 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
pavia писал(а): Окна обрабатывают событие и в обработчике OnPaint рисуют своё содержимое. При рисование используются функции с клиппингом те. с обрезкой по краям окна. Это такая обертка которая математически вычисляет пересечения к примеру линии и окна тем самым усекает эту линию и отправляет её на рисование в алгоритма брезенхема, для окружностей так же используется итератор обходится граница окружности вычисляется пролеты от лева края до правого затем математически усекаются до видимой части и Далее пролёты выводятся. Чтото не ладится у меня, ну сделал я перемещение окон, сделал обработку событий окна(наружнюю обертку приложений так сказать).. Для меня это реально много... Но бьюсь с оптимизацией, и эта борьба с ударами в свои же ворота. В итоге вывод элементарного прямоугольного окна, без всяких заморочек которое, тормозит для моего глаза, фпс проседает(*хех*). Имею буфер и попиксельно вывожу (почему не копирую целую строку? есть прозрачные элементы и я смешиваю цвета окна и слоя ниже). И я уже не знаю. Что посоветуете? Где почитать теорию?)))) Своих мозгов на реализацию не хватает... ЗЫ желания для использования готовых/сторонних библиотек нет |
Автор: | pavia [ 18 апр 2018, 22:03 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
Цитата: (почему не копирую целую строку? есть прозрачные элементы и я смешиваю цвета окна и слоя ниже). Разделять на 3 типа применять разные оптимизации. Большинство пикселей же не прозрачны. http://www.antigrain.com/doc/scanlines/ ... ml#toc0001 |
Автор: | Himik [ 20 апр 2018, 18:56 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
grenders22 писал(а): И я уже не знаю. Что посоветуете? Где почитать теорию?)))) Своих мозгов на реализацию не хватает... MMX или SSE умеют обрабатывать 256-битные данные, состоящие из 4х 32-битных значений. Получится обрабатывать по 4 пикселя. |
Автор: | pavia [ 20 апр 2018, 19:28 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
Можно и на SSE по 4 пикселя. Но в инете обычно не все регистры используют, поэтому только по 2 пискеля. А вот если использовать AVX с 512 битами то можно по 4 пискелся или по 8 если захотеть. AVX2 https://breeswish.org/blog/2015/07/26/avx2-alphablend/ SSSE3 - на русском https://habrahabr.ru/post/273109/ SSE https://www.codeproject.com/Articles/28 ... blend-Code MMX https://gist.github.com/XProger/155262f898ceb2368323 |
Автор: | pavia [ 20 апр 2018, 19:52 ] |
Заголовок сообщения: | Re: Вывод пикселя в VESA |
Потоки данных. Чем меньше потоков тем быстрее код. Каждое обращение к памяти это более 4 тактов. чтение одного пикселя чтение другого пикселя операция обработки запись результата тут 3 потока. Скорость 3-х. А вот если нам нужно нарисовать прямоугольник, то очевидно что он рисуется одним цветом тогда запомнив в регистре цвет мы получим 1 поток данных. Скорость 1-х. Так-то ускорение в 3 раза. Если хранить картинкой и копировать на экран по у нас будет 2 потока и соответственно скорость 2-х. А если частично прозрачная то разбив каринтку на непрозрачную часть полностью прозрачную и частично прозрачную можно получить скорость 1٫2-х против 2-х. Это конечно меняет способ хранения. Либо динамически разбивать, но это более сложные трюки. |
Страница 2 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |