您的位置:首页 > 其它

XWindow的程序性能及改善

2016-10-08 16:55 323 查看
http://blog.163.com/hbu_lijian/blog/static/1261291532012429104043353/

XWindow系统应用程序性能

应用程序遇到的与XWindow相关的性能问题:

1) 画图/刷新速度. 有些应用程序需要在屏幕上绘画大量图形.

2) 响应用户输入. 能在期待的时间能内做出响应

3) 应用程序启动/初始化. 包含大量窗体的程序启动可能会比较慢.

4) 客户端-服务器通信.

5) CPU使用. 如果X[/b] Client和X[/b] Server运行在不同CPU上, 那么CPU的使用应该分别考虑.

6) 内存使用

7) 图形和磁盘I/O

一般从以下几个方面着手解决XWindow应用程序性能问题

1) XLib请求和应答

2) X[/b] Event

3) 图形

4) 服务器端特性(feature)和约束(limitation)

5) 客户端特性(feature)和约束(limitation)

6) 内存

设计指导原则

1) 交互式程序最好使用事件驱动机制,而不是循环机制

2) 避免清空X[/b] Request Buffer; 或者在不必要情况下以同步方式运行X[/b]协议. Xwindow内置的缓冲机制非常高效.

3) 如果使用X[/b] 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[/b] Toolkit被设计成尽可能少的使用roundtrip请求. 例如, X[/b] Client启动连接X[/b] Server后会分配若干资源id; 类似于XCreateWindow的函数只是从这之中取一个id, 而不必发出一个roundtrip请求.

Xlib batch request(批量请求)

Xlib提供若干函数来执行单个操作和相应的批量操作, 例如XDrawPoint和XDrawPoints, XStoreColor和XStoreColors, 尽量使用批量操作.

有一个例外: XChangeGC和XSeet*GC速度一样, 因为两者都要写Xlib GC cache.

X[/b] 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[/b] Resource Database:
X[/b] Protocol Extensions: MIT-SHM extension能极大提高性能, 它提供使用共享内存版本的XPutImage和XGetImage

CLIENT-SIDE FEATURES AND LIMITATIONS

XBM Bitmap File Format:

XBM文件格式实际就是C语言, 直接把它编译进程序,性能高些.

如果XBM文件很多或者很大, 全部编译进去增加二进制文件大小, 可以这样来减少二进制文件大小: 把所有图象放到一个代码模块


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

阅读(703) | 评论(0) | 转发(0) |

0
上一篇:注释代码定位bug

下一篇:X window的CTRL+ALT+BACKSPACE无效

相关热门文章
socket中的短连接与长连接,心...

Haproxy、Keepalived双主高可...

Tomcat的性能与最大并发(1000)...

Nginx深入详解之日志

socket编程的同步、异步与阻塞...

linux dhcp peizhi roc

关于Unix文件的软链接

求教这个命令什么意思,我是新...

sed -e "/grep/d" 是什么意思...

谁能够帮我解决LINUX 2.6 10...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: