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