2012-04-01 1 views
0

내 갤러리 앱에서 비동기 적으로 이미지를 자주로드합니다.이 이미지는 파일 이름이 참조하는 CCTextureCache에 덤프됩니다. 문제는, 텍스처를 가릴 필요가 있습니다.이 마스킹은 실제로 한 번만 수행하면되고, 이상적으로는 넣어 두는 가장 좋은 장소는 addImageAsync이 호출하는 선택기에 있다고 생각했습니다. 특정 텍스처가 이미 가려져 있는지 여부를 알려주는 부울 변수를 추가하여 CCTexture를 수정해야했습니다.이 텍스처는 매우 잘 작동합니다.CCTextureCache 텍스처 데이터 업데이트

실제로 마스킹 코드 자체 (Ray의 마스킹 자습서에 따라 CCRenderTexture를 사용하여 완성 됨)도 선택 코드에서 잘 작동합니다. 지금 가지고있는 문제는 마스크 로직을 적용한 후에 CCRenderTexture.sprite.texture가 생겼고이 마스크 된 텍스처로 CCTextureCache를 업데이트해야 이후에 다른 Sprite 또는 호출 지정된 파일 이름을 참조하면 완전히 준비된 텍스처가 사용됩니다.

어떻게 CCTextureCache에서 텍스처 데이터를 업데이트 할 수 있습니까? 또는 더 구체적으로, 기존의 캐시 된 텍스처를 렌더 텍스처에 저장된 텍스처로 대체하려면 어떻게해야합니까?

텍스처 자체는 실제로 데이터가 Cocos2D 클래스가 아닌 OpenGL에 저장된다는 것을 알고 있습니다. 그래서 캐시 된 텍스처의 이름 (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

문제는 - 기존 텍스처를 절차 적으로 업데이트 할 수 있어야했습니다. 디스크에서로드 된 텍스처가 불완전하고 일부 작업을 수행해야했습니다. 이러한 작업이 완료된 후에 변경 사항을 동일한/원래 키를 사용하여 텍스처 캐시로 다시 가져와야했습니다. 나는 현재 이미지를 파일에 쓰고 다시로드하지 않고 텍스쳐 캐시에 텍스처를 삽입 (업데이트)하는 내장 된 메소드가 있다고 생각하지 않는다.그 여분의 쓰기 지연으로 인해 내 프로그램이 죽었을 것입니다. –

0

나는 조금 더 시간이 주위에 파고를 보냈다. 그것은 내가 빨리이 마련되지 않은 정말 꽤 당황 ... 나는이 대답이 같은 문제를 다른 사람들에게 도움이되기를 바랍니다.

간단한, CCTexture2D의 name_ 속성을 readonly에서 readwrite으로 변경하는 것이 가장 바람직한 가장 효율적인 방법입니다. (이것은 열린 gl 텍스처 ID입니다).

그런 다음 멋진 메모리 관리를 수행하는 대신 내 준비된 렌더링 텍스처와 캐싱 된 텍스처의 값을 name_으로 바꿨습니다. CCTextureCache는 변경되지 않았습니다. 렌더 텍스처가 범위를 벗어나면 자동 렌더링 (원래는 마스크되지 않은 텍스처가 삭제됨)되고 유지 된 값은 수정 된 텍스처입니다.

관련 문제