在TTY上打印新线会进行TTY更新,但这似乎是不必要的。 我尝试了
ioctl(tty1_fd, KDSETMODE, KD_GRAPHICS)
,但这会冻结输出,我必须通过SSH登录并运行
ioctl(tty1_fd, KDSETMODE, KD_TEXT)
以使用笔记本电脑进行任何操作或查看更新的Framebuffer。
这只会影响我的笔记本电脑。如果我在具有双核AMD E-350和(集成?)高级微设备[AMD/ATI]摔跤手[Radeon HD 6310]图形和Linux 5.11.10-Gentoo-X86_644的PC上运行它,一切正常。 这个framebuffer示例有相同的问题。
我尝试与mplayer一起播放视频,但也行不通。 如果我去TTY3并与mplayer -vo fbdev2:/dev/fb0 video.mp4
一起运行。 如果我切换到TTY4,则视频(不是声音)将开始口吃。 它看起来只有在TTY更新FrameBuffer之后显示帧缓冲程序的内容(即光标眨眼或写了新字符) 它在TTY3上起作用,因为Mplayer会在每个屏幕更新后写入当前时间,这将使FrameBuffer更新。小型示例:
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <chrono>
#include <thread>
#include <sys/mman.h>
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<uint8_t *>(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
}
}
您可能需要更多的IOCTL,建议的方法是动态获取数据。 我不确定C ++,但这是我用于此类任务的C片段: