Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1550372
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: 架构设计与优化

2013-06-07 10:41:38

http://blog.163.com/hbu_lijian/blog/static/1261291532012429104043353/
XWindow系统应用程序性能

应用程序遇到的与XWindow相关的性能问题:
1) 画图/刷新速度. 有些应用程序需要在屏幕上绘画大量图形.
2) 响应用户输入. 能在期待的时间能内做出响应
3) 应用程序启动/初始化. 包含大量窗体的程序启动可能会比较慢.
4) 客户端-服务器通信.
5) CPU使用. 如果X Client和X Server运行在不同CPU上, 那么CPU的使用应该分别考虑.
6) 内存使用
7) 图形和磁盘I/O

一般从以下几个方面着手解决XWindow应用程序性能问题
1) XLib请求和应答
2) X Event
3) 图形
4) 服务器端特性(feature)和约束(limitation)
5) 客户端特性(feature)和约束(limitation)
6) 内存

设计指导原则
1) 交互式程序最好使用事件驱动机制,而不是循环机制
2) 避免清空X Request Buffer; 或者在不必要情况下以同步方式运行X协议. Xwindow内置的缓冲机制非常高效.
3) 如果使用X Toolkit, 避免在widget和gadget之外发出Xlib请求,尤其是不要在回调函数中画图

延迟初始化来提高启动速度

改善响应

Xlib请求与应答
Xlib Request Buffer提高了client-server通信效率. Xlib在必要的时候会自动情况缓冲区.程序一般不必显式的清空; 不必要的flush会加重客户端/服务器和网络的负载

Round Trip Requests(往返请求)
代价最大的Xlib请求是round trip request. 例如XQueryTree, XGetWindowProperty; 这种请求需要得到服务器端的应答. 当执行round trip 请求的时候, xlib request buffer会清空, 并阻塞直到收到服务器的应答. 应该尽量避免这种请求.

Xlib和X Toolkit被设计成尽可能少的使用roundtrip请求. 例如, X Client启动连接X Server后会分配若干资源id; 类似于XCreateWindow的函数只是从这之中取一个id, 而不必发出一个roundtrip请求.

Xlib batch request(批量请求)
Xlib提供若干函数来执行单个操作和相应的批量操作, 例如XDrawPoint和XDrawPoints, XStoreColor和XStoreColors, 尽量使用批量操作.
有一个例外: XChangeGC和XSeet*GC速度一样, 因为两者都要写Xlib GC cache.

X Event
减少事件处理:
大部分事件可以通过XSelectEvent,加上mask, widget来处理, 可以选择必要事件来避免不必要的事件.
某些操作在某些参数下可能会产生事件, 例如XClearArea的最后一个参数如果是True,就会产生Expose事件.

Expose事件要小心处理:
1) 只重新绘画必要的受影响的区域
2) 忽略Expose事件, 直到Expose计数器=0
3) off-screen pixmap来恢复,

Backing Store and Save Unders
使用backing store和save under能减少expose事件, backing store应用于设置了该属性的窗口; 而save unders则对被设置了save under属性窗口遮住的窗口. 两者都可以通过XCreateWindow和XSetWindowAttributes来设置.两者都是拷贝窗口内容到off-screen, 然后恢复.但是不是所有XWindow Server实现的版本都支持back store, linux上就不支持back store, 这时必须程序自己来实现back store.

跟踪鼠标移动
跟踪鼠标移动的方法有
1) motion history buffer(XGetMotionEvents)
2) 同步查询(Synchronous Polling, XQueryPointer)
3) PointerMotion/ButtonMotion事件
4) XPeekIfEvent
5) PointerMotionHints
2)是易于使用但是代价很高的方法.


图形问题(GRAPHICS ISSUES)
1) 宽度为0的几何图形画起来比较快
2) GXclear/GXset比GXCopy快, GXCopy比GXor和GXxor快
3) XQueryBestSizes: XQueryBestCursor, XQueryBestStipple,XQueryBestTile
4) 几何图形越简单越好, 凸(convex)比凹(non-convex)的好
5) 形状古怪的窗口(shaped window)的expose比较耗资源
6) 用Colormap来实现动画/hight比光栅操作快
7) GC 共享
8) Image vs. Pixmap: 客户端off-screen和服务器端off-screen

服务器特性和限制
Large Pixmap: 很耗内存
Fonts: 耗内存
IPC
X Resource Database:
X Protocol Extensions: MIT-SHM extension能极大提高性能, 它提供使用共享内存版本的XPutImage和XGetImage

CLIENT-SIDE FEATURES AND LIMITATIONS
XBM Bitmap File Format:
XBM文件格式实际就是C语言, 直接把它编译进程序,性能高些.
如果XBM文件很多或者很大, 全部编译进去增加二进制文件大小, 可以这样来减少二进制文件大小: 把所有图象放到一个代码模块

阅读(1664) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~