SWT的drawImage比较慢,如果你有一些特殊的需要,比如从一张很大的图片中切出一块来,并进行翻转,而后画出,那么就会非常之慢。这种做法在游戏开发中非常常见。我也是在开发游戏地图编辑工具时发现这个问题的。猜想可能最底层的实现上先将整张大图就行了翻转,而后切出部分绘制,所以非常慢。我试着将大图切成小图,对小图进行翻转绘制,结果快了5倍!对于这个问题,我的同事在一个国外论坛上发现一个有趣的帖子,楼主在C#中遇到了和我同样的问题,也用同样的方法解决了。究其原因是C#和SWT Win32版都使用了GDI+的API。我猜想GDI+也许没有考虑到这件事吧。
说到切图,我本来是建立一个空白的图片,然后得到他的GC并将大图上相应部分绘制上去。但SWT的空白图片是不透明的,也就是说所有像素的alpha都不是0. 而若将这个图片的alpha data都设成0,图片又无法绘制上去了。所以此路不通。于是我采用了直接得到大图ImageData中数据的方法。新建一个小图尺寸的ImageData,采用大图的色深度和调试版(直接得到就可以)。然后从大图上读取相应位置的像素和alpha值写入小图的相应位置即可。
虽然这种方法比直接从大图中clip绘制快了很多,但总体上SWT的drawImage还是比较慢的,特别是在比较差的机器上更明显了。所以还需要从其他方面提速,比如AWT-SWT结合,使用OpenGL绑定,甚至通过JNI调用DirectX等。