V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dychenyi
V2EX  ›  程序员

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

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

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

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

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

    另外因为不熟悉 Qt,不知道你的卡顿到底耗费在绘制上还是对象什么的处理。可以预想的优化结果表现之一是:放大到非常大,实际可见元素非常少的时候,很流畅。不知道楼主现在是不是这样?
    dychenyi
        6
    dychenyi  
    OP
       2018-04-08 09:30:59 +08:00
    @mayq0422 对的。 元素少非常流畅。
    现在做法是: 简单来说是先获取当前屏幕当前可见区域上的所有元素,然后再按大小排序,得到最大的那几百个元素,然后再显示出来。
    可能大体思路就是这样,非常感谢你的例子。 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.