자막 이야기 3

 | 개발
2007.12.30 06:48
자막 이야기 2는 0.3.1 버전까지의 이야기입니다.
여기까지만 해도 고품질 자막 지원이라는 목표는 성공한 듯 보였습니다. 그런데 문제점이 보이기 시작했죠. 자막이 처음 표시될 때 영상이 잠깐 멈칫하는 현상이 발견된 것입니다. 일단 자막이 표시된 후에는 괜찮구요. 하지만 이에 대한 버그 리포트는 없었습니다. 사실 저도 별로 느끼지 못했는데 주철씨가 발견해 지적하더군요. 자막이 표시될 때 사람들은 영상을 보지 않고 자막을 보기 때문에 영상이 멈칫하는 것을 잘 알아채지 못한 것 같았습니다.

암튼 이것은 분명한 문제였고 수정을 하긴 해야 했습니다. 고품질 자막이 아무리 좋다지만 영상이 멈칫한다는 것은 용납할 수 없었죠. 멈칫하는 현상이 그림자의 흐림값이 클수록, 글자가 클수록 심해진다는 것을 발견했습니다. 내용이 변경될 때에만 텍스처를 다시 만들도록 했으니 텍스처를 화면에 그리는 부분이 아니라 텍스처를 만드는데 부하가 있는 것이 분명했는데 어디가 문제일까 단계별로 시간을 측정해보니 아뿔싸 -[NSAttributedString drawInRect:]가 문제였던 것입니다!

이거 큰일 났습니다. Cocoa의 텍스트 그리기가 느리다는 소문이 사실이었던 거죠. 아무래도 그림자 처리에 많은 부하가 있는 것 같았습니다. 그래서 그림자 흐림값이 클수록, 글자가 클수록 느렸던 거죠. 구조적인 문제였다면 어떻게 해볼텐데 이거야 원 어찌해야 한단 말입니까. 쩝... 사람들이 별로 신경쓰는 것 같지도 않으니 그냥 둘까 하다가 이건 개발자로서의 자세가 아니다 마음을 바로잡고 -_- 개선해보기로 했습니다. 세계 최고의 자막을 위해! ㅡ.ㅡ

Core Video 스레드에서 자막을 갱신하는 지금의 방식으로는 이 문제를 도저히 해결할 수 없습니다. 대안은 자막을 미리 만들어 두어야 한다는 것인데, 하지만 자막이 얼마나 많을지 모르므로 모든 자막을 미리 만들어 둘 순 없죠. 자막 하나하나가 모두 텍스처 즉, 메모리 덩어리인데 자막의 글자색 하나만 바뀌어도 새 텍스처를 만들어야 하므로 메모리를 어마어마하게 사용할 수도 있으니까요. 더구나 실시간으로 자막 색상이나 외곽선, 그림자 같은 속성을 변경할 수 있다보니 이렇게 변경할 때마다 만들어놓은 텍스처는 폐기하고 변경된 속성으로 다시 만들어야 합니다. 또한, 전체 화면으로 전환하는 등 윈도우 크기가 변경되면 서체 크기가 바뀌므로 이 때에도 역시 다시 만들어야 하구요. 그렇다면 방법은?!!

짐작하시듯이 자막 텍스처를 만드는 스레드를 따로 두고 저런 경우 다시 만들도록 하면 되겠죠. 또한, 메모리 사용량을 줄이기 위해 모든 자막을 다 만들어두는 것이 아니라 일정량만 미리 만들고 나머지는 재생이 진행됨에 따라 오래된 것은 없애고 필요한 부분만 추가로 만들도록 해야할 것입니다. 따라서 이 스레드는 자막 속성이나 윈도우 크기가 변경될 때 외에도 재생 중에 현재 재생 시각이 변경됨에 따라 점진적으로 텍스처를 만들어야 할 뿐 아니라 자막 텍스처가 아직 만들어지지 않은 지점으로 이동하는 경우도 처리해야 합니다. 아 벌써부터 골치가 아파오는군요... -_-

스레드 이름은 SubtitleRenderer 라고 지었습니다. 이 스레드는 Core Video 스레드가 재생하는 시각을 기준으로 최대 30초 구간 만큼의 자막 텍스처를 미리 만들어 둡니다. Core Video 스레드는 이렇게 만들어진 텍스처를 가져다 화면에 그리는거죠. 만약 자막 속성이나 윈도우 크기가 변경되면 즉시 만들어두었던 텍스처를 모두 폐기하고 다시 만들기 시작합니다. 특정 시각으로 이동했는데 그 시각의 자막이 아직 만들어지지 않은 경우에도 역시 텍스처를 다시 만듭니다. 또한, 반응성을 높이기 위해 Core Video 스레드가 자막 텍스처를 요청할 때 정지 상태이면 SubtitleRenderer가 만들어주길 기다리는 것이 아니라 Core Video 스레드가 직접 만들도록 했습니다. 최적화하는데 애를 좀 먹었지만 효과는 아주 좋았습니다. 자막이 처음 표시될 때 멈칫하던 현상이 사라졌죠. 메모리 사용량도 적당히 유지됐구요. 물론 이전보다는 훨씬 늘었지만...

그런데 이렇게 만들어놓고 나니 그림자를 좀 진하게 해볼까 하는 생각이 들기 시작했습니다.
사실 그림자가 좀 연하다는 생각을 해오던 차였는데 더 진하게 하는 방법을 몰랐거든요. 단지 여러번 반복해서 그리면 그림자가 누적되니 그런 효과를 볼 수 있겠다는 생각만 했었는데 이건 아무래도 무식한 방법 같아서 시도를 하지 않던 참이었습니다. 그런데 이제 그림자에 대한 부하를 걱정하지 않아도 되니 한 번 시도해볼만 하다는 생각이 든 거죠. 효과는 역시나 좋았습니다. 그림자가 진해지니 훨씬 가독성이 좋아지더군요. 이전에는 가독성을 높이기 위해 외곽선을 굵게 했는데 그러는 것 보다 보기도 더 좋았습니다.

그런데 SubtitleRenderer는 충분히 빠를까요?
그림자가 진해지는 만큼 자막 텍스처를 만드는데 많은 시간이 필요할텐데 혹시 충분히 빠르지 못하다면 Core Video 스레드가 요청하는 자막이 아직 안만들어진 상태일 수도 있습니다. 이런 경우에는 자막이 나오지 않겠죠. 실제로 그림자를 가장 진하게 해놓은 상태에서 자막이 매우 빠르게 변하면 자막이 나오지 않는 것을 확인할 수 있습니다. 어떤 자막 제작자들은 영화의 앞부분에 제작자 정보를 예쁘게 꾸미곤 하는데 이런 부분은 자막이 0.x초 단위로 바뀌기도 합니다. 제 24인치 모니터에서 전체 화면으로 해놓고 저런 부분을 보면 자막이 나오지 않는 경우를 볼 수 있었습니다. 물론 일반적인 영화의 자막이라면 저런 꾸밈효과가 덜하고 훨씬 오래 지속되므로 거의 문제되지 않습니다. 또 적당한 진하기라면 웬만해선 잘 나올 것이구요. 또 CPU가 빨라질수록, Cocoa가 좋아질수록 점점 나아지겠죠.

여기까지가 0.4 버전의 자막 이야기입니다.
앞으로 또 어떠한 변화가 있을까요.. ^^
신고

'개발' 카테고리의 다른 글

무비스트 빌드하기  (11) 2008.04.14
전체 화면 전환 효과  (1) 2008.02.06
자막 이야기 3  (6) 2007.12.30
자막 이야기 2  (2) 2007.12.30
자막 이야기 1  (2) 2007.12.30
Posted by 코코아벌레

BLOG main image
Mac OS X 용 동영상 플레이어 . . . . <무비스트> 공식 홈페이지 . . . . . . by 코코아벌레

카테고리

전체 (66)
무비스트 (9)
릴리즈 (48)
개발 (5)
FAQ (4)

달력

«   2017/06   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

글 보관함