0

我的游戏中的一个强化道具是主要精灵的尺寸减小。因此,为了记忆起见,我没有在每一帧循环 sprite.scale,而是以低于原始 sprite 的百分比大小重新保存了 sprite,并且只想替换它。然后一旦“死亡”发生或计时器用完,原始精灵就会返回。

因此,我正在使用此代码使其变小:

[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]];

并且此代码用于重置为正常:

[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]];

但是,原始图像(在初始化和重置时)看起来很正常。但是当我将它更改为新精灵(其尺寸正好是原始精灵的 75%)时,它会改变它,但只显示新精灵的一个象限,但具有原始尺寸。

我尝试在重新纹理精灵之前修改 sprite.contentsize,但所做的只是改变大小,但不会影响图像混乱的问题。

以下是一些视觉示例:

原来的:

原来的


带有 contentSize 修改的重新纹理化图像:

具有 contentSize 修改的重新纹理化图像


将图像重新纹理化为原始图像,其中 contentSize 未正确重置(哎呀,但这根本不是问题 - 我只是忘记读取尺寸代码):

将图像重新设置为原始图像,而 contentSize 未正确重置(哎呀,但这根本不是问题 - 我只是忘记读取尺寸代码):

PS——我的所有精灵都有“-hd.png”版本,所以我只想补充一点,以防有人想知道(到目前为止,图像和测试只在“nonretina”模拟器上进行)。

谢谢你!


编辑:在视网膜模拟器上进行测试时也会出现问题。

4

1 回答 1

2

由于您主要关心的是内存,我建议简单地使用纹理图集。

我将您的原始图像复制到图像编辑程序中,以查看其尺寸。图像大小为 73x71 像素,这意味着它作为尺寸为 128x128 的纹理存储在内存中,因为纹理将具有二维的幂。这将使纹理占用 64 KB 的内存(假设为 32 位颜色深度)。使用纹理图集,您将能够更紧密地打包纹理,并且可以使用CCSprite setDisplayFrame方法更轻松地更改显示的帧。

此外,您正在使用纹理缓存:

[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]
[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]

除非您明确释放该纹理的内存,否则两个纹理都将保留在内存中。如果您确实释放了您当前不使用的纹理的内存,并经常交换这些纹理,您的游戏将花费大量时间释放内存并从设备的闪存重新加载图像 - 即使图像相对较小.

如果有多个精灵使用任一纹理,则尝试卸载/重新加载纹理没有任何意义,因为会出现两个或多个精灵将使用任一纹理的情况。

最后,我们最多讨论 64 KB 的内存。如果您担心内存使用和性能,您应该做的是加载 PVR 纹理,这只是内存和磁盘上 PNG 文件大小的一小部分(但会失去一些色彩活力)。

查看TexturePacker以创建纹理图集和 PVR 图像。

于 2011-11-24T11:04:37.187 回答