В моем приложении-галерее я часто загружаю изображения асинхронно, которые выгружаются в 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 умереть и очиститься автоматически?