后备缓冲

原创 2005年02月25日 19:53:00


int Game_Init(void *parms = NULL, int num_parms = 0)
{
 //创建IID_IDirectDraw7接口
 if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
    return(0);

 //设置协作级别
 if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
            DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
            DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
    return(0);

 //设置显示模块
 if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
    return(0);


 // clear ddsd and set size
 DDRAW_INIT_STRUCT(ddsd);

 // enable valid fields
 ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;

 //设置后备缓冲数目
 ddsd.dwBackBufferCount = 1;

 // request a complex, flippable
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;

 // create the primary surface
 if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
    return(0);

 // now query for attached surface from the primary surface

 // this line is needed by the call
 ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;

 //获取后备缓冲
 if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
   return(0);

 // build up the palette data array
 for (int color=1; color < 255; color++)
 {
  // fill with random RGB values
  palette[color].peRed   = rand()%256;
  palette[color].peGreen = rand()%256;
  palette[color].peBlue  = rand()%256;

  // set flags field to PC_NOCOLLAPSE
  palette[color].peFlags = PC_NOCOLLAPSE;
 } // end for color

 // now fill in entry 0 and 255 with black and white
 palette[0].peRed     = 0;
 palette[0].peGreen   = 0;
 palette[0].peBlue    = 0;
 palette[0].peFlags   = PC_NOCOLLAPSE;

 palette[255].peRed   = 255;
 palette[255].peGreen = 255;
 palette[255].peBlue  = 255;
 palette[255].peFlags = PC_NOCOLLAPSE;

 // create the palette object
 if (FAILED(lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 |
         DDPCAPS_INITIALIZE,
         palette,&lpddpal, NULL)))
 return(0);

 // finally attach the palette to the primary surface
 if (FAILED(lpddsprimary->SetPalette(lpddpal)))
    return(0);

 // return success or failure or your own return code here
 return(1);

} // end Game_Init

int Game_Main(void *parms = NULL, int num_parms = 0)
{
 if (window_closed)
    return(0);

 if (KEYDOWN(VK_ESCAPE))
   {
    PostMessage(main_window_handle,WM_CLOSE,0,0);
    window_closed = 1;
   } // end if

 // lock the back buffer
 DDRAW_INIT_STRUCT(ddsd);
 lpddsback->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);

 UCHAR *back_buffer = (UCHAR *)ddsd.lpSurface;

 if (ddsd.lPitch == SCREEN_WIDTH)
  memset(back_buffer,0,SCREEN_WIDTH*SCREEN_HEIGHT);
 else
   {
    // non-linear memory
  
    // make copy of video pointer
    UCHAR *dest_ptr = back_buffer;

    // clear out memory one line at a time
    for (int y=0; y<SCREEN_HEIGHT; y++)
    {
     // clear next line
     memset(dest_ptr,0,SCREEN_WIDTH);
      
     // advance pointer to next line
     dest_ptr+=ddsd.lPitch;
    } // end for y

   } // end else


 // you would perform game logic...
      
 // draw the next frame into the back buffer, notice that we
 // must use the lpitch since it's a surface and may not be linear

 // plot 5000 random pixels
 for (int index=0; index < 5000; index++)
 {
  int   x   = rand()%SCREEN_WIDTH;
  int   y   = rand()%SCREEN_HEIGHT;
  UCHAR col = rand()%256;
  back_buffer[x+y*ddsd.lPitch] = col;
 } // end for index

 // unlock the back buffer
 if (FAILED(lpddsback->Unlock(NULL)))
    return(0);

 // perform the flip
 while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));

 // wait a sec
 Sleep(500);

 // return success or failure or your own return code here
 return(1);

} // end Game_Main

双缓冲和后备缓冲

前面的例子都是,直接在主表面上绘东西。对于动画,直接在主表面上绘,会产生很严重的闪烁。解决的办法是采用双缓冲或后备缓冲。 双缓冲 双缓冲:在离屏缓冲中绘制图像,然后将其拷贝到显示表面。   见...
  • hustbin
  • hustbin
  • 2013年11月25日 21:30
  • 607

7.4.1动态画面(后备缓冲)

为了创建一个带有后备缓冲的主画面,你不得不创建DirectDraw所称的复杂画面.下面是创建步骤.1.首先,你要将DDSD_BACKBUFFERCOUNT加到dwFlags标志字段,向DirectDr...
  • bfqiwbifj
  • bfqiwbifj
  • 2010年08月10日 14:05
  • 621

DDraw笔记-双缓冲和后备缓冲

双缓冲和后备缓冲 前面的例子都是,直接在主表面上绘东西。对于动画,直接在主表面上绘,会产生很严重的闪烁。解决的办法是采用双缓冲或后备缓冲。 双缓冲 双缓冲:在离屏缓冲中绘制图像,然后将其拷贝到显...
  • javaweb_research
  • javaweb_research
  • 2011年08月26日 14:20
  • 351

东莞市上市后备企业名单 (金融工作局)

东莞市上市后备企业名单 (金融工作局)   东莞市金融工作局公示名单 公示时间 东莞市第一批上市后备企业 2008年4月 东莞劲胜精密组件股份有限公司(长安...
  • mysingle
  • mysingle
  • 2012年01月28日 18:10
  • 8648

C# 带后备字段的属性和不带后备字段的属性

public class Test { public Test() { Date = "1"; } private string dt { get; } = ...
  • qq_30858573
  • qq_30858573
  • 2018年01月06日 18:46
  • 80

双缓冲与后备缓冲的区别

 今天看了双缓冲和后备缓冲,他们是有区别的,双缓冲他的从表面我认为是在内存中的,而后备缓冲是在VRAM(显存)里面的,一个是用memcpy实现线性内存块的拷贝,一个是用指针指直接指向后备缓冲面.......
  • yhlyuan
  • yhlyuan
  • 2005年10月28日 01:30
  • 627

深圳市高层次专业人才后备级人才认定

 1.近5年,获得以下奖项者:(1)省、部科学技术奖二等奖、省、部技术发明奖二等奖、省、部科学技术进步奖二等奖第1名; (2)省厅级科学技术奖一等奖第1名; (3)市(地级市以上)科学技术发明奖一等奖...
  • sergeycao
  • sergeycao
  • 2010年10月29日 12:24
  • 1534

双缓冲页面和后备缓冲页面比较

双缓冲页面创建在Game_Init()中,与主表面无直接联系,双缓冲页面只是充当一个画板然后拷贝显示到主表面,后备缓冲与主表面同时创建,具有相同的尺寸, 双缓冲页面显示到主表面是通过内存复制,而后备...
  • yaoxinchao
  • yaoxinchao
  • 2012年07月18日 10:36
  • 3103

stm32 BKP寄存器操作[操作寄存器+库函数]

BKP是“BACKUP”的缩写,stm32f103RCTE的内部配备了10个16位宽度的BKP寄存器。在主电源切断或系统产生复位时间时,BKP寄存器仍然可以在备用电源的支持下保持其内容。  BKP在...
  • hao95165
  • hao95165
  • 2014年08月14日 11:14
  • 1353

常用的nginx 配置

见我的sae  http://gausszh.sinaapp.com/blog/view/12/ nginx 常用的配置 1. nginx.conf 主配置文件 user w...
  • gausszh
  • gausszh
  • 2014年08月01日 17:59
  • 746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:后备缓冲
举报原因:
原因补充:

(最多只允许输入30个字)