我已经阅读了有关它们的文档,但仍不清楚实际的区别是什么。 docsItemCoordinateCache的状态为:


为项目的逻辑(本地)坐标系启用了缓存。


而对于QGraphicsItem :: DeviceCoordinateCache:


在绘画设备级别的设备坐标中启用了缓存。此模式适用于可以移动但不能旋转,缩放或剪切的项目。


这并没有为我解决问题。好的,因此DeviceCoordinateCache不能用于旋转,缩放或剪切,它使用“设备坐标”。

但这到底是什么意思?屏幕外有一个缓冲区,我假设对于本地坐标,缓冲区中填充了该项目的缓存图像,然后像QGraphicsPixmapItem一样工作,并且将诸如不透明度和转换矩阵之类的任何效果应用于该缓冲区。我认为问题在于这会栅格化项目的图像,因此这就是文档警告其像素不完美的原因。

但是,它如何与DeviceCoordinateCache一起使用?是先旋转,剪切和缩放项目,然后在屏幕外的像素图上对其进行绘制,还是在像素图上将其渲染为相同但不应用任何转换?

编辑:我也尝试将DeviceCoordinateCache设置为旋转和缩放的项目,即使我调整大小也能完美显示,所以我不明白为什么文档说它不应该与缩放,旋转或剪切的项目一起使用。

最佳答案

ItemCoordinateCache


屏幕外有一个缓冲区,我假设是本地坐标
缓冲区中充满了项目的缓存图像,然后像
QGraphicsPixmapItem和任何效果,例如不透明度和
将变换矩阵应用于它。我认为问题是
光栅化项目的图像,这就是为什么文档警告它不会
完美像素。


没错缓存以您通过setCacheMode()指定的选择的质量存储在内存中。随后的转换不会使高速缓存无效,而是将对其进行重用,这就是质量可能会下降的原因。如果它恶化得太多,则可以通过再次使用更大的setCacheMode()来使缓存无效。



DeviceCoordinateCache


但是,它如何与DeviceCoordinateCache一起使用?是第一项
旋转,剪切和缩放,然后绘制在屏幕外的像素图上


同样,您做对了:应用转换,然后将结果直接缓存在设备内存中。缓存始终以最高质量执行。除了移动以外,任何其他新的转换都会使缓存失效,这将我们带到了最后一句话:


我也尝试将DeviceCoordinateCache设置为旋转和缩放
项目,即使我调整大小也能完美显示,所以我不
了解为什么文档说不应将其与缩放,旋转
或剪切的物品。


除移动以外的任何新转换都会使缓存无效。它仍然可以工作,并且始终可以完美显示,但是效率不高:每次调整大小时都会强制使用新的缓存。



TL; DR

如果您不一直变换项目,请使用DeviceCoordinateCache。如果这样做,请使用ItemCoordinateCache或根本不使用任何缓存。


使用DeviceCoordinateCache,缓存将始终是像素完美的,但每次转换都将使其无效。
使用ItemCoordinateCache,缓存不会因每次转换而无效,但结果将不是像素完美的。

09-15 14:13