Есть ли способ заставить кадр -буфера Linux мгновенно отобразить рамку?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли способ заставить кадр -буфера Linux мгновенно отобразить рамку?

Сообщение 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
}
}


Подробнее здесь: https://stackoverflow.com/questions/671 ... -instantly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»