iOS和Cocos2d – 更改CCSprite的图像和新维度= FAIL

在我的游戏中的一个通电是主精灵的大小减less。 所以为了记忆的缘故,我没有在每帧中循环一个sprite.scale,而是将sprite重新保存在比原始sprite低百分比的大小上,只是想replace它。 然后一旦“死亡”发生或计时器用完,原始精灵返回。

所以,我使用这个代码来使它变小:

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

而这个代码重置为正常:

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

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

我重新修改了sprite之前,我尝试过修改sprite.contentsize,但是所做的只是改变了大小,但并没有影响图像混乱的问题。

这里有一些视觉例子:

原版的:

原版的


带有contentSize修改的重新映射的图像:

带有contentSize修改的重新映射的图像


将contentSize重新设置为原始图像的内容不正确(哎呀,但这不是一个问题 – 我只是忘了读大小码):

内容大小不正确地重置图像到原始图像(哎呀,但这根本不是问题 - 我只是忘了读大小码):

PS – 我有我的所有精灵的“-hd.png”版本,所以我只是想添加任何人想知道(到目前为止的图像和testing只有在“nonretina”模拟器)。

谢谢!


编辑:问题也出现在视网膜模拟器上的testing。

由于你主要关心的是内存,我build议只使用纹理图集。

我将原始图像复制到图像编辑程序中,查看它的尺寸。 该图像的尺寸为73×71像素,这意味着它将作为尺寸为128×128的纹理存储在内存中,因为纹理将具有二维的权力。 这将使纹理使用64 KB的内存(假设32位颜色深度)。 使用纹理图集,您可以更紧密地打包纹理,并且可以使用CCSprite setDisplayFrame方法更容易地更改显示的框架。

此外,您正在使用纹理caching:

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

除非你明确地释放了纹理的内存,否则两个纹理都将保留在内存中。 如果你释放了目前没有使用的纹理内存,并经常交换这些纹理,那么你的游戏将花费大量的时间释放内存并从设备的闪存中重新加载图像 – 即使图像相对较小。

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

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

查看TexturePacker来创build纹理地图和PVR图像。