3条回答 默认 最新
- tylerzhangdi 2018-04-09 02:31关注
每个Score都放在父容器ScoreView里,ScoreView 就是MDI程序中的一个文档窗口,系统绘制要求,或Qt的update(),updateAll()等都可以导致ScoreView::paintEvent(QPaintEvent* ev)被调用。在ScoreView::paintEvent(QPaintEvent* ev)里得到更新区域QRegion,它由一组QRect组成,对每一个QRect,得到一个对应的元素列表,然后绘制每一个元素Element。
这里有一个关键的数据结构BspTree,用于快速的从屏幕坐标查找到Element。
BspTree全名叫二叉空间分割树,是游戏开发中常用的数据结构。一棵层高为 n 的bsptree树可以容纳2^n个节点,其中只有叶子节点放的是真正的元素(Element),所以能容纳2^(n-1)个元素(Element)。所有父节点都做辅助作用,父节点对应一块所有子元素组成的区域,在查找时,判断point或rect是否在父节点的区域内,如果在,则到子树里去找,这样查找一个元素需要的平均时间为 n 次比较。该树在排版时建立,后面只要数据没变,树就固定,因此大大加快了元素定位的速度,是MuseScore程序运行飞快的主要功臣。关于bsptree,可以到这里玩一下:http://www.symbolcraft.com/graphics/bsp/index.php
看概念看的头晕,玩了这个才明白点了。mscore的空间分割没这么复杂,就是横一刀竖一刀的切成了一堆方块。MuseScore的大量操作依赖bsptree的定位能力,鼠标操作,包括select,drag & drop等大量编辑操作,都是已知屏幕坐标位置,查找对应Element,再执行 Element 的相关函数。解决 无用评论 打赏 举报
悬赏问题
- ¥20 idea运行测试代码报错问题
- ¥15 网络监控:网络故障告警通知
- ¥15 django项目运行报编码错误
- ¥15 请问这个是什么意思?
- ¥15 STM32驱动继电器
- ¥15 Windows server update services
- ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
- ¥15 模糊pid与pid仿真结果几乎一样
- ¥15 java的GUI的运用
- ¥15 我想付费需要AKM公司DSP开发资料及相关开发。