뭔가 제목이 어렵다고 느껴집니다만. 일단 한줄 요약이긴 합니다.
환경은 BCB6 ent입니다.
바이너리 데이터를 받아서 TBitmap으로 변환하고
TBitmap을 TJPEGImage->Assign(TBitmap)으로 변환한뒤
TBitmap을 지운후 TJPEGImage만 TList에 집어넣고 있습니다.
문제는 영상과 관련되 프로그램이라 지정된 한계까지 이미지를 넣는데
대략 이미지(640x480@24) 800장 정도가 리스트에 올라가면 프로그램이 1기가 가량의 메모리를 먹으면서
'나 메모리 없소' 하면서 에러를 내뿜어 냅니다.
대략 이미지당 1메가 가량을 먹는것으로 보이는데
아마 추측으로는 TJPEGImage클레스가 비트맵 데이터도 같이 가지고 있는것으로 보입니다.
혹시 Assign한 비트맵 영역을 지우는 방법이라던지 해결법을 알고 싶습니다.
이하 관련된 의사코드입니다.
Graphics::TBitmap *bitmap = new Graphics::TBitmap();
TJPEGImage *jpg = new TJPEGImage();
this->raw2bmp(bitmap, ...);
jpg->Assign(bitmap);
jpg->CompressionQuality = 80;
jpg->PixelFormat = jf24Bit;
jpg->Compress();
delete bitmap;
if(...){
jpg_list->Add(jpg);
}else{
jpg_list->add(jpg);
TJPEGImage *jpg_for_del = (TJPEGImage *)jpg_list->Items[0];
delete jpg_for_del;
}
이미지 크기를 줄이면 더 저장되는걸 봐선... Tlist문제인것 같지도 않고
만약 메모리 에러나기 전에 지정한 한계상황이 되서 이미 리스트에 저장됬던 TJPEGImage클래스를 지우기 시작하면
메모리가 크게 증가하는 경우는 없는것 같습니다.
|