OSDev

для всех
Текущее время: 28 мар 2024, 22:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 19 мар 2018, 19:00 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Здесь это периодически обсуждается. Надо задать тип кэширования видеопамяти - "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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 19 мар 2018, 19:54 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
grenders22 писал(а):
С выводом картинок и примитовов я разобрался. Но больно уже медленно весь экран обновлять. Прочитал про двойную буферизацию, но опять таки надо обновлять весь экран. Проблемы возникают когда я ввожу текст. Очень медленно каждый символ добавляется. Особенно заметно на реальном железе.

Предположим у меня есть окно и как мне обновлять буфер лишь в пределах этого окна?

Для примера приведу цифры:
-весь экран 1024х768
-координаты окна 200х200
-ширина и длинна окна 500х350 соответственно

На реальном железе надо включить WC(Write Combine) ускоряет в десятки раз!

Графика вещь такая. Она требует оптимизации и ещё раз оптимизации. Лучше взять готовую библиотеку такую как agg.
Символы вы храните в упакованном виде поэтому много тратите на распаковку. Распакуйте под ваш видео режим. При выводе не используйте PuPixel, а обрабатывайте пролётами span(). Копируйте не по байту, а по 8 или 16 байт.

А вывод картинки вы должны сами уметь сделать - тыж программист как никак.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 20 мар 2018, 12:52 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
pavia писал(а):
На реальном железе надо включить WC(Write Combine) ускоряет в десятки раз!

С ускорением все понятно. Спасибо!

Но основной вопрос остался без ответа. Думаю я не правильно выразился. Я подключил драйвер мыши, но само собой мышь на месте не стоит, перемещаем ее. Как мне правильнее будет подтереть мышь из предыдущего "кадра"? Имею сейчас лишь задний и передний буфер.

У меня есть пока лишь одна мысль иметь картинку мыши и структуру с данными (координаты и размеры) и накладывать в определенное место экрана после заднего буфера сразу на передний. Но чтото больно странное решение я вижу, а хорошего нет. Ведь как мне быть будет потом когда я начну перемещать окна по экрану. К тому же уже сейчас не подходит это решение, ведь таким образом привычный ввод не организовать. Да, я сделал ввод текста, но как же его удаление.... В общем как организовывать именно локальное обновление заднего буфера я не придумал.

PS в данный момент я, как вы писали выше, перемещение из заднего в передний буфер произвожу копированием по 8 байт.

Подскажите как правильнее, да хотя бы как нибудь организовать работу с буфера, учитывая что есть мышь, надо как то текст подтирать и тд


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 20 мар 2018, 18:43 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
grenders22 писал(а):
Да, я сделал ввод текста, но как же его удаление.... В общем как организовывать именно локальное обновление заднего буфера я не придумал.

Что такое сигналы и слоты в QT знаете? Или что такое события и их обработчики в Builder?

По события локально обновляете вычисляете какое прямоугольник обновился далее проверяете все окна на пересечения с прямоугольником. Отсылаете им сообщение с событием перерисовка (Painting)

Окна обрабатывают событие и в обработчике OnPaint рисуют своё содержимое.
При рисование используются функции с клиппингом те. с обрезкой по краям окна. Это такая обертка которая математически вычисляет пересечения к примеру линии и окна тем самым усекает эту линию и отправляет её на рисование в алгоритма брезенхема, для окружностей так же используется итератор обходится граница окружности вычисляется пролеты от лева края до правого затем математически усекаются до видимой части и Далее пролёты выводятся.

Для мыши есть несколько путей. К примеру VGA/EGA имеют аппаратное ускорение мыши. Можно как вы писали по события перемещения мыши вызывается сигнал OnPaint в котором вы копируете из заднего буфера на передний прямоугольник в старые координаты.
А после на новом месте рисуете новую мышь.
Если заднего буфера нет, то можно ввести слой абстракции. Вызов функций черчения(gdiLine,gdiCircle,gdiSplyne,gdiPolyLine,gdiBezier,gdiPolyBezier, gdiBitblit)
должен гасить мышь затем вызываются уже функции из низшего уровня абстракции gmLine, gdiCircle,gdiSplyne и тд они будут чертить на переднем буфере, а затем с нова включать мышь.
На OnShow вы копируете из первичного буфера во временный буфер-мыши картинку размером с указатель мыши. Тем самым сохраняете исходное изображение.Потом выводите свой значок мыши.
А по OnHide восстанавливаете исходный участок изображения из буфера-мыши.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 21 мар 2018, 00:19 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Я использовал задний буфер в качестве образцового изображения, туда курсор мыши не рисуется. Курсор мыши рисуется прямо на экран, а при перемещении курсора - на него копируется участок из заднего буфера и затирается след мыши. Это программный аналог аппаратного курсора, поэтому обработка событий не нужна.
По таймеру раз в секунду курсор дополнительно прорисовывается - на случай затирания выводимой информацией. Если использовать события перерисовки, то может получиться слишком часто при обильном выводе информации - весь пар уйдёт в гудок как говорится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 17 апр 2018, 22:44 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
pavia писал(а):
Окна обрабатывают событие и в обработчике OnPaint рисуют своё содержимое.
При рисование используются функции с клиппингом те. с обрезкой по краям окна. Это такая обертка которая математически вычисляет пересечения к примеру линии и окна тем самым усекает эту линию и отправляет её на рисование в алгоритма брезенхема, для окружностей так же используется итератор обходится граница окружности вычисляется пролеты от лева края до правого затем математически усекаются до видимой части и Далее пролёты выводятся.


Чтото не ладится у меня, ну сделал я перемещение окон, сделал обработку событий окна(наружнюю обертку приложений так сказать).. Для меня это реально много... Но бьюсь с оптимизацией, и эта борьба с ударами в свои же ворота. В итоге вывод элементарного прямоугольного окна, без всяких заморочек которое, тормозит для моего глаза, фпс проседает(*хех*). Имею буфер и попиксельно вывожу (почему не копирую целую строку? есть прозрачные элементы и я смешиваю цвета окна и слоя ниже).

И я уже не знаю. Что посоветуете? Где почитать теорию?)))) Своих мозгов на реализацию не хватает...

ЗЫ желания для использования готовых/сторонних библиотек нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 18 апр 2018, 22:03 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
(почему не копирую целую строку? есть прозрачные элементы и я смешиваю цвета окна и слоя ниже).

Разделять на 3 типа применять разные оптимизации. Большинство пикселей же не прозрачны.
http://www.antigrain.com/doc/scanlines/ ... ml#toc0001


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 20 апр 2018, 18:56 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
grenders22 писал(а):
И я уже не знаю. Что посоветуете? Где почитать теорию?)))) Своих мозгов на реализацию не хватает...

MMX или SSE умеют обрабатывать 256-битные данные, состоящие из 4х 32-битных значений. Получится обрабатывать по 4 пикселя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 20 апр 2018, 19:28 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Можно и на 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, 20:15, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод пикселя в VESA
СообщениеДобавлено: 20 апр 2018, 19:52 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Потоки данных. Чем меньше потоков тем быстрее код.
Каждое обращение к памяти это более 4 тактов.

чтение одного пикселя
чтение другого пикселя
операция обработки
запись результата

тут 3 потока. Скорость 3-х.
А вот если нам нужно нарисовать прямоугольник, то очевидно что он рисуется одним цветом тогда запомнив в регистре цвет мы получим 1 поток данных. Скорость 1-х. Так-то ускорение в 3 раза.
Если хранить картинкой и копировать на экран по у нас будет 2 потока и соответственно скорость 2-х.
А если частично прозрачная то разбив каринтку на непрозрачную часть полностью прозрачную и частично прозрачную можно получить скорость 1٫2-х против 2-х.

Это конечно меняет способ хранения. Либо динамически разбивать, но это более сложные трюки.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB