| 发表于:2007-08-03 11:08:136楼 得分:0 |
问题解决的还不够。 为了效率高一些,我把cdc指针和graphics等对象的初始化都放到oninitdialog中了,作为成员变量,现在我修改的函数是这样的: void drawdisc (bool bdrawbkgrd) { // 设定裁剪区域 if (bdrawbkgrd) { // 绘制背景时需要清空剪切区域,才能把整个背景画出来。 if (!m_pgraphics-> isclipempty ()) m_pgraphics-> resetclip (); } else { // 只需要画圆环,为了效率,设定剪切区域。 m_pgraphics-> setclip (m_pcliprgn); } // 暂时用的临时对象(速度还可以),也可以把它作为成员变量,这样更好一些。 graphics memgraphics(m_pbkbmp); // 在背景图片上画7个按钮 for (int i = 0; i < 7; i++) { memgraphics.drawcachedbitmap (m_pcachedbmp[i], m_place[i].x, m_place[i].y); } // 绘制到屏幕 m_pgraphics-> drawimage (m_pbkbmp, 0, 0, m_pbkbmp-> getwidth(), m_pbkbmp-> getheight()); } 这个函数在一个循环中反复调用。绘制速度挺高的,能够达到65fps,还是前面提到的机器配置。但是,背景图片绘制了一次之后,m_pbkbmp就脏了。下次循环用的载入的m_pbkbmp就是已经绘制上7个按钮后的图片,再在这个图片的基础上再绘制7个按钮,显示...呵呵,这样可不是我想要的效果! 所以,我将上面的函数改成: void drawdisc (bool bdrawbkgrd) { // 设定裁剪区域 if (bdrawbkgrd) { // 绘制背景时需要清空剪切区域,才能把整个背景画出来。 if (!m_pgraphics-> isclipempty ()) m_pgraphics-> resetclip (); } else { // 只需要画圆环,为了效率,设定剪切区域。 m_pgraphics-> setclip (m_pcliprgn); } // 内存中绘制 bitmap* pbmp = m_pbkbmp-> clone (0, 0, m_pbkbmp-> getwidth(), m_pbkbmp-> getheight(), pixelformat24bpprgb); // 这里m_pmemgraphics是成员变量了 m_pmemgraphics = m_pgraphics-> fromimage (pbmp); // 在内存的背景图片上画7个按钮 for (int i = 0; i < 7; i++) { m_pmemgraphics-> drawcachedbitmap (m_pcachedbmp[i], m_place[i].x, m_place[i].y); } // 绘制到屏幕 m_pgraphics-> drawimage (pbmp, 0, 0, pbmp-> getwidth(), pbmp-> getheight()); delete pbmp; pbmp = null; } 嗯,这次是我看到的是想要的效果。不过,速度慢下来了,只有十几fps....怎样才能避免clone操作和fromimage操作呢?这两个函数浪费了太多的时间!换个其它的方法也行,只要效率提高上去。联想到bitblt函数能够把内存dc绘制到屏幕dc上,猜测如果能够将graphics看成cdc对象也进行类似的操作可能效率会高些吧,好象gdi+中没有这样的方法(这样操作效率是否达到要求还不确定) | | |
|