由于最近也是比较有时间,想着将Windows版本的地图绘制引擎移植到Linux。
地图Render部分采用的是Qt,所以过程非常顺利,用Eclipse+CDT重建工程,略微几个小改动便完成了移植。
但之后发现了Qt带来的问题了,地图绘制引擎支持并发处理多个绘制请求,不同的绘制请求将在不同的线程Thread中被执行,多线程的情况便出现了问题,提示QPixmap不能在非UI线程被构造,如果强行构造,便出现了内存数据访问违例的异常错误,进程直接coredump,这个问题困扰了一些时间;
之后改了改代码,将数据处理和绘制代码隔离开,线程thread中进行数据加载、分析、计算,绘制代码采用Qt的signal/slot机制完成,就是工作线程处理好数据之后通过emit signal将绘制请求发送给ui主线程的slot处理函数。这种实现方法的问题在于绘制工作都将被串行执行,性能下降。
几年前在移植libsvg到wince时采用过cairo( cairographices.org) ,有点使用经验,且cairo是gnome的标准图形库,性能应该不错,所以直接改为cairo。
cairomm是cairo的c++包装,编译还需sig++,cairo的api还是挺丰富的,字体,反走样,矩阵... 操作也是相当简单
很快移植完成,运行效果还是比较满意,现在正考虑地图引擎移植到ios设备,目前需要琢磨cairomm,sig++,pixmap之类的东西如何移植问题(或者直接采用ios的Fundation的绘图api)