나는 UIImage
을 가지고 있으며 파일에 데이터를 저장하고 맵핑 된 파일을 사용하여 메모리를 절약하고 싶습니다. 분명히 UIImage
데이터는 비공개이며 액세스 할 수 없습니다. 그 문제를 해결할 제안이 있습니까?메모리 맵 Uhmage
감사합니다.
나는 UIImage
을 가지고 있으며 파일에 데이터를 저장하고 맵핑 된 파일을 사용하여 메모리를 절약하고 싶습니다. 분명히 UIImage
데이터는 비공개이며 액세스 할 수 없습니다. 그 문제를 해결할 제안이 있습니까?메모리 맵 Uhmage
감사합니다.
인코딩 된 이미지 데이터를 메모리 맵핑하려면 파일을 mmap하고 CGDataProviderRef를 CGImageCreate에 전달하여 데이터에 대한 참조를 제공하십시오. 대신 인코딩 된 소스 데이터, 당신은 CGBitmapContext와 비슷한 할 것
// conform to CGDataProviderReleaseDataCallback
void munmap_wrapper(void *p , const void *cp , size_t l) { munmap(p , l); }
당신이 실제 픽셀 매핑 메모리에 원하는 경우
: munmap_wrapper이 같은 것입니다mapped = mmap(NULL , length , ...);
provider = CGDataProviderCreateWithData(mapped , mapped , length , munmap_wrapper);
image = CGImageCreate(... , provider , ...);
uiimage = [UIImage imageWithCGImage:image];
...
. 이미지가 컨텍스트와 동일한 픽셀을 참조하도록 공급자와 이미지를 만들 수도 있습니다. 컨텍스트에서 그려지는 것이 무엇이든간에 이미지의 내용이됩니다. 너비, 높이, 색 공간 및 기타 매개 변수는 컨텍스트 및 이미지에 대해 동일해야합니다.
이 경우 길이는 적어도 bytes_per_row * height 바이트가되어야 파일은 적어도 그 이상이어야합니다.
기존 이미지가 있고 픽셀을 mmap하고 싶다면 이미지의 크기와 색상 공간으로 비트 맵 컨텍스트를 만들고 CGContextDrawImage를 사용하여 컨텍스트에서 이미지를 그립니다.
이미지 원본을 말하지 않았지만 런타임에 이미지를 만들면 비트 맵 컨텍스트에서 직접 만드는 것이 더 효율적입니다. 모든 이미지를 만들려면 장면 뒤에 비트 맵 컨텍스트가 있어야하므로 처음부터 매핑 된 메모리가 될 수도 있습니다.
위대한 답변을 주셔서 감사합니다! 나는 그것을 들여다 볼 것이다. 나는 메모리 맵핑에 익숙하지 않지만 내 메모리 사용량을 줄이는 방법을 찾고 있었다. 예,이 비트 맵을 조작 한 다음 CGDataProviderRef 및 CGImageCreate를 사용하여 UIImage로 변환하므로 비트 맵에 액세스 할 수 있습니다. 그래서 나는 CGDataProviderRef에 메모리 매핑 된 데이터를 제공함으로써이 시점에서 메모리 매핑을 할 수 있다고 생각한다. – Kamchatka
파일에 신경 쓰지 않으면'MAP_ANON'을 시도 할 수 있습니다. 그걸로 mmap을 malloc과 거의 비슷하게 처리 할 수 있습니다. – drawnonward
파일을 지정하지 않고 MAP_ANON을 사용할 수 있습니까? 만약 mmap을하고 mmap과 같은 크기의 데이터를 memcpy하려고하면 EXC_BAD_ACCESS를 얻습니다. – Kamchatka