Обновить данные текстуры CCTextureCache - PullRequest
0 голосов
/ 01 апреля 2012

В моем приложении-галерее я часто загружаю изображения асинхронно, которые выгружаются в CCTextureCache, на который ссылается их имя файла.Дело в том, что мне нужно замаскировать свои текстуры - и эту маскировку действительно нужно выполнить только один раз, поэтому в идеале я решил, что лучшее место для ее размещения - селектор, который вызывает addImageAsync.Мне пришлось изменить CCTexture, добавив логическую переменную, которая уведомляет меня, если конкретная текстура уже была замаскирована или нет, и это работает очень хорошо.

На самом деле, даже сам код маскирования (который выполняется с использованиемCCRenderTexture, следуя инструкциям Ray по маскированию), также хорошо работает внутри кода селектораПроблема, с которой я сейчас сталкиваюсь, заключается в том, что после применения логики маски у меня есть CCRenderTexture.sprite.texture, и мне нужно обновить CCTextureCache с помощью этой обновленной маскированной текстуры, чтобы в будущем любой другой Sprite или вызов этогоссылки на указанное имя файла будут использовать полностью подготовленную текстуру.

Как я могу обновить данные текстуры в CCTextureCache?Или, более конкретно, как я могу заменить существующую кэшированную текстуру той, которая хранится в моей текстуре рендеринга?

Я знаю, что сами текстуры (их данные) на самом деле хранятся в OpenGL, а не в классах Cocos2D;поэтому я хотел бы представить что-то вроде удаления текстуры OpenGL с именем (GLuint) из кэшированной текстуры, а затем присвоение имени кэшированной текстуры (GLuint) имени sprite.texture в RenderTexture ... но яЯ не знаю, как на самом деле выполнить это (код opengl, код потока Cocos2d, изменение словаря cctexturecache и т. д.).

Или, возможно, есть более простой способ сделать это без изменения Cocos2D (например, использовать opengl для замены текстуры, на которую ссылается кэш текстуры, на текстуру рендеринга текстуры, а затем позволить локальной переменной RT умереть и очиститься автоматически?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Как я могу обновить данные текстуры в CCTextureCache?

Вот как вы удаляете текстуру из кэша:

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

Затем вы можете повторно добавить текстуру любым удобным для вас способом, и это заставит кеш перезагрузить текстуру.

0 голосов
/ 01 апреля 2012

Я потратил немного больше времени, возни с этим. Это действительно довольно неловко, я не придумал это раньше ... Я надеюсь, что этот ответ поможет другим людям с той же проблемой.

Простейшим, самым чистым и наиболее эффективным способом достижения желаемой функциональности было изменение свойства name_ в CCTexture2D с readonly на readwrite (это идентификатор текстуры open gl).

Затем, вместо того, чтобы заняться каким-либо необычным управлением памятью, я просто поменял значения name_ моей подготовленной текстуры рендеринга и кэшированной текстуры. В CCTextureCache не было внесено никаких изменений. Как только текст рендеринга выходит из области видимости, он автоматически освобождается (что теперь уничтожает исходную немаскированную текстуру), и сохраняемое значение является измененной текстурой.

...