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)
直到有太多行,我需要重新绘制整个控制台(滚动),此时存在明显的延迟。
我想到了一些事情(这让我回到了以前的 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)
| 归档时间: |
|
| 查看次数: |
3656 次 |
| 最近记录: |