Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вс июл 23, 2017 7:39 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 52 сообщения ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Чт мар 26, 2015 1:49 am 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
Даже программная прорисовка не может так проседать из-за курсора, там что-то не так.

Есть функция 18, подфункция 14 в Колибри API (wait for screen retrace).
Можно попробовать использовать её.
Например:
Я создаю второй буфер в RAM (бэкбуфер) и рисую в него изображение.
Затем жду обновления экрана.
Как только он обновится я начинаю копировать из бэкбуфера в LFB.
Затем строю в бэкбуфер следующее изображение, а когда произойдет следующий рейтрейс то он выведет скопированное в начале цикла первое изображение.
То есть копирование будет происходит сразу после обновления экрана, что должно гарантировать что копирование успеет завершится до следующего обновления.
Возможно будет небольшая латентность, из-за того что получается задержка в 1 кадр, но при хорошем FPS наверное незаметно (в D3D например по нескольку кадров наперёд буферизируется).


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Чт мар 26, 2015 9:31 pm 
Не в сети
Just Flooding
Аватара пользователя

Зарегистрирован: Чт дек 11, 2014 1:31 am
Сообщения: 173
а примерный список этих 3D приложений можешь дать? как раз перед началом копирования можно блокировать прерывания, а по завершении активировать, тогда и попробовать словить эффект vsync можно с минимальными затратами на буфер, а латентность можно даже сделать настраиваемой. вердикт: качай исходник, смотри, делай :)


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Пт мар 27, 2015 12:01 am 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
Да все 3D приложения которые в папке rd/1/3D.
Например демо с шестерёнками при разрешении 1024x768 (VirtualBox, 1 ядро выделено, 2.2 ГГц) дают 55-60 FPS, а если начать непрерывно двигать мышь будет 30 FPS.

Блокировка прерывания на обновление экрана?
То есть можно запретить обновлять данные экрана считыванием из LFB, пока я туда записываю?
Это делать функцией из KolibriAPI или как-то через VESA сразу?
Я думал что видеокарта выводит данные из LFB прямо на экран и если LFB заблокировать то ничего выводиться просто не будет, или после LFB есть ещё какие то буферы?


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Пт мар 27, 2015 9:04 pm 
Не в сети
Just Flooding
Аватара пользователя

Зарегистрирован: Чт дек 11, 2014 1:31 am
Сообщения: 173
не, про прерывания процессора, чтобы не останавливать рандомно процесс вывода, делается ассемблерной инструкцией... т.к. вывод из вторичного буфера в RAM осуществляется сразу как обновился экран, вывод происходит без задержек, как при тройной буферизации, если конечно VESA позволит такой трюк, а то я не уверен, что для этого не надо использовать прерывания BIOS...


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Пт мар 27, 2015 11:29 pm 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
Ок, попробую.

По ходу работы в Колибри словил несколько багов:
* Когда я передал неправильные параметры в функцию 4 (которая строки выводит) и запустил из под отладчика mtdbg, приложение зависло с pages fault, и его невозможно было убрать через kill process, система при выключении тоже не смогла завершить его и так и не выключилась.
* Если в eolite file manager переименовывать файл и набрать имя существующего файла, то существующий удаляется и на его место записывается переименованный. Я таким образом потерял солидный кусок кода. Корзина была бы весьма кстати. Вообще же я считаю переименовывание ни при каких обстоятельствах не должно менять данные файлов, нужно просто запретить называть имена файлов тем же именем, даже не спрашивать пользователя о замене. Для изменения данных файлов есть другие операции.


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Пт мар 27, 2015 11:37 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1060
sam0delk1n писал(а):
Если в eolite file manager переименовывать файл и набрать имя существующего файла, то существующий удаляется и на его место записывается переименованный. Я таким образом потерял солидный кусок кода. Корзина была бы весьма кстати. Вообще же я считаю переименовывание ни при каких обстоятельствах не должно менять данные файлов, нужно просто запретить называть имена файлов тем же именем, даже не спрашивать пользователя о замене. Для изменения данных файлов есть другие операции.

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

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Сб мар 28, 2015 12:20 am 
Не в сети
Just Flooding
Аватара пользователя

Зарегистрирован: Чт дек 11, 2014 1:31 am
Сообщения: 173
sam0delk1n писал(а):
[...] считаю переименовывание [...] не должно менять данные файлов, нужно просто запретить называть имена файлов тем же именем, даже не спрашивать пользователя о замене. Для изменения данных файлов есть другие операции.

полностью +.
думаю, файл остался на диске, просто в таблице файлов изменилось смещение ("ссылка") на смещение на новый файл, любая утилита восстановления данных вернёт, если диск не переполнен и еще не "чистил" его...


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Сб мар 28, 2015 2:37 am 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
А вот ещё вопрос: как адресовать присоединённые страницы?
Вот я выделил две страницы через кучу. Адрес первой сохранил в переменную. При обращении внутри неё всё нормально работает. Как только я пишу что-то вроде mov dword [ pFirstPage + 4096 ], 0xffffffff, то есть пытаюсь записать в то место где должна быть следующая то получаю page fault. Как я понимаю физически она может находиться и в другом месте, но виртуальная адресация ОС должна быть сплошной, так?
Или у меня что-то в понимании ассемблера неправильно?


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Сб мар 28, 2015 11:09 am 
Не в сети
Just Flooding
Аватара пользователя

Зарегистрирован: Чт дек 11, 2014 1:31 am
Сообщения: 173
я не спец, но возможно и 4095. да, и функция кучи может писать страницы куда ей удобней, я думаю...
может это чем поможет...


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Сб мар 28, 2015 1:49 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1060
sam0delk1n писал(а):
А вот ещё вопрос: как адресовать присоединённые страницы?
Вот я выделил две страницы через кучу. Адрес первой сохранил в переменную. При обращении внутри неё всё нормально работает. Как только я пишу что-то вроде mov dword [ pFirstPage + 4096 ], 0xffffffff, то есть пытаюсь записать в то место где должна быть следующая то получаю page fault. Как я понимаю физически она может находиться и в другом месте, но виртуальная адресация ОС должна быть сплошной, так?
Или у меня что-то в понимании ассемблера неправильно?

получается, что прибавил 4096 к адресу переменной pFirstPage, а не к адресу который лежит в этой переменной,. И да, не факт, что новая страница выделилась после предыдущей, а не в любом жругом участке памяти.

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Сб мар 28, 2015 2:26 pm 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
Точно, у меня была глупость написана, конечно же надо было прибавлять к значению которая лежит в переменной.
Теперь работает.

Однако насчёт страниц: всё таки приложение использует виртуальное адресное пространство, а значит даже если вторая страница будет в другом месте, всё равно я смогу обращаться к ней как если бы она была сразу за первой. В стандартной реализации страничной адресации именно так.

Но в моём случае я хочу выделить 300 страниц под буфер изображения. И вот тут мне бы хотелось чтобы страницы действительно физически были друг за другом, т. к. если память будет фрагментирована, будут происходить кеш-промахи. Можно ли как-то принудительно заставить систему реорганизовать размещение страниц? Насколько мне известно всякие malloc и new в с/с++ умеют выделять физически непрерывный кусок памяти. Просто в описании функций Колибри нет информации где выделяются страницы, может они и так подряд выделяются.


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Сб мар 28, 2015 3:31 pm 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
Мне кажется нужно делать такую логику:
1. Для двух разных запросов выделения памяти можно выбирать разные физические адреса страниц.
2. Для одного запроса нужно по возможности выделять физически целый блок, если такого нет -- возвращать ошибку.
3. Пользователь может попросить реорганизовать расположение страниц в памяти чтобы освободился большой пустой кусок, эту операцию сделать отдельно от п. 2, чтобы пользователь решил стоит ли тратить время или предпринять что-то другое (например запросить меньше памяти), т. к. Колибри ориентирована на скорость.
4. После реорганизации снова попытаться запросить выделение памяти.


Вернуться к началу
 Заголовок сообщения: Re: вопрос от новичка
СообщениеДобавлено: Пн мар 30, 2015 7:32 pm 
Не в сети

Зарегистрирован: Сб мар 21, 2015 8:06 pm
Сообщения: 15
Сегодня Колибри заглючила/зависла. Пропала панель задач внизу, пропал курсор мыши, на устройства ввода никакой реакции, отображался только рабочий стол. Работали два TextEdit'а, компилятор fasm, mtdbg и моё приложение с выводом графики.
Могло ли такое поведение быть результатом неправильной работы моего приложения?
Как в таких ситуациях поступать? Колибри не знает что в ней что-то сломалось и получается что нету ни bsod'ов, ни крэш-дампов.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 30, 2015 7:47 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1060
Вполне возможно. Повторить не пробовал?

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 30, 2015 7:49 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1060
В любом случае нужен лог board, для этого запусти board чере run и в качестве параметра путь к файлу на внешнем накопителе куда будет писаться лог.

_________________
я лишь учусь


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

Часовой пояс: UTC+03:00


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

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


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

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