iOS和Cocos2d-更改CCSprite';s映像和新维度=失败

iOS和Cocos2d-更改CCSprite';s映像和新维度=失败,ios,cocos2d-iphone,openfeint,Ios,Cocos2d Iphone,Openfeint,在我的游戏中的一个增强是主精灵的尺寸减小。 因此,为了内存起见,我没有在每一帧中循环一个sprite.scale,而是以低于原始sprite的百分比大小重新保存了该sprite,并且只希望替换它。然后,一旦“死亡”发生或计时器耗尽,原始精灵就会返回 因此,我使用此代码使其变小: [player setTexture:[[CCTextureCache sharedTextureCache]addImage:@“player small.png”] 此代码用于重置为正常值: [player setT

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

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

[player setTexture:[[CCTextureCache sharedTextureCache]addImage:@“player small.png”]

此代码用于重置为正常值:

[player setTexture:[[CCTextureCache sharedTextureCache]添加图像:@“player orig.png”]

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

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

以下是一些可视示例:

原件:


使用contentSize修改重新构建的图像:


将图像重新构建到原始图像,但contentSize未正确重置(哎呀,但这根本不是问题-我只是忘记读取大小代码):

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

谢谢大家!



编辑:问题也发生在视网膜模拟器的测试过程中。

由于您主要关心的是记忆,我建议您只使用纹理图谱

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

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

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

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

最后,我们讨论的是最多64 KB的内存。如果您担心内存使用和性能,那么您应该改为加载PVR纹理,它在内存和磁盘上都是PNG文件大小的一小部分(但会丢失一些颜色活力)


看看如何创建纹理地图集和PVR图像。

我想出了一个解决方法:p
[[balls objectAtIndex:I]setDisplayFrame:[CCSpriteFrameWithTexture:[[CCSprite spriteWithFile:@“ball small.png”]纹理]rect:CGRectMake(0,0,53,53)]