"작가의 캔버스를 다른 창에 띄우려면 픽셀을 읽어야 해. 그것도 레이어를 합치거나 병합하거나, 지금 작업 중인 document 를 건드리지 않고서."
쉬워 보이는 함정
Cinder 는 포토샵 캔버스에 지금 뭐가 있는지 실시간으로 알아야 해. 별것 아니게 들리지. 그냥 이미지를 가져오면 되잖아. 그런데 그 document 는 작가가 지금 작업 중인 파일이야. 레이어가 잔뜩 있고 계속 고쳐지고 있는. 레이어를 합치거나 병합해 버리는 순진한 '이미지 가져오기' 는 작가가 그리고 있는 바로 그것을 바꿔 놔. 진짜 할 일은 이거야. document 를 전혀 안 바꾸고 캔버스가 합쳐진 모습만 떠 오기.
맞는 도구: 읽기 전용 imaging 경로
플러그인 플랫폼이 document 의 합쳐진 픽셀 — 보이는 레이어가 전부 한 장으로 합쳐진 모습 — 을 document 를 안 바꾸고 읽어서 돌려주는 imaging API 를 줘. document 는 레이어를 전부 그대로 갖고 있고, 너는 그것들이 합쳐져 보이는 모습만 받는 거지. '지금 이거 어떻게 보여?'(읽기)랑 'document 를 합쳐'(파괴적 변경)의 차이야. 눈에 보이는 결과는 같은데 작가 파일에 남는 결과는 완전히 달라.
일부러 더 작은 이미지를 달라고 해
떠 올 때 목표 크기를 같이 넘겨. 전체 해상도 캔버스가 아니라 줄어든 미리보기로. 이건 대역폭 아끼자는 얘기가 아니야. 더 작은 크기를 달라고 하면 플랫폼이 내부에 갖고 있는 이미지 층 중에 이미 줄여 둔 걸 내줄 수 있거든. 매번 전체를 읽어서 줄이는 것보다 훨씬 빨라. 작가가 그리는 동안 계속 갱신되는 실시간 미리보기에서는 빠르고 작은 쪽이 완벽하고 느린 쪽을 이겨. 그 일에 맞는 크기는 목적을 만족시키는 제일 작은 크기야.
빼먹으면 안 되는 정리
날 선 데가 하나 있어. 떠 온 이미지 데이터가 호스트 앱의 메모리를 붙들고 있어서, 뜰 때마다 명시적으로 놓아 줘야 해. 놓아 주는 걸 건너뛰면, 그것도 계속 다시 뜨는 실시간 미리보기에서 건너뛰면, 플러그인이 꾸준히 메모리를 새다가 호스트가 한도를 넘었다고 경고할 때까지 가. 떠 오기는 바이트를 손에 쥔 순간 끝난 게 아니야. 메모리를 도로 돌려준 순간 끝나. 모든 떠 오기는 잡고, 쓰고, 놓는 거야. 그리고 놓는 건 선택이 아니야.