获取QPixmap哈希的最佳方法是什么?

Phi*_*ent 5 c++ hash qt caching qpixmap

我正在使用Qt 4.5开发图形应用程序,并将图像放入QPixmapCache中,我想对此进行优化,以便如果用户插入已在缓存中的图像,它将使用该图像。

现在,每个图像都有一个唯一的ID,有助于在绘制事件时优化自身。但是我意识到,如果我可以计算图像的哈希值,则可以查找缓存以查看其是否已存在并使用它(当然,对于重复的对象,它还有更多帮助)。

我的问题是,如果QPixmap较大,则对其进行哈希计算会减慢速度,还是有更快的方法?

Cal*_*itt 3

对此有几点评论:

  1. 如果您要生成像素图的哈希/缓存键,那么您可能需要跳过 QPixmapCache 并直接使用 QCache。这将消除使用 QStrings 作为键的一些开销(除非您还想使用文件路径来定位项目)

  2. 从 Qt4.4 开始,QPixmap 有一个与之关联的“哈希”值(请参阅QPixmap::cacheKey())。该文档声称“不同的 QPixmap 对象只有引用相同的内容才能具有相同的缓存键。” 然而,由于 Qt 使用共享数据复制,这可能仅适用于复制的像素图,而不适用于从同一图像加载的两个不同的像素图。一些测试会告诉你它是否有效,如果有效,它会让你轻松获得哈希值。

  3. 如果您确实想通过删除重复项来实现良好、相当快速的缓存,您可能需要查看自己的数据结构,该数据结构根据大小、颜色深度、图像类型等进行排序。然后,在找到具有相同尺寸、位深度等的相同类型的图像后,您只需要对实际图像数据进行哈希处理。当然,如果您的用户通常打开大量具有相同内容的图像,则不会根本没有帮助。

  4. 性能:不要忘记 Qt 在 4.5 中添加的基准测试工具,它可以让您比较各种哈希想法并查看哪一种运行速度最快。我还没有检查过,但看起来很整洁。