gtk有更快的图像刷新方法吗
我用gtk来实现了一个图片的过渡效果,每一帧画面处理完后调用gtk_widget_queue_draw_area来引发expose_event事件,然后在expose_event事件的回调函数中绘制图像,在pc上效果还可以接收,可是在嵌入式机器里面反应巨慢,我测试了一下,在我引发信号到进入到expose_event回调函数里要几百毫秒的时间,这显然是太慢了(希望能在10毫秒以内),gtk的机制如此没办法,不知道除了这样做还没有更实时的绘制方法,即我每帧的画面处理完后能立即显示出来,知道的朋友还望不吝赐教,小弟感激不尽!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
GTK机制如此,导致各种方法都不能有效加速画面的刷新速度,我现在的做法是在gdk-directfb层面增加一个接口,重新编译库,使我在gtk程序中可以调用该接口取得gdk的图像渲染所使用的dfb的surface,然后我在动画效果时的代码实际上是一段dfb程序,将图像直接渲染到该surface上,跳过了gdk的那些东东,我试了一下初步取得成功,并且不影响gtk窗口的事件处理,全屏从上到下依次画隔行直线速度还不错,继续改进一下看看图片显示速度怎么样,我弄成功的话将方法写出来大家一起讨论讨论。
考虑下gtk_widget_send_expose直接进入重绘
解决了吗?我最近也需要做这些,解决后希望告知一声
又测试了一下,我原来在expose-event回调函数里面用gdk_draw_pixbuf()画的,现在直接在每一帧处理完了调用它也可以画出来的,和gdk_draw_rgb_image()效果一样,现在的问题是在pc上这两个函数调用都可以刷新画面,可是在gtk+dfb构架的嵌入式机器上就都画不出来,除非每一帧处理完设置无效区域,然后在expose-event回调函数中调他们,难道gtk+dfb的构架就只能在expose-event的回调函数中来画图吗
我试了一下,你说的的确是可以的,我调用gdk_draw_rgb_image()后是可以立即画出来,不过是在pc上,我pc的gtk是2.10,但是嵌入式中画不出来,可能gtk+dfb中没有支持到这个函数,郁闷了
SORRY,确实打错了,是gdk_draw_rgb_image
多谢二楼的回复!按你的意思那就是调用gtk_window_draw_rgb()就立即可以显示了吗,不需要等到触发expose_event事件到了就行了,如果这样的话就好办了,我每帧处理完直接调它就行了,不用设置无效区了,那就真是太理想了,不过你这函数根本就不存在还是你打错了呀,但我看到的一些代码都是要设置无效区的
===》三楼:我的就是gtk+dfb的,感觉移植后控件和内存都耗的巨大,可能优化的不够,现在速度和内存占用都不理想
你的平台是GTKFB吗,移植方便吗?移植完成后需要多大空间?
直接用个线程不就可以了,搞个信号量,然后让这个线程等待信号量,图片处理的时候会占用信号量,而绘制线程就等待信号量,取得信号量后直接gtk_window_draw_rgb就可以了。
draw图片的时候要前后加上 gdk_threads_enter(),gdk_threads_leave()