2012년 5월 18일 금요일

레티나 디스플레이 찬양(?)


레티나 디스플레이(Retina Display)는 일반적으로 DPI를 높여서 선명하게 보이는 고해상도 디스플레이라고 설명한다. 물론 이는 스티브잡스가 직접 설명한 내용과도 틀리지 않다.

하지만 이를 그저 고해상도화, 단순히 DPI(Dots per Inch, 1인치 내의 점의 갯수)를 높인 수준이라고 별것 아닌 것 처럼 취급하는 사람도 많다.

이 글은 레티나를 찬양(?)하는 글이며 왜 대단한지를 설명하는 글이다. 다만, 개발자가 아니라면 좀 이해하기 어려운 내용일지도 모른다.


1. 사용자의 관점

DPI가 높다는 건 선명하다는 말과 상통한다. 실제로 스티브잡스가 아이폰4를 발표할 때 '인쇄물을 보는 듯한 선명한 화질'을 강조했다.

물론 사용자 관점에선 뿐이다. 이미 안드로이드 폰도 선명한 화질을 보여주는 디스플레이를 장착하고 나오고 있다. 당연히 별 볼일 없이 느껴질 것이다.


2. 개발자의 관점

하지만 개발자의 입장에서 본다면 레티나는 그저 해상도만 높인 것이 아니다.

정확히, 레티나는 기존 해상도에서 2배로 뻥튀기한 해상도를 동일 크기의 디스플레이로 만든 물건이다. 이 2배 라는 말은 기존 해상도에서 확장하기 편하다는 의미가 된다. 단순히 X, Y 좌표를 2배로 늘리고 가로/세로 크기 또한 2배로 늘리면 완전히 똑같은 화면을 만들 수 있다는 의미이다.

하지만 이건 성급하게 접근한 내용이다.


2.1. 실제로 개발자가 레티나를 지원하는 경우

거의 대부분의 앱은 레티나 디스플레이를 지원하기 위해 앱을 수정해야 한다. 단, 코드 수정은 거의 일어나지 않는다. (아예 수정하지 않는다는 말이 더 좋을 것 같다)

레티나를 지원하기 위해 개발자가 하는 일은 아무것도 없을 수도 있다. 아이폰3GS용으로 만든 앱도 아이폰4 이상에서 사용하면 화면크기가 변하거나 하는 일 없이 잘 나온다. 그저 이미지만 덜 선명하게 표시될 뿐 글자는 고해상도에 맞게 표시된다.

즉, 레티나를 지원을 위해 하는 일은 이미 사용하고 있는 저해상도용 이미지보다 가로/세로 크기가 2배 큰 고화질 이미지를 준비해서 앱에 추가해서 배포하는 것 뿐이다.

이미지의 파일 이름이 'sample.png' 였다면 레티나용 이미지는 'sample@2x.png' 이다. 이 두개의 이미지 리소스를 앱에 넣고 코드나 인터페이스 빌더에서는 'sample.png' 파일을 사용하도록 구현해서 빌드해서 실행해 보면 저해상도일 경우 sample.png가 표시되고 레티나일 경우 sample@2x.png가 동일한 크기로 표시된다. 단순히 파일 이름에 '@2x'를 붙이는 것으로 레티나용 이미지가 구분되고 이를 iOS에서 알아서 표시해 주는 것이다.

앱 개발사 입장에서 해상도가 바뀌게 될 경우 해야 할 일은 앱에 따라서 많거나 적거나 다양하지만, 적어도 굉장히 귀찮은 작업을 해야 한다. 레티나의 도입은 바로 이런 귀찮을 일을 최소한으로 줄여주는 정책으로 이어졌다.


2.2. 논리적 해상도와 물리적 해상도

레티나 디스플레이가 지원되면서 SDK의 프레임워크 구현 또한 바뀌었다. 이로 인해서 제공되는 개념이 바로 논리적 해상도(Logical Resolution)와 물리적 해상도(Physical Resolution)이다. 단, 이 용어는 애플이 설명하는 개념이 아니라 내가 개인적으로 설명하기 위해 만든 용어이다.

어째서 논리적 해상도 개념을 두는가? 굉장히 단순하다. 바로 호환성이다. 위 2.1 항목에서도 이야기 했지만 대부분은 레티나용 이미지 파일만 추가하는 것으로 레티나 지원이 완료된다. 해상도가 2배가 되었음에도 기존 저해상도용으로 만들어 둔 인터페이스 정보(XIB)를 그대로 이용한다.

이는 바로 논리적 해상도라는 개념이 있기 때문이다. 아이폰용 앱의 경우 논리적 해상도는 아이폰3GS와 동일한 320x480이다. 레티나의 절반 해상도이다.

레티나 디스플레이용 앱을 개발 할 때 개발자가 사용하는 해상도도 여전히 비-레티나, 즉 구형 저해상도(320x480) 좌표계이다. 그래서 코드나 XIB(인터페이스)를 수정하지 않고 레티나/비레티나 지원이 완료되게 된다.

저해상도(320x480)로 작업 할지라도 레티나 디스플레이 장치에서 사용 할 때는 레티나 해상도(640x960)로 자동으로 1:1로 매핑된다. 이것이 논리적 해상도와 물리적 해상도의 차이다.

개발자가 다루게 되는 해상도는 여전히 구형 저해상도 이지만 이미지나 폰트 등 SDK나 OS 등에 의해 렌더링(Rendering)되는 이미지는 모두 자동으로 해상도가 2배씩 선명하게 그려지게 된다.

결과적으로 개발자는 일반적으로 논리적 해상도 좌표계를 기준으로 개발을 하게 된다. 하지만 실제로 이 좌표계가 레티나 디스플레이에서 사용될 때는 레티나 좌표계로 변환되어서 작동하게 된다. 레티나이든 비레티나이든 동일한 위치를 동일한 수치로 이용할 수 있는 것이다.


2.3. 그렇다면 논리적 해상도는 손해 아닌가?

레티나 디스플레이를 사용하면서 저해상도 기반 좌표계를 사용한다는 것은 좌표계상의 75%의 좌표을 사용하지 않는 셈이다. 이런 것만 생각하면 당연히 손해보는 기분이 든다.

하지만 다르게 생각해보자.

그림을 그리기 위한 앱 등을 제외하고, 픽셀 단위로 그래픽을 조작해야 하는 앱은 거의 없다. 버튼 사이의 거리가 1픽셀이든 2픽셀이든 사람은 크게 느끼지를 못 한다. 굳이 물리적 해상도로 인터페이스를 배치할 필요는 없다는 것이다.

심지어 애니메이션 조차도 구형 해상도의 좌표계 기반으로 움직여도 사람은 거의 느끼질 못 한다.

레티나의 중점은 눈으로 집중해서 인식해야 하는 부분에 있다. 글자나 사진 등 선명도가 굉장히 중요한 요소일 경우이다. 사진 등의 이미지는 위에서 이야기 한 대로 2배로 정교한 이미지를 준비하면 해결되고 글자는 iOS가 알아서 레티나용으로 고해상도로 렌더링 한다.

이렇게 볼 때 논리적 해상도의 사용은 크게 문제될 것이 없다. 그냥 좌표계만 손해를 보지 실제로 화면의 모든 점을 이용하게 된다.


2.4. 예외 사항

그림을 그리기 위한 앱 등, 이미지 파일을 화면에 표시만 하는게 아니라 그래픽을 직접 그리는 앱의 경우 논리적 해상도 개념은 방해가 되는 존재일 수도 있다. 이럴때는 물리적 해상도 개념을 사용해야 할 것이다. 즉, 레티나의 모든 좌표계를 이용한다는 말이다. 위에서는 손해본다는 이야기를 했지만 그 손해를 안보게 만들 수도 있다는 말이다.

iOS SDK에서 그래픽 컨텍스트를 이용해 점이나 선 등을 그리는 경우를 생각해 보자. 그냥 컨텍스트를 가져와서 그려보면 저해상도 기준으로 그림이 그려진다. 이렇게 그려진 그림을 동일한 해상도로 표시해 보면 레티나도 저해상도로 그림이 그려진다. 그래픽 컨텍스트도 기본적으로는 논리적 해상도 기준으로 동작한다는 것이다.

이럴 때 물리적 해상도를 이용하기 위해 2배의 크기를 사용한다는 것을 컨텍스트를 가져올 때 알려주면 그 때 부터는 레티나 해상도에 맞게 그림을 그릴 수 있다. 대부분은 레티나를 지원하기 위해 코드를 수정 할 일은 없지만, 이미지를 합성하거나 직접 그림을 그려야 되는 앱은 이런 수정이 필요하다.

// 아이폰 4 이전의 저해상도일 경우
UIGraphicsBeginImageContext(size); 

// 아이폰 4 부터 지원되는 레티나 디스플레이의 경우
UIGraphicsBeginImageContextWithOptions(size, NO, 2.0);

위의 2.0 수치는 해상도를 2배씩 늘린다는 이야기이다. 물론 이렇게 되면 모든 좌표계는 레티나에 대응된다.

이 내용은 레티나 지원 시 호환성이 떨어질 수도 있다는 이야기이다. 그럼에도 단순히 2배이기 때문에 크게 코드를 수정 할 건 없다. 2배로 늘린건 그냥 단순히 정한 것이 아니라 굉장한 고민이 숨어 있었을지도 모른다.


3. 정리

그저 2배로 뻥튀기한 디스플레이라고만 생각했던 레티나 디스플레이. 그 이면에는 구형아이폰과 아이폰4 사이, 그리고 아이패드와 새 아이패드(The New iPad) 사이의 호환성을 충족시키기 위한 준비가 되어있었다.

사용자에게는 선명한 화질을, 개발자에게는 고해상도 지원의 편리함을 제공해 주었다. 다양한 안드로이드 기기의 다양한 해상도를 지원하기 위해 고생해 봤던 개발자라면 레티나는 '혁명' 이라고 표현할지도 모르겠다.

불행히도 일반 사용자가 개발 시의 편리함을 알 수는 없을 것이며 알 필요도 없다. 하지만 섵불리 레티나가 단순히 해상도만 뻥튀기한 것이 아니라는 것을 말하고 싶다.

물론 해상도가 2배씩 커졌으니 그 만큼 시스템이 지원하기 간단한건데 뭘 그리 찬양하느냐 라고 생각 할 수도 있을 것이다. 단순한 시스템임에는 물론 사실이다. 하지만 이런 개념을 도입한 장치는 애플의 iOS 모바일 디바이스가 유일하다. (다만, 애플이 이런 정책을 선도한 것인지는 확실치 않다. 분명 비슷한 정책을 만든 곳이 있을지도 모르겠다)

사족이겠지만, 이런 사유로 차기 아이폰은 구형 저해상도의 배수 크기로 해상도가 정해질 것이다. 감히 장담하건데, 아이폰의 화면 크기가 바뀌어도 해상도는 현재 아이폰4 해상도(640x960)로 나올 것이다. 해상도가 바뀔 것이라고 추측하는 사용자들이 많은데 앱 호환성을 이해한다면 해상도의 기준이 바뀌지는 않을 거라고 생각 할 수 있을 것이다.

또한 이런 내용을 이해했다면 왜 안드로이드 앱 개발이 (상대적으로) 괴로운지를 알 수 있을 것이다.

참고포스트: 안드로이드를 혐오하는 개발자 이야기

댓글 없음 :