삽질하는플머

글립 캐시 고민중...

탐구생활/Uniscribe
폰트별로 글립을 천개씩 캐싱한다고 기준을 정하고 적절한 텍스쳐 크기 및 캐시 갯수를 결정했는데
혹시나 싶어 여기저기 검색하다가 이런 글을 발견했다.
http://www.delphipages.com/forum/showthread.php?t=117319

GetFontUnicodeRanges() API 를 써서 폰트에 설정된 유니코드 글립의 정보를 얻어내는 예제인데
혹시나싶어 돌려보니 헐~~
Webdings 는 탈탈 털어서 480개가 전부. Tunga는 달랑 134개, SimSun-PUA 는 95개밖에 안된다.

좀 더 깔끔한 코드를 만들고 싶은 욕심은 일단 뒤로 미루고, 생각나는 대로 발코딩 해 보았다.
최대 텍스쳐 크기는 1024로 제한. 사실 이런거 고민할 때가 제일 재미있다.

먼저 기준폰트인 Tahoma 8포인트의 경우.



이 폰트에는 가로폭이 넓은 아랍글립이 포함되어있어 높이에 비해 너비가 상당히 넓은 편이다.
512*512 텍스쳐에 828개의 글립을 캐싱. 텍스쳐에서 사용하지 않게되는 낭비공간은 3% 정도로 괜찮은 수준.

굴림 11포인트의 경우.



512*512 텍스쳐에 1024개 글립을 캐싱. 게다가 여백없이 꽉 채우므로 메모리 낭비가 없는 완전소중 아이템.

굴림 72포인트로 크기를 키울 경우는



1024*1024 크기의 텍스쳐 10장에 1000개의 글립을 캐싱한다.
후덜덜 하긴 하지만, 어차피 게임에서 이렇게 큰 폰트를 표시할 일은 거의 없고, 텍스쳐 역시 필요할 때만 생성할 것이므로
메모리 폭주가 일어나지 않도록 최대 텍스쳐 갯수를 3~5개로 제한하는 코드만 추가하면 쓸만할 듯 싶다.

이제 다시 테스트~ 테스트~~


2010.6.8
-----------------
유니스크라이브는 한마디로, 유니코드 문자열을 Run이라는 단위로 쪼개고 각 Run에 해당하는 정보를 제공하는 도우미.
게임에서 이 물건을 써먹기 위해서는 글자가 뿌려지는 폭, 캐럿위치와 화면위치의 변환, 다음 캐럿의 위치와 다음 단어의 위치 얻기, 그리고 워드랩을 위한 단어끊기 정도를 구현하면 될 것이라 생각된다. ScriptCPtoX(), ScriptXtoCP(), SCRIPT_LOGATTR 등을 가지고 일단 구현은 완료. 나머지는 실제 3D 환경에서 에디터를 만들며 생각해보자.