Caching 更新CCTextureCache纹理数据

Caching 更新CCTextureCache纹理数据,caching,opengl-es,cocos2d-iphone,render-to-texture,Caching,Opengl Es,Cocos2d Iphone,Render To Texture,在我的gallery应用程序中,我经常异步加载图像,这些图像被转储到文件名引用的CCTextureCache中。问题是,我需要遮罩我的纹理——而这种遮罩实际上只需要做一次,所以理想情况下,我认为最好将其放置在addImageAsync调用的选择器中。我必须通过添加一个布尔变量来修改CCTexture,该变量会通知我特定纹理是否已被遮罩,并且效果非常好 事实上,甚至掩蔽代码本身(在Ray的掩蔽教程之后使用CCRenderTexture完成)在选择器代码中也能很好地工作。我现在遇到的问题是,一旦我应

在我的gallery应用程序中,我经常异步加载图像,这些图像被转储到文件名引用的CCTextureCache中。问题是,我需要遮罩我的纹理——而这种遮罩实际上只需要做一次,所以理想情况下,我认为最好将其放置在
addImageAsync
调用的选择器中。我必须通过添加一个布尔变量来修改CCTexture,该变量会通知我特定纹理是否已被遮罩,并且效果非常好

事实上,甚至掩蔽代码本身(在Ray的掩蔽教程之后使用CCRenderTexture完成)在选择器代码中也能很好地工作。我现在遇到的问题是,一旦我应用了掩码逻辑,我就有了CCRenderTexture.sprite.texture,我需要用这个更新的掩码纹理更新我的CCTextureCache,这样将来,任何引用指定文件名的其他sprite或调用都将使用完全准备好的纹理

如何更新CCTextureCache中的纹理数据?或者更具体地说,如何用存储在渲染纹理中的纹理替换现有的缓存纹理

我知道纹理本身(它们的数据)实际上存储在OpenGL中,而不是Cocos2D类中;因此,我可以想象这样的情况:删除带有缓存纹理名称(GLuint)的OpenGL纹理,然后将缓存纹理的名称(GLuint)设置为RenderTexture的sprite.texture的名称。。。但我不知道如何真正做到这一点(opengl代码、cocos2d线程安全代码、修改cctexturecache的字典等等)


或者,也许有一种更简单的方法可以在不改变Cocos2D的情况下实现它(例如,利用opengl将纹理缓存引用的纹理替换为渲染纹理的纹理,然后让局部RT变量消亡并自动清理?

我花了更多的时间来研究这个问题。真的很尴尬,我没有早点想到这个问题……我希望这个答案能帮助其他人解决这个问题。)同样的问题

实现所需功能的最简单、最干净、最有效的方法是将CCTexture2D的
name
属性从
readonly
更改为
readwrite
(这是open gl纹理id)

然后,我没有进行任何奇特的内存管理,而是交换了我准备好的渲染纹理和缓存纹理的
name
值。没有对CCTextureCache进行任何更改。一旦rendertexture超出范围,它就会自动删除(现在会破坏原始的未屏蔽纹理)保留的值是修改后的纹理

如何更新CCTextureCache中的纹理数据

以下是如何从缓存中删除纹理:

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

然后,您可以以任何您认为合适的方式重新添加纹理,这将强制缓存重新加载纹理。

问题是-我需要能够用程序更新现有纹理;从磁盘加载的纹理不完整,仍然需要对其执行某些操作。这些操作完成后,我需要使用相同的/原始的密钥将更改转储回纹理缓存。我认为目前没有内置的方法可以在不首先将图像写入文件并重新加载的情况下将纹理插入(更新)纹理缓存。这些额外的写入延迟会杀死我的程序。