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

Kri*_*oks 2 c console framebuffer

在基于帧缓冲区的控制台中渲染字符的最快方法是什么?我正在使用XNUiso_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);
        }

    }   
}
Run Code Online (Sandbox Code Playgroud)

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

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

直到有太多行,我需要重新绘制整个控制台(滚动),此时存在明显的延迟。

Ski*_*izz 5

我想到了一些事情(这让我回到了以前的 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
Run Code Online (Sandbox Code Playgroud)

2)消除内循环中的if:

 draw pixel (fg + (bg - fg) & (((sym >> column) & 1) - 1)
Run Code Online (Sandbox Code Playgroud)

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

4)滚动时,不要重新绘制所有字符,只需移动屏幕上剩余的部分即可。例如,从第 1 行到第 0 行执行 memmove,行数为 - 1。然后清除暴露区域。

|-------|                             |-------|                      |-------|
|.......|                             |@@@@@@@|                      |@@@@@@@|
|@@@@@@@| scroll up a line => memmove |#######| then clear => memset |#######|
|#######|                             |#######|                      |       |
|-------|                             |-------|                      |-------|
Run Code Online (Sandbox Code Playgroud)