编写的一个播放avi文件的程序,但为什么播放的速度特别慢,很卡,不知是那里的问题,请各位大虾帮忙看看,谢谢
相关的程序部分如下:
void CMyView::Onplay() //>
{
if(no<len0)
{
SetTimer(1,20,NULL);
}
}void CMyView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
playavi(no);
if(stop0==1) return;
no++;
CFormView::OnTimer(nIDEvent);
}
void CMyView::playavi(int a)//单步AVI
{ if(name.Right(3)=="avi")
bi1=m_avi.AviRead(no);
else
{m_list.GetText(no,name);
m_list.SetCurSel(no);
file0(name);//调文件
}
xianshi();
CString cc;
cc.Format("%s 第%d祯",name,no);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd ;
pMain->m_wndStatusBar.SetPaneText(1,cc);
}void CMyView::xianshi()
{ CClientDC dc(this);
if (bi1==NULL) {return;}
hdd = DrawDibOpen(); if(!hdd) return; //打开DrawDib
DrawDibDraw(hdd,dc.m_hDC,90,2,rect.Width()-95,rect.Height()-8,//bi1->biWidth,//bi1->biHeight,
bi1,NULL,0,0,bi1->biWidth,bi1->biHeight,0);
DrawDibClose(hdd);
}void CMyView::file0(CString cc)
{ len0=0;
if(cc.Right(3)=="tml")
{bi1=m_avi.LoadTml(cc);
goto aa;
}
if(cc.Right(3)=="avi")
{if(m_avi.pData!=NULL) m_avi.AviExit();
no=0;//起始祯
name=cc;//取当前文件名
len0=m_avi.AviOpen(cc);//打开AVI文件,返回祯数
bi1=m_avi.AviRead(no);
return;
}
else
bi1=m_avi.LoadBmp(cc);
aa: len0=m_list.GetCount();
return;
}
请各位大虾帮忙指点,谢谢!!!!!
相关的程序部分如下:
void CMyView::Onplay() //>
{
if(no<len0)
{
SetTimer(1,20,NULL);
}
}void CMyView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
playavi(no);
if(stop0==1) return;
no++;
CFormView::OnTimer(nIDEvent);
}
void CMyView::playavi(int a)//单步AVI
{ if(name.Right(3)=="avi")
bi1=m_avi.AviRead(no);
else
{m_list.GetText(no,name);
m_list.SetCurSel(no);
file0(name);//调文件
}
xianshi();
CString cc;
cc.Format("%s 第%d祯",name,no);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd ;
pMain->m_wndStatusBar.SetPaneText(1,cc);
}void CMyView::xianshi()
{ CClientDC dc(this);
if (bi1==NULL) {return;}
hdd = DrawDibOpen(); if(!hdd) return; //打开DrawDib
DrawDibDraw(hdd,dc.m_hDC,90,2,rect.Width()-95,rect.Height()-8,//bi1->biWidth,//bi1->biHeight,
bi1,NULL,0,0,bi1->biWidth,bi1->biHeight,0);
DrawDibClose(hdd);
}void CMyView::file0(CString cc)
{ len0=0;
if(cc.Right(3)=="tml")
{bi1=m_avi.LoadTml(cc);
goto aa;
}
if(cc.Right(3)=="avi")
{if(m_avi.pData!=NULL) m_avi.AviExit();
no=0;//起始祯
name=cc;//取当前文件名
len0=m_avi.AviOpen(cc);//打开AVI文件,返回祯数
bi1=m_avi.AviRead(no);
return;
}
else
bi1=m_avi.LoadBmp(cc);
aa: len0=m_list.GetCount();
return;
}
请各位大虾帮忙指点,谢谢!!!!!
是每过20ms就画一次?
如果一定要自己去实现播放的话,
有如下建议:
人对动画能接受的频率是每秒36张图片,如此你可以计算一下计时器大概取多少间隔比较合适.
如果计时器间隔太小,会严重浪费CPU,当然可能会卡撒.
但是首先你不应该用GDI函数在界面上画位图。
其次,即使这样用,你也没有使用能够提高效率的处理方式。
再次,你的timer控制有问题