sas*_*alm 3 qt caching transform qgraphicsitem qgraphicsscene
我已经阅读了关于它们的文档,但我仍然不清楚实际的区别是什么。ItemCoordinateCache 的文档说明:
为项目的逻辑(本地)坐标系启用缓存。
而对于 QGraphicsItem::DeviceCoordinateCache:
缓存在设备坐标的绘制设备级别启用。此模式适用于可以移动但不能旋转、缩放或剪切的项目。
这并没有为我澄清事情。好的,所以 DeviceCoordinateCache 不能用于旋转、缩放或剪切,它使用“设备坐标”。
但这究竟是什么意思?有一个离屏缓冲区,我假设对于本地坐标,缓冲区填充了项目的缓存图像,然后像 QGraphicsPixmapItem 一样起作用,并且对它应用了诸如不透明度和变换矩阵之类的任何效果。我认为问题在于这会光栅化项目的图像,因此文档警告说它不会是像素完美的。
但是它如何与 DeviceCoordinateCache 一起工作?项目是先旋转、剪切和缩放,然后在屏幕外像素图上绘制,还是在像素图上呈现相同但不应用任何转换?
编辑:我还尝试将 DeviceCoordinateCache 设置为旋转和缩放的项目,即使我调整它的大小,它也能完美显示,所以我不明白为什么文档说它不应该与缩放、旋转或剪切的项目一起使用。
有一个离屏缓冲区,我假设对于本地坐标,缓冲区填充了项目的缓存图像,然后像 QGraphicsPixmapItem 一样起作用,并且对它应用了诸如不透明度和变换矩阵之类的任何效果。我认为问题在于这会光栅化项目的图像,因此文档警告说它不会是像素完美的。
没错。缓存以您使用setCacheMode()指定的选择质量存储在内存中。后续转换不会使缓存失效,它会被重用,这就是质量会下降的原因。如果它恶化太多,您可以通过再次使用更大的大小调用setCacheMode()来使缓存无效。
但是它如何与 DeviceCoordinateCache 一起工作?项目是否先旋转、剪切和缩放,然后在屏幕外像素图上绘制
同样,您做对了:应用转换,然后将结果直接缓存在设备内存中。缓存始终以最高质量执行。但是,除移动之外的任何新转换都会使缓存无效,这使我们回到您的最后一句话:
我还尝试将 DeviceCoordinateCache 设置为旋转和缩放的项目,即使我调整它的大小,它也能完美显示,所以我不明白为什么文档说它不应该用于缩放、旋转或剪切的项目。
除了移动之外的任何新转换都会使缓存无效。它仍然有效,并且始终可以完美显示,但效率不高:每次调整大小时都会强制使用新缓存。
如果您不一直转换您的项目,请使用DeviceCoordinateCache。如果这样做,请使用ItemCoordinateCache或根本不使用任何缓存。
| 归档时间: |
|
| 查看次数: |
746 次 |
| 最近记录: |