Cocos2d-x 프로젝트에 텍스처는 1024 를 넘지 않는다는 규칙이 있었다. 왜인지 모르고 지켰다.
Table of contents
Open Table of contents
규칙 때문에 일이 늘었다
배경 이미지가 1024를 넘어서 둘로 잘라 붙였다.
CCSprite* bg1 = CCSprite::spriteWithFile("bg_left.png");
CCSprite* bg2 = CCSprite::spriteWithFile("bg_right.png");
bg2->setPosition(ccp(bg1->getContentSize().width, 0));
이음매가 보였다. 위치를 소수점까지 맞춰도 기기에 따라 한 줄이 비쳤다. 이 일을 며칠 하다가 왜 1024인지 물어봤다.
이유를 찾았다
옛 기기 중에 큰 텍스처를 못 다루는 것이 있어서 정한 규칙이었다. 그런데 그 기기는 지원 목록에서 빠진 지 오래였다.
지원 기기 목록을 확인하니 최소 사양이 올라가 있었고 그 조건이면 2048까지 다룰 수 있다. 규칙이 정해질 때와 지금이 달랐다. 규칙이 틀린 것이 아니라 규칙이 만들어진 조건이 바뀐 것이었다.
직접 재 봤다
물어보고 끝내지 않고 실제로 값을 찍어 봤다. Cocos2d-x 가 이미 CCConfiguration 에 담아 두고 있었다.
CCConfiguration* conf = CCConfiguration::sharedConfiguration();
CCLOG("max texture size = %d", conf->getMaxTextureSize());
CCLOG("npot = %d", conf->isSupportsNPOT());
안쪽을 보니 glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...) 를 한 번 읽어 들고 있는 값이었다.
가진 기기 다섯 대 중 넷이 2048 이상인데 한 대가 1024 였다. 그 기기가 지원 목록에 있는지 보니 있었다. 물어본 답만 믿었으면 이 한 대를 못 봤다.
한도를 넘기면 Cocos2d-x 가 로그를 남긴다는 것도 그때 알았다.
cocos2d: WARNING: Image (2048 x 2048) is bigger than the supported 1024 x 1024
조용히 깨지는 것이 아니라 logcat 에 남아 있었다. 안 보고 있었을 뿐이다.
그래서 규칙을 없애는 대신 다르게 바꿨다. 기본은 1024로 만들고 큰 것이 필요하면 기기가 다룰 수 있는지 확인해 두 벌 중 하나를 쓴다.
int maxSize = CCConfiguration::sharedConfiguration()->getMaxTextureSize();
const char* bgFile = (maxSize >= 2048) ? "bg_2048.png" : "bg_1024.png";
두 벌을 만들어야 하지만 이음매를 맞추는 것보다 나았다. 규칙에 이유와 언제 다시 봐야 하는지도 같이 적었다. 다시 볼 조건을 안 적으면 조건이 바뀌어도 계속 지킨다.
다른 규칙과 여전히 맞는 것
같은 방식으로 정해진 것이 더 있었다. 효과음 주파수와 스프라이트 개수 상한과 씬 전환 효과 금지 셋인데 이유를 아는 사람이 없었다.
하나씩 재 봤다. 효과음은 높여도 용량 차이가 크지 않았다. 스프라이트는 CCSpriteBatchNode 로 묶어 그리면 상한의 두 배도 됐다. 전환 효과가 느리던 기기는 이제 없었다.
다만 전부 낡은 것은 아니었다. 텍스처를 2 의 제곱수로 만든다는 규칙은 지금도 맞았다. CCTexture2D 를 열어 보니 이유가 있었다. NPOT 을 못 쓰는 기기에서는 ccNextPOT 로 가로세로를 올려서 잡는다. 1025 짜리를 넣으면 2048 만큼 잡힌다. 낡은 규칙만 있을 것이라고 본 것도 틀렸고 하나씩 확인하는 것 말고 방법이 없었다.
정리
- 이유를 모르는 규칙은 이유를 찾고 나서 따른다
- 규칙이 틀린 것이 아니라 만들어진 조건이 바뀐 것일 수 있다
- 물어보는 것으로 끝내지 않고 직접 재 본다
- 재 보면 예외가 나온다. 그 예외를 어떻게 다룰지 따로 정한다
- 규칙에 이유와 언제 다시 봐야 하는지를 같이 적는다
- 다시 볼 조건이 없으면 조건이 바뀌어도 계속 지킨다
- 낡은 규칙만 있는 것은 아니다. 재 보면 여전히 맞는 것도 있다