我有一个水平的图像精灵。例如:
所有图像都具有相同的宽度和高度。我已将其存储在我的资源文件中,并通过 define 在我的应用程序中声明:
#define SPRITE QImage(":/sprite.png")
因此,在我的应用程序中,我需要多次使用4张图像。为了做到这一点,我实现了这个函数,它在精灵中的 n 位置检索图像。
QImage getNthImageFromSprite(int n, QImage sprite)
{
int size = sprite.height();
return sprite.copy((n - 1) * size, 0, size, size);
}
然后,我宣布了一个通用的枚举,将名字放在这个位置上:
enum eImage
{
eImage_black = 1,
eImage_red,
eImage_orange,
eImage_green
}
最后,我在我的应用程序中的任何地方使用的功能:
QImage getSpriteImage(eImage img)
{
return getNthImageFromSprite(img, SPRITE);
}
效果很好。
但我的印象是这不是很好,因为我每次想要获得特定图像时都会调用QImage
的构造函数。知道精灵可以包含+40个图像并且我需要多次这些图像,我应该在第一次调用图像时缓存图像,还是我这样做的方式是好的?
注意:出于各种原因我需要QImage,但是可以与QPixmap进行比较。
答案 0 :(得分:2)
用对象替换define:
static QImage SPRITE(":/sprite.png");
它将在启动时初始化一次。
你甚至可以把它放在方法中:
QImage getSpriteImage(eImage img)
{
static QImage SPRITE(":/sprite.png");
return getNthImageFromSprite(img, SPRITE);
}
在这种情况下,它会在首次使用时初始化。
然后,您每次拨打getNthSpriteImage
时都会创建新对象。您可以使用本地静态缓存重用已返回的对象:
QImage getNthSpriteImage(int n, QImage img) {
static QMap<int, QImage> cache;
if (!cache.contains(n)) {
int size = sprite.height();
cache[n] = sprite.copy((n - 1) * size, 0, size, size);
}
return cache[n];
}
至于QImage / QPixmap的区别,这是主要区别:
QImage专为I / O设计和优化,适用于直接像素访问和操作,而QPixmap专为在屏幕上显示图像而设计和优化。
因此,如果您不想要特殊的图像格式(RGBA,预乘RGBA,索引,...)或使用直接像素操作,我建议您使用QPixmap。