0

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

事实上,即使是屏蔽代码本身(按照 Ray 的屏蔽教程使用 CCRenderTexture 完成)在选择器代码中也能正常工作。我现在遇到的问题是,一旦我应用了我的遮罩逻辑,我就有了 CCRenderTexture.sprite.texture 并且我需要用这个更新的遮罩纹理更新我的 CCTextureCache 以便将来,任何其他 Sprite 或调用它引用指定的文件名将使用完全准备好的纹理。

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

我知道纹理本身(它们的数据)实际上存储在 OpenGL 中,而不是存储在 Cocos2D 类中;所以我想像删除带有缓存纹理名称(GLuint)的OpenGL纹理,然后将缓存纹理的名称(GLuint)设置为RenderTexture的sprite.texture的名称......但我' m 不知道如何实际实现这一点(opengl 代码、cocos2d 线程安全代码、更改 cctexturecache 的字典等)。

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

4

2 回答 2

0

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

实现所需功能的最简单、最干净+最有效的方法是将name_CCTexture2D 的属性从更改readonlyreadwrite(这是 open gl 纹理 ID)。

然后,我没有做任何花哨的内存管理,而是交换了name_我准备好的渲染纹理和缓存纹理的值。没有对 CCTextureCache 进行任何更改。一旦渲染纹理超出范围,它就会自动释放(现在会破坏原始的、未屏蔽的纹理)并且保留的值是修改后的纹理。

于 2012-04-01T16:37:32.333 回答
0

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

这是从缓存中删除纹理的方法:

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

You can then re-add the texture in any way you see fit, and it will force the cache to reload the texture.

于 2012-04-02T13:03:30.180 回答