Work/PSP

[SUD_Project] 대용량 파일 지원과 막강한 로딩 속도

kevin. 2007. 5. 18. 23:34

01234


안녕하세요? CK_ONE 입니다.

봄틀의 고질적인 문제를 집어보면 대용량 mp3의 미지원, 대용량 txt의 미지원 등....

큰 파일에 약한 모습을 보였습니다.

그 이유는 malloc(메모리 할당)을 무식하게 한방에 처리하기 때문입니다.

메모리 할당에 실패하게 되면 프로그램이 비정상 종료되거나 이상 동작하게 됩니다.

이것을 해결하기 위해서는 우선 mp3 쪽의 메모리 사용을 조절해야 합니다.

mp3에서 일정량의 버퍼만을 할당한 뒤 해당 버퍼만을 사용하여 채우고 비우고를 반복하게 하여

많은 메모리를 사용하지 않더라도 버퍼 만큼의 메모리만 확보하면 어떤 파일도 재생할 수 있게 하는 것입니다.

비슷한 원리로 텍스트 뷰어도 구현이 가능하지만 문제는 최초에 페이지 수 를 계산해야 한다는 것이고

페이지 간 이동 시에 첫 버퍼와 두번재 버퍼 사이의 이동을 어떻게 자연스럽게 구현하느냐는 문제가 있었습니다.

이번 SUD에서는 mp3에는 일정량의 버퍼(8*1024)를 할당하여 재생하도록 하였습니다.

이제 텍스트가 문제인데.. 이상하게도 저번에는 malloc을 하면 2메가 정도만 해도 프로그램이 죽어버렸는데..

이상하게... 이번에는 8메가도 되네요 ^^;;;

기본 아이디어는 간단합니다.

일단 C에서 즐겨 사용하는 구조체를 하나 만들어 둡니다.

여기에 버퍼를 하나 두고.. 파일을 읽어들인 뒤, 화면에 표시할 라인 단위로 스트링을 저장해 둡니다.

즉, 줄 단위로 버퍼 배열에 저장하게 되는데... 폰트의 사이즈와 실제 glyph의 너비를 기준으로 한 라인 한 라인을 구성합니다.

자... 이제 모든 것이 해결된것 같지만.. 문제가 있습니다.

폰트가 TrueType 폰트이다 보니 어떤 폰트를 사용할 지 모르고.. 따라서 라인을 구성하기 위해서..

각 글자 단위로 width를 얻어와서 라인을 구성해야 합니다.

그래야 라인을 벗어나지 않게 버퍼를 구성할 수 있으니까요.. 이 작업이 시간이 꽤 걸립니다.

저 8메가 읽는데 32초 가량이 걸립니다. 2메가도 9초 정도가 소요됩니다.

2초만 웹페이지가 안떠도 바로 X 로 손이가는 우리에게 9초...30초는 미치는 시간입니다.

폰트를 이전 폰트로 쓰자니... 크기 조절이 안되고... TrueType을 쓰자니.. 느리고..

역시 선택의 문제군요...

주절주절 써서.. 별.. 참.. 그렇네요 ^^;;

PS. 제목이 참 낚시죠~? ㅋㅋ 여기서 막강은 막 오래 걸린다는.... ㅡ,.ㅡ;;
PS. 8메가가 12559 페이지 입니다. (1페이지 12줄) 10만 줄이 넘는데..저런 파일을 진짜 읽고 싶으신가요?