Я делаю видеоплеер в C ++, который отображает видео на Framebuffer Linux. Кадры не видны сразу после обновления, но только после обновления TTY (например, курсор мигает или я удерживаю ключ). < /P>
Я не думаю, что процессор должен Медленно /делает слишком много вещей, потому что ни одно ядро не имеет 100% использования, а в программе в большинстве используется 30% процессор. будет обновляться только при обновлении HTOP (каждые 1,5 секунды). < /p>
Я использую Arch Linux с Linux 5.11.11-Arch1-1 (теперь 5.11.14-Arch1-1) на Ноутбук (Acer Swift 3) с двойным ядром Intel Core I3-8145U и интегрированной графикой (Intel UHD Graphics 620), который есть драйвер I915. ?
Я попытался использовать fsync, но он ничего не сделал. ioctl (tty1_fd, kdsetmode, kd_graphics) , но это замораживает вывод, и я должен войти через SSH и запустить ioctl (tty1_fd, kdsetmode, kd_text)
Это только влияет на мой ноутбук. Все работает, если я запускаю его на ПК с двойным ядро AMD E-350 и (интегрированными?) Усовершенствованными микро-устройствами [AMD/ATI] Wrestler [Radeon HD 6310] Графика и Linux 5.11.10-Gentoo-X86_64.
В этом примере кадриста есть та же проблема. к TTY3 и запустите его с помощью mPlayer -vo fbdev2:/dev/fb0 video.mp4 Видео будет воспроизводиться без какого -либо отставания.
Если я переключусь на tty4, видео (не звук) запустит Заикание.
выглядит так, как будто показывает содержание кадрика только после того, как TTY обновляет кадр -буфер (то есть курсор мигает или написан новый персонаж)
работает на TTY3, потому что MPLAYER пишет текущее время после Каждое обновление экрана, которое сделает обновление Framebuffer. < /p>
Минимальный пример: < /p>
#include
#include
#include
#include
#include
#include
constexpr size_t WIDTH = 1920; // framebuffer width (in pixels)
constexpr size_t HEIGHT = 1080; // framebuffer height (in pixel)
constexpr size_t BYTES_PER_PIXEL = 4; // bytes per pixel (bgra)
constexpr size_t MEM_WIDTH = WIDTH * BYTES_PER_PIXEL; // framebuffer width in memory
constexpr size_t FRAME_SIZE = MEM_WIDTH * HEIGHT; // size of one frame
constexpr size_t FPS = 24; // framerate
static constexpr size_t NSPF = FPS ? std::nano::den / (FPS * std::nano::num) : 0; // nanoseconds per frame
static constexpr std::chrono::nanoseconds SLEEP_DURATION{NSPF};
int fb_fd; // framebuffer filedescriptor
uint8_t *fb_mem; // pointer to mmaped framebuffer
static void set_pixel(size_t x, size_t y, bool black)
{
auto *pixel = &fb_mem[MEM_WIDTH * y + x * BYTES_PER_PIXEL];
std::fill_n(pixel, 4, black ? 0 : 255);
}
int main()
{
fb_fd = open("/dev/fb0", O_RDWR);
fb_mem = static_cast(mmap(nullptr, FRAME_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0));
size_t x = 0;
size_t y = 100;
bool black = false;
while (true)
{
for (size_t _x = x; x < _x + 10; x++)
set_pixel(x, y, black);
if (x >= WIDTH)
{
x %= WIDTH; // go back to the beginning side of the line
black = !black;
}
std::this_thread::sleep_for(SLEEP_DURATION); // wait for the next frame
}
}
Подробнее здесь: https://stackoverflow.com/questions/671 ... -instantly
Есть ли способ заставить кадр -буфера Linux мгновенно отобразить рамку? ⇐ C++
Программы на C++. Форум разработчиков
1739529109
Anonymous
Я делаю видеоплеер в C ++, который отображает видео на Framebuffer Linux. Кадры не видны сразу после обновления, но только после обновления TTY (например, курсор мигает или я удерживаю ключ). < /P>
Я не думаю, что процессор должен Медленно /делает слишком много вещей, потому что ни одно ядро не имеет 100% использования, а в программе в большинстве используется 30% процессор. будет обновляться только при обновлении HTOP (каждые 1,5 секунды). < /p>
Я использую Arch Linux с Linux 5.11.11-Arch1-1 (теперь 5.11.14-Arch1-1) на Ноутбук (Acer Swift 3) с двойным ядром Intel Core I3-8145U и интегрированной графикой (Intel UHD Graphics 620), который есть драйвер I915. ?
Я попытался использовать fsync, но он ничего не сделал. ioctl (tty1_fd, kdsetmode, kd_graphics) , но это замораживает вывод, и я должен войти через SSH и запустить ioctl (tty1_fd, kdsetmode, kd_text)
Это только влияет на мой ноутбук. Все работает, если я запускаю его на ПК с двойным ядро AMD E-350 и (интегрированными?) Усовершенствованными микро-устройствами [AMD/ATI] Wrestler [Radeon HD 6310] Графика и Linux 5.11.10-Gentoo-X86_64.
В этом примере кадриста есть та же проблема. к TTY3 и запустите его с помощью mPlayer -vo fbdev2:/dev/fb0 video.mp4 Видео будет воспроизводиться без какого -либо отставания.
Если я переключусь на tty4, видео (не звук) запустит Заикание.
выглядит так, как будто показывает содержание кадрика только после того, как TTY обновляет кадр -буфер (то есть курсор мигает или написан новый персонаж)
работает на TTY3, потому что MPLAYER пишет текущее время после Каждое обновление экрана, которое сделает обновление Framebuffer. < /p>
Минимальный пример: < /p>
#include
#include
#include
#include
#include
#include
constexpr size_t WIDTH = 1920; // framebuffer width (in pixels)
constexpr size_t HEIGHT = 1080; // framebuffer height (in pixel)
constexpr size_t BYTES_PER_PIXEL = 4; // bytes per pixel (bgra)
constexpr size_t MEM_WIDTH = WIDTH * BYTES_PER_PIXEL; // framebuffer width in memory
constexpr size_t FRAME_SIZE = MEM_WIDTH * HEIGHT; // size of one frame
constexpr size_t FPS = 24; // framerate
static constexpr size_t NSPF = FPS ? std::nano::den / (FPS * std::nano::num) : 0; // nanoseconds per frame
static constexpr std::chrono::nanoseconds SLEEP_DURATION{NSPF};
int fb_fd; // framebuffer filedescriptor
uint8_t *fb_mem; // pointer to mmaped framebuffer
static void set_pixel(size_t x, size_t y, bool black)
{
auto *pixel = &fb_mem[MEM_WIDTH * y + x * BYTES_PER_PIXEL];
std::fill_n(pixel, 4, black ? 0 : 255);
}
int main()
{
fb_fd = open("/dev/fb0", O_RDWR);
fb_mem = static_cast(mmap(nullptr, FRAME_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0));
size_t x = 0;
size_t y = 100;
bool black = false;
while (true)
{
for (size_t _x = x; x < _x + 10; x++)
set_pixel(x, y, black);
if (x >= WIDTH)
{
x %= WIDTH; // go back to the beginning side of the line
black = !black;
}
std::this_thread::sleep_for(SLEEP_DURATION); // wait for the next frame
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/67107885/is-there-any-way-to-force-the-linux-framebuffer-to-display-a-frame-instantly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия