请教evc中如何快速移动图片

小庞   2008-7-23 11:23 楼主
在Wince中添加一个较大的位图,设想有一个相对较小的取景框,当这个框快速移动时,我想显示屏幕上位图移动的动画效果。我在evc中代码如下:
         CBitmap m_bitmap;
        BITMAP bm;
         m_bitmap.LoadBitmap(IDB_BITMAP1);
        m_bitmap.GetBitmap(&bm);
        CDC memdc;
        //获得绘图环境资源
        CDC *pDC = new CClientDC(this);
        if(!memdc.GetSafeHdc())
        {
                memdc.CreateCompatibleDC(pDC);
                memdc.SelectObject(&m_bitmap);
        }
        m_windowLeft=0;//取景框的左边界
        while (m_windowLeft         {
                if(m_windowLeft==bm.bmWidth-321)
                        m_windowLeft=0;
                m_windowLeft+=1;
                pDC->BitBlt(0,0,320,440,&memdc,m_windowLeft,m_windowTop,SRCCOPY);
        }
        m_bitmap.DeleteObject();
        memdc.DeleteDC();
        delete pDC;
结果可以显示出移动效果,但是移动速度很不理想(s3c2410上)。如果调整m_windowLeft+=5,则屏幕闪烁。同样代码在pc机上试过,速度稍快但是仍不理想。我想达到播放视频文件那样的显示效果,不知各位高手有何指教?不胜感激!       

回复评论 (14)

速度肯定不行,不要拿PC来比。
点赞  2008-7-23 11:48
再说你的代码,也是有问题的。

想实现LZ所说的效果,必须对代码进行处理,使用一定的技巧。
点赞  2008-7-23 11:54
最快的速度 直接将图片数据写入到 显示 Buffer中, 可以实现你要的流畅的效果,30帧/s  

同样 只要你程序设置合理, 也可以实现你要的“基本流畅”的效果, 你那样闪烁肯定是对 VC/EVC 中图像显示没有处理仔细,双缓冲区 或者多缓冲区支持看看

点赞  2008-7-23 14:10
1楼:我试验过了,vc2005下配置很高的机子同样代码结果并没快很多。另外当使用timer时,即使间隔为1ms和10ms基本上没什么区别,我想知道这到底是何原因?
2楼:有何技巧?烦您明示
3楼:这个方案考虑过,只是,如何直接将图片数据写入到 显示 Buffer中?
点赞  2008-7-23 21:33
你的需求有点没弄清,能说的明确一点吗?或者有没有可参考的应用程序看看效果?
PC上也无法实现较好的效果,那显然是程序的实现方法有问题了。
一直感觉VC下这样的DC直接操作,只是基本画图才用,稍微要求性能高点的,这样用法都会有问题,在VC/MFC的图形算法版块看过太多了。可惜不是专业做图像视频的,所以感想不深。
点赞  2008-7-23 22:04
我想模拟一个摄像头随着摇杆摆动而摆动时看到的内容。在AD输入时显示出一个变化的场景。我想在Wince中添加一个较大的位图,随着AD变化显示其中的一部分。楼上有没有其他更好的办法?
刚才又试了一下,pc上把dc,bitmap都设为全局变量,不用频繁创建删除,pc速度快了很多很多,而且不闪烁(和想象的一样了)。但是怪异的是,采用timer哪怕是延时1ms(settimer(0,1,null))速度立刻减慢,会是何原因?
同样程序改变后,2410上基本没变化。试过wince上多开线程,显示速度更慢,看样子和机器性能还是有关。可是难道没有什么算法解决之?
点赞  2008-7-23 22:39
绘图算法你可以去VC/MFC相关版块讨论,只要不是很炫的效果,一般在WINCE下也能通用,我就没这水平了。

定时器是系统中优先级最低的中断了,随便什么中断都能抢在这个之前运行。
还有Timer是有最小精度的,跟平台密切相关。2410好像无法实现1mS的精确定时,你最好确认一下。
点赞  2008-7-24 09:02
一般能实现50ms已经不错啦!
点赞  2008-7-24 09:28
显示 Buffer中, 可以实现你要的流畅的效果,30帧/s  
显示 Buffer在哪里?如何操纵呢?
点赞  2008-7-26 12:11
引用: 引用 9 楼 langfang_wh 的回复:
显示 Buffer中, 可以实现你要的流畅的效果,30帧/s
显示 Buffer在哪里?如何操纵呢?

使用gapi或者ddraw
但是我觉得lz要的效果用gdi应该也可以实现,待我晚上试一下
点赞  2008-7-27 11:34
Buffer 就是 显示缓冲区呀  一般在2410注册表中Display下面有 类似 0x30100000 的地址,关于长度, 那可以自己计算,一般是 LCD屏的 width *Heigh*(BPP/8)   你只需要将你的数据拷贝到这里面就行了,这是最原始的方式了。怎么 内存映射,看看驱动里面内存映射那个函数吧, 我现在也忘记了。


Gapi 或者DDRAW 也能实现比较流畅的效果,我见一个同事这样做效果挺好

点赞  2008-7-27 19:26
非常感谢!
地址映射到不成问题,你说的这个地址是不是2410的LCD的数据控制器?直接循环写就行了?我先试试,希望可以
另外我这板子是通过lcd加了vga的片子后通过tv输出的,不知道还行不行,听起来挺啰嗦的,呵呵
点赞  2008-7-28 11:57
引用: 引用 12 楼 langfang_wh 的回复:
非常感谢!
地址映射到不成问题,你说的这个地址是不是2410的LCD的数据控制器?直接循环写就行了?我先试试,希望可以
另外我这板子是通过lcd加了vga的片子后通过tv输出的,不知道还行不行,听起来挺啰嗦的,呵呵

是framebuffer地址,加了vga显示和这个没有关系,也是可以写framebuffer的,不过这样写应用程序不太好.
另外我试了一下用gdi写lz的应用,显示步进+5或者+10的话速度也还可以啊,不过移动的时候画面有点变形
点赞  2008-7-28 12:14
前些日子论坛总进不去,又出差忙点别的,真不好意思
楼上给个代码好不?我试试就结贴。
现在硬件已经决定换2440了,还没出板,不知道结果如何,过些日子再研究,感谢诸位大侠支援
点赞  2008-8-24 08:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复