免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5435 | 回复: 0

关于图形模式的问题 [复制链接]

论坛徽章:
0
发表于 2015-10-30 13:08 |显示全部楼层
本帖最后由 626788149 于 2015-10-30 13:09 编辑

当屏幕满的时候 我需要向上滚动一行以显示新的内容

比如,我想打印10000行的信息,在qeum虚拟机下大概需要几秒钟的时间
但是在boch下或者在真实的机器下需要大概十分钟的时间才能全部打印完

如何才能加速呢?

  1. void init_vbe(uint32_t *p){
  2. //初始化VGA 获得一些VGA的信息
  3.    multiboot_info_t* minf = (multiboot_info_t*)p;
  4.    

  5.    //find if there have info about vbe
  6.         //
  7.    if((minf == NULL) || (minf->flags & 0x800) != 0x800)
  8.       return;
  9.    
  10.    VbeInfoBlock* vbeib = (VbeInfoBlock*)minf->vbe_info.vbe_control_info;
  11.    ModeInfoBlock* vebmb = (ModeInfoBlock*)minf->vbe_info.vbe_mode_info;
  12.    
  13.    //D7 = Linear frame buffer mode is available
  14.    //0 = No
  15.    //1 = Yes
  16.    
  17.    if((vebmb == NULL) || (vebmb->attributes & 0x80) != 0x80){
  18.       //Linear frame buffer mode is unavailable
  19.       return;
  20.    }
  21.    if((vebmb->attributes & 0x10) == 0x10){
  22.       //text mode
  23.       video.mode = 0;   
  24.    }else{
  25.       video.mode = 1;
  26.    }
  27.    extern char _binary_font_bin_start[];

  28.     video.screen = (unsigned char*)vebmb->physbase;// Linear frame buffer 基地址
  29.    video.Xres = vebmb->Xres;
  30.    video.Yres = vebmb->Yres;
  31.    video.bpp = vebmb->bpp;
  32.    video.pitch = vebmb->pitch;
  33.    video.font_address = _binary_font_bin_start;
  34.    video.buff_size = video.Xres * video.Yres * (video.bpp/8);
  35.    video.crt_pos = 0;
  36.    video.fonth = 16;   //font pixel height
  37.    video.fontw = 8;
  38.    video.xpos = video.ypos = 0;
  39.    
  40.    
  41.    if(video.mode)
  42.       video.numchars = video.Xres * video.Yres / video.fonth /video.fontw;
  43.    else
  44.       video.numchars = video.Xres * video.Yres;

  45.    video.nchars_colum = video.Xres / video.fontw;
  46.    video.nchars_line = video.Yres / video.fonth;

  47.    cprintf("video.bpp:%d\n",video.bpp);
  48.    cprintf("video.pitch:%d\n",video.pitch);
  49.    cprintf("vbeib->TotalMemory:%dMB\n",vbeib->TotalMemory*64/1024);
  50.    cprintf("vbeib.buff_size:%dkb\n",video.buff_size/1024);
  51.    cprintf("vbeib->screen:%x\n",video.screen);

  52. }
复制代码

  1. void vga_putc(int c){
  2.    // if no attribute given, then use black on white
  3.    if (!(c & ~0xFF))
  4.       c |= 0xFFFFFF00;
  5.    
  6.    switch (c & 0xff) {
  7.    case '\n':
  8.       video.ypos++;
  9.       /* fallthru */
  10.    case '\r':
  11.       video.xpos = 0;
  12.       break;
  13.    case '\t':
  14.       cons_putc(' ');
  15.       cons_putc(' ');
  16.       cons_putc(' ');
  17.       cons_putc(' ');
  18.       cons_putc(' ');
  19.       break;
  20.    default:
  21.       //x * video.fontw, y * video.fontw
  22.       draw_char((c & 0xFF),video.xpos * video.fontw, video.ypos * video.fonth ,(c>>8) & 0xFF, (c>>16) & 0xFF,(c>>24) & 0xFF);
  23.       video.xpos++;
  24.       break;
  25.    }
  26.    if (video.xpos >= video.nchars_colum ){
  27.       video.xpos = 0;
  28.       video.ypos++;
  29.    }
  30.    if(video.ypos >= video.nchars_line){
  31. //这一步用于滚屏
  32.       //video.fonth is height of font
  33.       memmove(video.screen, video.screen + video.Xres * video.bpp/8 * video.fonth,
  34.              (video.buff_size - video.Xres * video.bpp/8* video.fonth));
  35.       video.ypos--;
  36.       int i;
  37.       for (i = 0; i < video.nchars_colum; i++){
  38.          draw_char(' ',(video.xpos + i) * video.fontw, video.ypos * video.fonth ,(c>>8) & 0xFF, (c>>16) & 0xFF,(c>>24) & 0xFF);
  39.          
  40.       }
  41.    }

  42. }
复制代码
  1. void draw_char(char ch, int x, int y,unsigned char r,unsigned char g,unsigned char b)  
  2. {  
  3. //这个函数用于画字符
  4.    int bar = video.bpp/8;
  5.    char* font = video.font_address + ch*16;
  6.    unsigned char *where = video.screen + x*bar + y*video.Xres*bar;
  7.    int i, j;
  8.    
  9.    
  10.    for (i = 0; i < 16; i++) {
  11.       uint8_t bit = 0x80;
  12.       for (j = 0; j < 8; j++) {
  13.          if(*font & bit){
  14.             
  15.             where[j*bar] = b;
  16.             where[j*bar + 1] = g;
  17.             where[j*bar + 2] = r;
  18.          }
  19.          else{
  20.             where[j*bar] = 0x00;
  21.             where[j*bar + 1] = 0x00;
  22.             where[j*bar + 2] = 0x00;
  23.          }
  24.          bit = bit >> 1;
  25.       }
  26.       where+=video.bpp*video.Xres/8;
  27.       font ++;
  28.    }
  29. }
复制代码
  1. static void putpixel(unsigned char* screen, int x,int y, int color) {
  2. //这个函数用于画点
  3.    int i = video.bpp/8;
  4.    unsigned where = x*i + y*i*video.Xres;
  5.    screen[where] = color & 255;              // BLUE
  6.    screen[where + 1] = (color >> 8) & 255;   // GREEN
  7.    screen[where + 2] = (color >> 16) & 255;  // RED
  8. }
复制代码
刷新的速度很慢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP