解决百人牛牛在部分电脑中摸牌动画卡顿问题,摸牌时改全部刷新为局部刷新

来源:互联网 发布:lil pump 知乎 编辑:程序博客网 时间:2024/05/08 14:04


</pre><pre name="code" class="cpp">
VOID CGameClientView::DrawGameView(CDC * pDC, INT nWidth, INT nHeight){////////用户打印刷新画面所花费的时间LARGE_INTEGER litmp; double  dfMinus,dfFreq, dfTim;LONGLONG QPart1,QPart2;QueryPerformanceFrequency(&litmp);dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率QueryPerformanceCounter(&litmp);QPart1 = litmp.QuadPart;/////////////////////////缓存dcCDC* pDCBuff = pDC;//by caoyongrong 4/23/2015
<span style="white-space:pre"></span>//百人牛牛在部分电脑中摸牌动画卡顿问题,摸牌时改全部刷新为局部刷新//是否全部刷新bool bFlush=true;if (!m_CardControl[0].m_blGameEnd||!m_CardControl[1].m_blGameEnd||!m_CardControl[2].m_blGameEnd||!m_CardControl[3].m_blGameEnd||!m_CardControl[4].m_blGameEnd)//五个方位中有正在摸牌的动画{if (m_CardControl[0].m_CardItemArray.GetCount()==5)//牌全发完{  bFlush=false;}}if (bFlush)//整张背景图画出来m_ImageViewBack.DrawImage( pDC, nWidth/2 - m_ImageViewBack.GetWidth()/2, 35);else//只重绘五个方位摸牌动画的位置{m_ImageViewBack.DrawImage( pDC, nWidth/2 - m_ImageViewBack.GetWidth()/2+200, 35+350,660,150,200,350,660,150);m_ImageViewBack.DrawImage( pDC, nWidth/2 - m_ImageViewBack.GetWidth()/2+530, 35+106,60,104,530,106,60,104);}if (bFlush)m_ImageWaitValleys.DrawImage( pDC, 15, 190 );//获取状态BYTE cbGameStatus=m_pGameClientDlg->GetGameStatus();//状态提示CFont static InfoFont;InfoFont.CreateFont(-16,0,0,0,400,0,0,0,134,3,2,ANTIALIASED_QUALITY,2,TEXT("宋体"));CFont * pOldFont=pDC->SelectObject(&InfoFont);pDC->SetTextColor(RGB(255,234,0));pDC->SelectObject(pOldFont);InfoFont.DeleteObject();//时间提示int nTimeFlagWidth = m_ImageTimeFlag.GetWidth()/3;int nFlagIndex=0;if (cbGameStatus==GAME_SCENE_FREE) nFlagIndex=1;else if (cbGameStatus==GAME_SCENE_PLACE_JETTON) nFlagIndex=2;else if (cbGameStatus==GAME_SCENE_GAME_END) nFlagIndex=0;m_ImageTimeFlag.DrawImage(pDC, 255, 145, nTimeFlagWidth, m_ImageTimeFlag.GetHeight(),nFlagIndex * nTimeFlagWidth, 0);//Dlg里面的SetGameTimer(GetMeChairID())里面调用的SwitchViewChairID在桌子人数大于8时实际是ViewID转化为0了if(m_wMeChairID!=INVALID_CHAIR){WORD wUserTimer=GetUserClock(m_wMeChairID);if (wUserTimer!=0) DrawTime(pDC, wUserTimer, 270, 65 );}//胜利边框if (bFlush)FlashJettonAreaFrame(nWidth,nHeight,pDCBuff);//筹码资源CSize static SizeJettonItem(m_ImageJettonView.GetWidth()/6,m_ImageJettonView.GetHeight());//绘画筹码for (INT i=0;i<AREA_COUNT;i++){//变量定义LONGLONG lScoreCount=0L;LONGLONG static lScoreJetton[JETTON_COUNT]={10000L,50000L,100000L,500000L,1000000L,5000000L};int static nJettonViewIndex=0;//绘画筹码for (INT_PTR j=0;j<m_JettonInfoArray[i].GetCount();j++){//获取信息tagJettonInfo * pJettonInfo=&m_JettonInfoArray[i][j];//累计数字ASSERT(pJettonInfo->cbJettonIndex<JETTON_COUNT);lScoreCount+=lScoreJetton[pJettonInfo->cbJettonIndex];//图片索引/*if (1==pJettonInfo->cbJettonIndex || 2==pJettonInfo->cbJettonIndex) nJettonViewIndex=pJettonInfo->cbJettonIndex+1;else if (0==pJettonInfo->cbJettonIndex) nJettonViewIndex=pJettonInfo->cbJettonIndex;*/nJettonViewIndex=pJettonInfo->cbJettonIndex;//绘画界面if (bFlush)m_ImageJettonView.DrawImage(pDC,pJettonInfo->nXPos+m_PointJetton[i].x,pJettonInfo->nYPos+m_PointJetton[i].y,SizeJettonItem.cx,SizeJettonItem.cy,nJettonViewIndex*SizeJettonItem.cx,0);/*m_ImageJettonView.TransDrawImage(pDCBuff,pJettonInfo->nXPos+m_PointJetton[i].x,pJettonInfo->nYPos+m_PointJetton[i].y,SizeJettonItem.cx,SizeJettonItem.cy,nJettonViewIndex*SizeJettonItem.cx,0,RGB(255,0,255));*/}//绘画数字if (bFlush)if (lScoreCount>0L)DrawNumberString(pDCBuff,lScoreCount,m_PointJettonNumber[i].x,m_PointJettonNumber[i].y);}//绘画庄家if (bFlush)DrawBankerInfo(pDCBuff,nWidth,nHeight);//绘画用户if (bFlush)DrawMeInfo(pDCBuff,nWidth,nHeight);//绘画上庄列表if (bFlush)DrawBankerList(pDC,nWidth,nHeight);//切换庄家if ( m_bShowChangeBanker ){intnXPos = nWidth / 2 - 88;intnYPos = nHeight / 2 - 160;//由我做庄if ( m_wMeChairID == m_wBankerUser ){if (bFlush)m_ImageMeBanker.DrawImage(pDC, nXPos, nYPos);}else if ( m_wBankerUser != INVALID_CHAIR ){
<span style="white-space:pre"></span>if (bFlush)m_ImageChangeBanker.DrawImage(pDC, nXPos, nYPos);}else{if (bFlush)m_ImageNoBanker.DrawImage(pDC, nXPos, nYPos);}}//发牌提示if (enDispatchCardTip_NULL!=m_enDispatchCardTip){if (m_ImageDispatchCardTip.IsNull()==false) m_ImageDispatchCardTip.DestroyImage();if (enDispatchCardTip_Dispatch==m_enDispatchCardTip)m_ImageDispatchCardTip.LoadImage(AfxGetInstanceHandle(),TEXT("DISPATCH_CARD"));elsem_ImageDispatchCardTip.LoadImage(AfxGetInstanceHandle(),TEXT("CONTINUE_CARD"));m_ImageDispatchCardTip.DrawImage(pDC, (nWidth-m_ImageDispatchCardTip.GetWidth())/2, nHeight/2);}//我的下注if (bFlush)DrawMeJettonNumber(pDCBuff);/*test*/if (0){//绘画扑克for (int i=0; i<CountArray(m_CardControl); ++i) m_CardControl[i].DrawCardControl(pDCBuff);}//胜利标志if (bFlush)DrawWinFlags(pDCBuff);if(0){m_bShowGameResult= 1;DrawType(pDC,0);}//结束状态if (cbGameStatus==GAME_SCENE_GAME_END){//绘画扑克for (int i=0; i<CountArray(m_CardControl); ++i){m_CardControl[i].DrawCardControl(pDCBuff);} }QueryPerformanceCounter(&litmp);QPart2 = litmp.QuadPart;dfMinus = (double)(QPart2-QPart1);dfTim = dfMinus / dfFreq;printf("cyr drawgameview time %e %I64d\n",dfTim,QPart2-QPart1);if(m_blMoveFinish){//显示结果DrawType(pDCBuff,0);ShowGameResult(pDCBuff, nWidth, nHeight);}else{ZeroMemory(m_nDrawTypeIndex,sizeof(m_nDrawTypeIndex));}//绘画框架<span style="color:#3366ff;">if (bFlush)</span>{DrawGameFrame(pDC, nWidth, nHeight);}//聊天输入CDC dcBuffer;CBitmap bmpBuffer;m_brush.DeleteObject();dcBuffer.CreateCompatibleDC(pDC);bmpBuffer.CreateCompatibleBitmap(pDC, 140, 20);CBitmap *pBmpBuffer = dcBuffer.SelectObject(&bmpBuffer);dcBuffer.BitBlt(0, 0, 140, 20, pDC, nWidth-192, nHeight-29-15, SRCCOPY);dcBuffer.SelectObject(pBmpBuffer);m_brush.CreatePatternBrush(&bmpBuffer);m_ChatDisplay.Invalidate(TRUE);if (bFlush)m_ImageCaijin.DrawImage(pDC,(nWidth-m_ImageCaijin.GetWidth())/2,27);//绘制彩金if (bFlush)for(int i=0;i<10;i++){m_ImageNumberCaijin[i].DrawImage(pDC,(nWidth-m_ImageCaijin.GetWidth())/2+183-(i*m_ImageNumberCaijin[i].GetWidth()/11),76,m_ImageNumberCaijin[i].GetWidth()/11,m_ImageNumberCaijin[i].GetHeight(),m_ImageNumberCaijin[i].GetWidth()/11*m_lCaiJinValue[i],0);}//if(m_bCaijin && m_blMoveFinish)//{//if(!m_bShowCaijinTip)//{//SetTimer(IDI_CAIJIN_TIP,6000,0);//m_bShowCaijinTip = true;//}//m_ImageGetCaijin.DrawImage(pDC,(nWidth-m_ImageGetCaijin.GetWidth())/2,(nHeight-m_ImageGetCaijin.GetHeight())/2);//CRect rc;//rc.left = (nWidth-m_ImageGetCaijin.GetWidth())/2 + 125;//rc.top  = (nHeight-m_ImageGetCaijin.GetHeight())/2 + 83;//rc.right= rc.left + 100;//rc.bottom = rc.top+ 20;//DrawNumberStringWithSpace(pDC,m_lGetCaijinValue,rc, DT_VCENTER| DT_CENTER,true);//}return;}



1之前本来听主管说把DrawImage调用,改为bitblt但是效果不明显,而且改为bitblt时,之前的png格式图片,还要转化成bitmap格式
2把相应的png格式图片转化成web png ,单单图片就从210kb变小为70kb,但是依然没什么效果
3摸牌时改全部刷新为局部刷新所消耗的计时器值Counter:刷一次页面(画底图-画一帧摸牌动画)
全刷新时Counter:2400
只刷新摸牌区域Counter:400

0 0
原创粉丝点击