大家来聊聊吧,关于wince下做图片浏览器,顺便第一次散分

ironox 2009-01-20 08:47:22

靠,为什么我只能给一百分啊!


正在做一个图片浏览程序

目前图片的拖动都是不停的刷DC,在mousemove消息里不停的bitblt

在开发板上 一次bitblt要10多近20毫秒(我用gettickcount测的)

看起来有点闪烁,不是太流畅。

不晓得大家研究过IPHONE没,它那种平滑的图片滑动效果怎么做的呀?
看起来好酷炫的!

大家在自己的项目有弄过没,都来聊聊
...全文
543 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
yewenlin 2009-04-13
  • 打赏
  • 举报
回复
我做此功能2440上开发的,速度非常快,效果和IPhone差不多。只用了最简单的GDI技术。
hugang_04 2009-04-01
  • 打赏
  • 举报
回复
进俩学习下,我正在做这东西呢
ironox 2009-02-02
  • 打赏
  • 举报
回复

偶才出来5个月,

只能望洋兴叹了,帮楼主顶
clementzhao 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 ironox 的回复:]
引用 30 楼 clementzhao 的回复:
图片浏览器是全屏使用吗,如果不是,有些menu、bar、icon那些都是不需要刷新的。
6410是rgb控制器,所谓的刷全屏只是把图像解码,放入主显存的动作。lcd的画面是硬件自己刷的。整个刷新动作只是软件的一个解码、运算、传输的操作,速度应该非常快。除非是lcd驱动中有等待、阻塞的情况,否则是相当于写一下就做完的。gettickcount放在哪个部分检测了?你可以检测一下 BltComplete和BltPrepare之…
[/Quote]

解码多缓冲实际上是间接的解决显示速度问题。嵌入式系统内存一般不多,一个比较大的压缩资源需要分时、分多次解码,达到节省资源目的。特别是图像浏览时候,显示区域往往比真实图像要小很多。那么解码部分并不需要完全解压出来,只需要一部分就可以使用了。如果有更多的内存存放或者能预测将要显示的位置,解码速度将成为程序显示的瓶颈。提高解码速度,多个缓冲是一个方法。
DDRAW你可以参考一下http://www.codesoso.com/code/DirectDraw-Double-Buffered.aspx
ironox 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 clementzhao 的回复:]
图片浏览器是全屏使用吗,如果不是,有些menu、bar、icon那些都是不需要刷新的。
6410是rgb控制器,所谓的刷全屏只是把图像解码,放入主显存的动作。lcd的画面是硬件自己刷的。整个刷新动作只是软件的一个解码、运算、传输的操作,速度应该非常快。除非是lcd驱动中有等待、阻塞的情况,否则是相当于写一下就做完的。gettickcount放在哪个部分检测了?你可以检测一下 BltComplete和BltPrepare之间的消耗,GPEBltParms参数会指出此次blt是放到哪个区域,如果pDst为主显存,那么此次操作才是真正的刷新动作。
flip功能相当于屏幕显存多缓冲,对于某些rgb控制器和场景,flip功能可以有效提高显示性能。详细可以参考一下dx的设计,据我所知,三星BSP是没有包括ddraw部分,需要自己添加。当然,也可以自己实现解码多缓冲
[/Quote]

原来你是说用DDRAW啊,我现在是用GDI。

不过我接下来会试着在DDRAW上做的,DDRAW应该很快了吧



解码多缓冲 还不懂
kaifaye 2009-01-21
  • 打赏
  • 举报
回复
进来学学
clementzhao 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 ironox 的回复:]
引用 27 楼 clementzhao 的回复:
不知道你的开发板使用何种lcd控制器。一次blt要10-20ms绝对不正常,只有全屏刷新才需要这么多时间。
如果是mpu型的,那么驱动可能没有正确按照blt的rect刷新区域。
如果是rgb型的,写入主显存的速度肉眼很难识别出来。或者是在不恰当的时候进行刷新,某些lcd控制器会有短暂闪烁。
所以,楼主使用什么板子?
或许可以考虑一下加入flip功能,那样效果会好很多。


什么LCD控制器 我不…
[/Quote]

图片浏览器是全屏使用吗,如果不是,有些menu、bar、icon那些都是不需要刷新的。
6410是rgb控制器,所谓的刷全屏只是把图像解码,放入主显存的动作。lcd的画面是硬件自己刷的。整个刷新动作只是软件的一个解码、运算、传输的操作,速度应该非常快。除非是lcd驱动中有等待、阻塞的情况,否则是相当于写一下就做完的。gettickcount放在哪个部分检测了?你可以检测一下BltComplete和BltPrepare之间的消耗,GPEBltParms参数会指出此次blt是放到哪个区域,如果pDst为主显存,那么此次操作才是真正的刷新动作。
flip功能相当于屏幕显存多缓冲,对于某些rgb控制器和场景,flip功能可以有效提高显示性能。详细可以参考一下dx的设计,据我所知,三星BSP是没有包括ddraw部分,需要自己添加。当然,也可以自己实现解码多缓冲。
ironox 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 clementzhao 的回复:]
不知道你的开发板使用何种lcd控制器。一次blt要10-20ms绝对不正常,只有全屏刷新才需要这么多时间。
如果是mpu型的,那么驱动可能没有正确按照blt的rect刷新区域。
如果是rgb型的,写入主显存的速度肉眼很难识别出来。或者是在不恰当的时候进行刷新,某些lcd控制器会有短暂闪烁。
所以,楼主使用什么板子?
或许可以考虑一下加入flip功能,那样效果会好很多。
[/Quote]

什么LCD控制器 我不太清楚, 我就是刷全屏,程序是全屏显示的。

奇怪的是在模拟器刷全屏只要 10毫秒以内的时间,有时候是2毫秒,

但是看起来还是不流畅

我用的是6410开发板,

然后问下,什么是flip功能,怎么添加?

orangeman1982112 2009-01-21
  • 打赏
  • 举报
回复
用双缓存应该是问题不大,我用API做过480*360的屏,可以刷.不是很闪.
clementzhao 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 ironox 的帖子:]

靠,为什么我只能给一百分啊!


正在做一个图片浏览程序

目前图片的拖动都是不停的刷DC,在mousemove消息里不停的bitblt

在开发板上 一次bitblt要10多近20毫秒(我用gettickcount测的)

看起来有点闪烁,不是太流畅。

不晓得大家研究过IPHONE没,它那种平滑的图片滑动效果怎么做的呀?
看起来好酷炫的!

大家在自己的项目有弄过没,都来聊聊
[/Quote]


不知道你的开发板使用何种lcd控制器。一次blt要10-20ms绝对不正常,只有全屏刷新才需要这么多时间。
如果是mpu型的,那么驱动可能没有正确按照blt的rect刷新区域。
如果是rgb型的,写入主显存的速度肉眼很难识别出来。或者是在不恰当的时候进行刷新,某些lcd控制器会有短暂闪烁。
所以,楼主使用什么板子?
或许可以考虑一下加入flip功能,那样效果会好很多。
ironox 2009-01-21
  • 打赏
  • 举报
回复

MSDN 找到一段话 与大家分享下:

The drawback of GDI is that it was not designed for high-performance multimedia software. It was made to be used by business applications like word processors and spreadsheet applications.

GDI provides access to a video buffer in system memory, not video memory, and does not take advantage of special capabilities that some video cards provide. In short, GDI is great for most business applications, but its performance is too slow for multimedia or game software.
ironox 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zpk1234 的回复:]
个人感觉用MFC和API不会有差别,
因为MFC仅仅是对API进行了一层封装.
比如CDC::Bitblt也是调用的API中的
::Bitblt()函数而已
[/Quote]

言之有理
儿大不由爷 2009-01-21
  • 打赏
  • 举报
回复
如果要动态效果,肯定是要双缓冲了
scems 2009-01-21
  • 打赏
  • 举报
回复
不懂,up
netsocket 2009-01-21
  • 打赏
  • 举报
回复
不懂,up
mengll002 2009-01-21
  • 打赏
  • 举报
回复
关注
------------
学习
ironox 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 xajhuang 的回复:]
SDK + IImage + DirectDraw s3c2440 400M 未用显示芯片 分辨率800 x 480 大小为 3M 左右的 JPG 图片,可以做到不闪烁,流畅地移动。
[/Quote]

你用的是DDRAW,我现在用的是GDI

准备用DDRAW重写一遍

另外IImage加载大图片比较慢吧
xajhuang 2009-01-21
  • 打赏
  • 举报
回复
SDK + IImage + DirectDraw s3c2440 400M 未用显示芯片 分辨率800 x 480 大小为 3M 左右的 JPG 图片,可以做到不闪烁,流畅地移动。
zhujinqiang 2009-01-21
  • 打赏
  • 举报
回复
帮顶。
yihan7h 2009-01-21
  • 打赏
  • 举报
回复
不知道用API改写性能会有多大提升~~
加载更多回复(19)

19,503

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧