[技术讨论] 桌面应用,那种类似地图的拥有大量元素的软件是怎么实现平滑显示的?

2018-04-03 15:30:02 +08:00
 dychenyi
在做一个 Qt 桌面应用查看芯片电路。输入文件有大量数据,解析下来有几百万的大大小小图形元素,功能有居中显示,框选缩放,也就是随意一选就选中了几十万个图形,当然我设定了策略删选大元素显示。主线程只负责显示和把 item 放进移出 view,几个工作线程负责准备数据,框选内部的,框选外部的,并且也有把画面分割成 xx*xx 份加速等等。现在的问题是还是有点慢,研究了 Qt 的 demo 叫 chip,几万级的元素,直接修改 demo 到几十万级,也会相当卡顿。

地图类应用貌似框选缩放时让用户等待, 并且他是图片,计算好坐标加载地图瓦片就行,不涉及到巨量元素,所以情况又有所不同。有些商业软件能做到并且也是 Qt 开发的(其实公司就是想自己开发,不想买),不知道是不是运用底层的 opengl 绘图函数来加速,还是优化了 Qt 的库来做这件事情?有朋友指点一下吗,感谢大家。
2369 次点击
所在节点    程序员
6 条回复
dreamCatcher
2018-04-03 15:33:59 +08:00
iOS 的地图 app 实现用到了 CATailedLayer 实现了,可以参考一下
dreamCatcher
2018-04-03 15:37:40 +08:00
应该是画面中只有 nXn 个视图,反复利用
dychenyi
2018-04-03 15:40:10 +08:00
@dreamCatcher 感谢回复。
n×n 反复利用是什么意思? 元素是实时变化的啊。比如我框选芯片左下角和右下角的电路,里面的元素完全不一样啊。
dychenyi
2018-04-03 15:42:02 +08:00
@dreamCatcher 哦 你应该说是相同大小的元素,反复利用吧, 画面里面不可能所有元素完全都不一样。
是的。这好像也是做游戏优化画面的一个方法。
mayq0422
2018-04-03 20:28:06 +08:00
楼主的优化方向和地图差不多。但是你说的地图瓦片只是一种。地图并不是只有图片,现在主流地图,不管高德、百度、mapbox 都是矢量图。大体想上去和你的需求很相似了。

当然我不熟悉 Qt。只是按经验来看:本地数据,几百万,还是有很多优化空间的。
比如参考这个: https://github.com/mapbox/geojson-vt
思路是大量的数据(图形),不可能完全精细地显示在屏幕上。毕竟屏幕分辨率就这么大。

楼上说的应该不是按元素优化。要判断出相同的元素,本身也很复杂。而是视野范围内,只需要绘制一定量,一定精度的元素。

另外因为不熟悉 Qt,不知道你的卡顿到底耗费在绘制上还是对象什么的处理。可以预想的优化结果表现之一是:放大到非常大,实际可见元素非常少的时候,很流畅。不知道楼主现在是不是这样?
dychenyi
2018-04-08 09:30:59 +08:00
@mayq0422 对的。 元素少非常流畅。
现在做法是: 简单来说是先获取当前屏幕当前可见区域上的所有元素,然后再按大小排序,得到最大的那几百个元素,然后再显示出来。
可能大体思路就是这样,非常感谢你的例子。 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/443963

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX