游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4185|回复: 6

如何利用Directx提高绘图效率

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-3-18 17:02:00 | 显示全部楼层 |阅读模式

目前正在做一个信号处理的工作,要求将信号数据以谱图形式显示。当收到新的数据后,根据每组数据的大小计算出应该显示的颜色,同时将原来位图上移一位,在picturebox控件最下方显示出新的颜色点,达到平滑移动的效果。我目前采用了GDI的双缓存技术,但是画图的速度远远没有跟的上接收数据的速度,希望大家能够给我提一些更好的改进方案,提高我画图效率。(对另外两种画图方式,我还不是很了解,在此希望大家能够多多指教,在这里请各位Directx的高人指点)

class CWBSpecView : public CFormView
{
        CDC MemDC;
        CBitmap MemBitmap;} //MemDC, MemBitmap为全局变量,
void CWBSpecView::OnInitialUpdate()  //内存图层初始化
{
       
        m_nScreenx=GetSystemMetrics(SM_CXSCREEN);
        m_nScreeny=GetSystemMetrics(SM_CYSCREEN);
        //内存图层初始化
        CWnd *Specpic=this->GetDlgItem(IDC_PIC_SPEC);
        CDC *SpecpicDC=Specpic->GetDC();
        Specpic->GetClientRect(Rect2);
        int w=Rect2.Width();
        int h=Rect2.Height();
        MemDC.CreateCompatibleDC(NULL);
        MemBitmap.CreateCompatibleBitmap(SpecpicDC,m_nScreenx,m_nScreeny);
}
画图函数:
///////////////////////////////////////////////////////////////////
void drawpicSpec()      
{   int count;
        int nLevel;
        count=4096;
        CDrawpictureData* DrawpictureData=GetDrawpictureData();
        ASSERT(DrawpictureData);
    CMainFrame *pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd;
        CWBSpecView *pView=(CWBSpecView *)(pFrame->m_pWBSpecview);
        CWnd *Specpic=pView->GetDlgItem(IDC_PIC_SPEC);
        CDC *SpecpicDC=Specpic->GetDC();
        CRect Rect2;
        Specpic->GetClientRect(Rect2);
        int w=Rect2.Width();
        int h=Rect2.Height();
        CBitmap *poldBit=pView->MemDC.SelectObject(&pView->MemBitmap);
        for(int i=0;i<count;i++)
        {
                 MSG message;
                 while(:eekMessage(&message,NULL,0,0,PM_REMOVE))
                 {
                         ::TranslateMessage(&message);
                         :ispatchMessage(&message);
                 }
                 nLevel=ColorConf->Comppow(float(DrawpictureData->uiSonaData)); //此处计算色素索引值
                pView->MemDC.SetPixelV(i*Rect2.right/count,Rect2.Height()-1,ColorConf->m_nColor[nLevel]); //根据色素索引值在最下一行画出
        }
        pView->MemDC.BitBlt(0,Rect2.top-1,w,h,&pView->MemDC,0,0,SRCCOPY); //将内存中图像上移一行
    SpecpicDC->BitBlt(0,Rect2.top,w,h,&pView->MemDC,0,0,SRCCOPY);//将内存中图像显示
        Specpic->ReleaseDC(SpecpicDC);
}

程序启动2个线程来工作,一个线程用来接收数据,令一个线程根据接收到的数据进行绘图。画图函数在线程中调用,目前我采用这种方法,每秒只能显示十几帧,根本不能将每秒全部接收的数据显示。请各路高手能帮我修改一下解决方法。在此多谢了。

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-3-18 17:43:00 | 显示全部楼层

Re: 如何利用Directx提高绘图效率

用ddraw双缓存可以
lz可以先看看ddraw方面的书籍吧

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-3-18 17:47:00 | 显示全部楼层

Re: 如何利用Directx提高绘图效率

我刚刚装了一个directx9 ,不知道怎样操作,看了些书,directx自带的例子,比较笼统,
我怎么能将内存中的bitmap上移一行显示。
还有就是setpixel效率是不是也会影响。
您能够针对我的代码提出一些具体的改动方法么

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-3-18 18:15:00 | 显示全部楼层

Re: 如何利用Directx提高绘图效率

你可以参考
IDirectDrawSurface
的Blt和BltFast接口

11

主题

190

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2009-3-18 18:41:00 | 显示全部楼层

Re: 如何利用Directx提高绘图效率

根本不是绘图效率的事,是你的逻辑有问题
在你的循环里,每一次循环只能绘制一行数据,而且还要处理一遍消息队列,这造成每次循环所耗费的时间过长。
建议你改一下逻辑:
创建一个线程共享的数据队列,读取数据的线程只管把收到的数据送入队列,绘制线程每次循环查看队列中是否有数据,如果有的话就把队列中数据全部取出,里面有多少行就绘制多少行,没有数据的时候再跑消息循环。
说到效率,GDI的绘制效率不比DDRAW差,没有必要换


-----------------
欢迎光临我的博客 http://www.thecodeway.com


21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-3-18 21:38:00 | 显示全部楼层

Re: 如何利用Directx提高绘图效率

楼主你这个任务 GDI 足够胜任了。。

“GDI的绘制效率不比DDRAW差”。。。
以现在的硬件水平,哪怕是个集成显卡,DDRAW 都比 GDI 快很多。。。。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-3-23 21:51:00 | 显示全部楼层

Re: Re: 如何利用Directx提高绘图效率

我通过实验也发现,现在的瓶颈是在我的循环中,我必须把接收到的数据每画一行,将位图上移一行。如果把数据队列设大些,多画几行数据,实际的效率感觉也没有提高多少啊,
我还是不太明白,请多指教一下。

thejinchao: Re: 如何利用Directx提高绘图效率

根本不是绘图效率的事,是你的逻辑有问题
在你的循环里,每一次循环只能绘制一行数据,而且还要处理一遍消...

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 01:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表