chenqi5624 2015-02-14 16:54
浏览 713

DirextDraw双缓冲问题,出现重叠

明明清除了视频内存中的数据,Flip绘制时为何绘制的时候出现重叠,当设置位置为(600,400)时,如绘制的图像FPS=1 与FPS=2重叠...后续的绘制不断重叠,如果绘制的坐标(0,400)较小时不会出现重叠现象,求解答!

 在这里书写代码片  
 while(TRUE)///主循环
    {
        if(::PeekMessage(&msg,NULL,0 ,0 ,PM_REMOVE))
        {
            if(msg.message  ==  WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        //////////////the game processing goes here 
        else
        {
            static char info[10];
            memset(info,0,10);
            sprintf(info,"FPS=%0.0f",++Fps);
            CGAME::Game_Main(info,1);//绘制图像
        }
    }

    ///////CGAME::Game_Main函数
int CGAME::Game_Main(void* parms,int num_parms )
{
    CDX_::lpddsd    =   new DDSURFACEDESC2();
    DDRAW_INIT_STRUCT(CDX_::lpddsd);
    CDX_::lpddsback->Lock(NULL,CDX_::lpddsd,
                                        DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,
                                        NULL);
    UCHAR*  back_buffer = (UCHAR*)CDX_::lpddsd->lpSurface;
    //////清除了内存
    if(CDX_::lpddsd->lPitch ==  SCREEN_WIDTH)
        memset(back_buffer , 0 ,SCREEN_WIDTH*SCREEN_HEIGHT);
    else
    {
        UCHAR   *dest_ptr  = back_buffer;
        for(int y =0 ; y<SCREEN_HEIGHT;++y)
        {
            memset(dest_ptr ,0 ,SCREEN_WIDTH);
            dest_ptr+=CDX_::lpddsd->lPitch;         
        }
    }///////填充backsurface
    CDX_::lpddsback->Unlock(NULL);
    ///////绘制GDI,绘制的坐标为(600,400)
    CGAME::GDI_DRAW((char*)parms,600,400,
        RGB(rand()%255,rand()%255,rand()%255),CDX_::lpddsback);
    while(FAILED(CDX_::lpddsprimary->Flip(NULL,DDFLIP_WAIT)));
    Sleep(200);
    delete      CDX_::lpddsd;
    CDX_::lpddsd    =   NULL;
    return 1;
}

//////////绘制CGAME::GDI_DRAW使用GDI绘制

 int    CGAME::GDI_DRAW(char *text, int x,int y,
                                              COLORREF color, LPDIRECTDRAWSURFACE7 lpdds)
{
        HDC xdc; 
        if (FAILED(lpdds->GetDC(&xdc)))
           return(0);
        SetTextColor(xdc,color);
        SetBkMode(xdc, TRANSPARENT);
        TextOut(xdc,x,y,text,strlen(text));
        lpdds->ReleaseDC(xdc);
        return(1);
}

结果图片
结果图片

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 sub地址DHCP问题
    • ¥15 delta降尺度计算的一些细节,有偿
    • ¥15 Arduino红外遥控代码有问题
    • ¥15 数值计算离散正交多项式
    • ¥30 数值计算均差系数编程
    • ¥15 redis-full-check比较 两个集群的数据出错
    • ¥15 Matlab编程问题
    • ¥15 训练的多模态特征融合模型准确度很低怎么办
    • ¥15 kylin启动报错log4j类冲突
    • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大