2012-04-01 70 views
0

在我的图库应用程序中,我经常异步加载图像,这些图像被转储到由其文件名引用的CCTextureCache中。事情是,我需要掩饰我的纹理 - 而这种掩饰只需要做一次,所以理想的情况下,我认为最好的地方是将它放在addImageAsync所调用的选择器中。我必须通过添加一个布尔变量来修改CCTexture,这个布尔变量通知我特定的纹理是否已被遮罩,并且工作得很好。更新CCTextureCache纹理数据

事实上,即使是屏蔽代码本身(在Ray的屏蔽教程之后使用CCRenderTexture完成)也适用于选择器代码。我现在遇到的问题是,一旦我应用了我的掩码逻辑,我就拥有了CCRenderTexture.sprite.texture,并且需要使用此更新过的蒙版纹理来更新我的CCTextureCache,以便将来可以使用任何其他Sprite或调用引用指定的文件名将使用完全准备好的纹理。

如何更新CCTextureCache中的纹理数据?或者更具体地说,我如何用存储在我的渲染纹理中的纹理替换现有的缓存纹理?我知道纹理本身(它们的数据)实际上存储在OpenGL中,而不是存储在Cocos2D类中;所以我想象一下沿缓存纹理的名称(GLuint)去除OpenGL纹理,然后将缓存纹理的名称(GLuint)设置为RenderTexture的sprite.texture的名称,如何去实际完成(opengl代码,cocos2d线程安全代码,更改cctexturecache的字典等)。或者也许有一种更简单的方法可以在不改变Cocos2D的情况下(例如,利用opengl将纹理缓存引用的纹理替换为渲染纹理的纹理,然后让本地RT变量自动清理并自动清理?

回答

0

如何更新CCTextureCache中的纹理数据?

这是你如何从缓存中删除纹理:

CCTextureCache* cache = [CCTextureCache sharedTextureCache]; 
[cache removeTexture:tex]; 
// or: 
[cache removeTextureForKey:@"someimage.png"]; 

然后,您可以在您认为合适的任何方式重新添加纹理,它会强制高速缓存重新加载纹理。

+0

事情是 - 我需要能够用程序更新现有的纹理;从磁盘加载的纹理不完整,有些操作仍需要完成。这些操作完成后,我需要使用相同/原始密钥将更改转储回纹理缓存。我不认为目前有一种内置方法可以将纹理插入(更新)到纹理缓存中,而无需先将图像写入文件并将其重新载入。那些额外的写入延迟会导致我的程序中断。 – 2012-04-02 13:58:39

0

我花更多的时间闲逛这一点。这真的很尴尬我也没有想出这个快...我希望这个答案可以帮助其他人同样的问题。

最简单的,最干净+实现所需功能的最有效方式是将CCTexture2D的name_属性从readonly更改为readwrite (这是打开的gl纹理id)。

然后,我没有做任何奇特的内存管理,而是将我准备好的渲染纹理和缓存纹理的值更改为name_。对CCTextureCache没有任何改动。一旦Rendertexture超出范围,它就会自动释放(现在破坏原始的,未遮罩的纹理),保留的值是修改后的纹理。