我游戏中的一个亮点是主精灵的大小减少了。 因此,为了记忆,我不是通过每个帧循环sprite.scale,而是以比原始精灵低的百分比大小重新保存sprite,并且只想替换它。然后一旦“死亡”发生或计时器用完,原始精灵就会返回。
所以,我正在使用这段代码来缩小它:
[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]];
此代码重置为正常:
[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]];
然而,原始图像(在初始化和复位时)看起来都很正常。但是当我将它更改为新的精灵(其尺寸恰好是原始尺寸的75%)时,它会改变它,但只显示新精灵的象限,但是只显示原始尺寸。
我尝试在重新构造精灵之前修改sprite.contentsize,但所做的只是改变了大小,但不会影响图像乱码的问题。
以下是一些视觉示例:
原件:
使用contentSize修改的重新构图图像:
重新纹理化的图像到原始图像,而contentSize没有正确重置(哎呀,但这根本不是问题 - 我只是忘了读大小代码):
PS - 我确实拥有所有精灵的“-hd.png”版本,所以我只想添加任何人想知道的内容(图片和测试到目前为止只在“nonretina”模拟器上)。
谢谢!
编辑:在视网膜模拟器测试过程中也会出现问题。
答案 0 :(得分: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图像。