c - 在控制台(帧缓冲区)中绘制字符的最快方法?

标签 c console framebuffer

在基于帧缓冲区 的控制台中渲染字符的最快方法是什么?我使用的是来自 XNU 发行版的 iso_font.h 字体。

现在我正在使用这段代码来渲染一个角色,但它似乎不太有效:

px = px* ISO_CHAR_WIDTH;
py = py* (ISO_CHAR_HEIGHT-1);

for (int i = 0; i < 15; i += 1) 
{
    int sym = iso_font[c*16+i];

    int x = px;
    int y = py + i;

    for (int ii =0; ii < 8; ii++) 
    {
        x+=1;
        if ((sym & (1 << ii)))
        {
            fb_set_px(x,y,fg);
        }
        else 
        {
            fb_set_px(x,y,bg);
        }

    }   
}

我也想知道是否可以简化这段代码:

void fb_set_px(x,y,hex){
    void*ptr = ((_base + (_bpr*y) + (_bpe*x)));
    unsigned int *p = (unsigned int *) ptr;
    *p=hex;
}

在行数太多并且我需要重绘整个控制台(滚动)时,它是不错的,此时会有明显的延迟。

最佳答案

我想到了一些事情(这让我回到了旧的 DOS 时代!):-

1) 使用增量寻址写入像素:

  p = calculate address of x,y
    for line = 0 to 15
      for column = 0 to 7
        write to p
        increment p
      end
      p += stride - 8 (stride = distance in memory between vertically adjacent pixels)
    end

2)去掉内循环中的if:

 draw pixel (fg + (bg - fg) & (((sym >> column) & 1) - 1)

3) 使用操作系统的任何帮助。例如,这可能是硬件加速。

4) 滚动时,不要重绘所有字符,只需记住屏幕将保留的部分。例如从第 1 行到第 0 行进行内存移动,行数为 - 1。然后清除暴露区域。

|-------|                             |-------|                      |-------|
|.......|                             |@@@@@@@|                      |@@@@@@@|
|@@@@@@@| scroll up a line => memmove |#######| then clear => memset |#######|
|#######|                             |#######|                      |       |
|-------|                             |-------|                      |-------|

关于c - 在控制台(帧缓冲区)中绘制字符的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6663541/

相关文章:

python - 如何在运行django开发服务器时隐藏控制台?

c++ - Qt/C 如何读取当前在帧缓冲区中的图像?

c++ - 如何在没有 Xlib 的情况下配置 QT5

c - OpenGL 默认帧缓冲区内容在最小化/恢复周期后消失了吗?

c - 如何获得最大的 float ?

c - 构建交叉编译器 - 错误 : libmpfr not found

c++ - 在键上使用 gpg --list-packets 的输出来获取 mpi 值以生成 s 表达式

c - 为什么要分两步进行位移?

Ant exec 任务 : How can I read input from console stdin?

java - 控制台输出捕获的可用解决方案 - java