一次Linux 手持设备上手指滑动窗体的GTK程序的优化记录

问题描述:在linux的手持设备上构造一个通过手指滑动查看联系人的下应用,手指滑动的时候,表示联系人摘要信息的button有规律的放大缩小,焦点联系人button最大,两边的联系人button次之,以此类推。测试的时候发现:快速手指移动的时候,cpu占用高,user+sys的cpu占用接近100%,CS值很高,上下文切换频繁,出现屏幕滑动停滞再忽然恢复的情况。需要针对这种情况下进行优化。

 

实现方式简介:

 

构造一个手指滑动的窗体,窗体中使用gtk_fixed外层容器放置联系人摘要信息的gtk_button,gtk_button内放置了内层的gtk_fixed容器,然后放置联系人的图像、电话号码、email等联系方式的组件,gtk_fixed外层容器与横向调节组件GtkAdjustment  hadjust绑定。

 

1、手指滑动时间采集,使用一个时间的采集器,计算单位时间内手指滑动的距离(右滑为负,左滑为正),计算手指滑动产生的屏幕中心(焦点),例如整个窗体100如果手指在50坐标则焦点在窗体的一半。原焦点坐标-滑动距离=新的焦点坐标,焦点坐标为focus

 

2、当屏幕中心焦点滑动的时候,进入回调函数on_moko。

 

(1)on_moko计算每个联系人信息的button的位置及大小,并调用gtk_fixed_move移动联系人信息的button的位置。调用gtk_widget_set_size_request调整button的大小,调用gdk_pixbuf_scale_simple对联系人的图像进行缩放。

 

(2)设置GtkAdjustment,将焦点坐标设置给GtkAdjustment,gtk_adjustment_set_value(hadjust,focus)。使窗体随着手指移动。

 

性能疑问点及对应的优化措施:

 

(1)根据分析,产生了第一个性能疑问点:gtk_fixed_move和gtk_widget_set_size_request应当作为原子操作,即:move和request应该只导致屏幕更新一次,目前的这个写法,xserver应该区分不出这是一次的原子操作。

 

查询文档发现:仅gdk中gdk_window_move_resize ()方法,其API说明:Equivalent to calling gdk_window_move() and gdk_window_resize(), except that both operations are performed at once, avoiding strange visual effects. (i.e. the user may be able to see the window first move, then resize, if you don't use gdk_window_move_resize().) 在gtk的封装中找不到对应的方法,估计gtk的设计目标是做静态窗体开发,因此对控件的频繁连续的动态变化支持不够。

 

由于对gtk了解不够,只能简单粗暴的将gtk_fixed_move的源码下载,改名成xx_fixed_container,使之支持在子控件move的时候同时支持resize。由于gtk_fixed_move已经有控制子控件的x横坐标,y纵坐标修改的原子性,只需要类比的添加上对w宽度,h高度的控制,详细的情形此处不提。

 

测试,发现xx_fixed_container绘图的一些expose事件和size_allocate事件比原来减少了一半,但是程序放到手持设备上,性能改进不明显。

 

 

(2)gdk_pixbuf_scale_simple会不会导致多余的向屏幕绘图操作导致性能瓶颈?从日志上看,当手指滑动时gtk_image一个expose事件对应一个gdk_pixbuf_render_to_drawable,但是无法判断expose事件是否过多。

 

(3)反思实现过程,发现“gtk_fixed外层容器与横向调节组件GtkAdjustment  hadjust绑定”的实现有问题,一方面由于on_moko改变了每个联系人信息的button的位置及大小,势必导致屏幕重画;另一方面,gtk_adjustment_set_value这个函数为了解决窗口大小大于可显示窗口大小,实现“滑动窗口”的效果,也会重画屏幕。因此该市县导致xx_fixed_container的expose事件重复。

 

优化的方法是,去掉了GtkAdjustment,on_moko的时候同时实现“滑动窗口“效果,on_moko中计算的每个联系人信息的button X坐标改成了相对滑动窗口起点的坐标。

 

优化效果:快速移动时CPU的占用量已经缩减为原来的一半左右,也就是说本次优化后性能提升了接近一倍。手持设备上能够得到平滑的手指滑动效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值