시작 화면 코드를 정리했다. AppDelegate 의 applicationDidFinishLaunching() 안에 초기화가 순서 없이 흩어져 있어 종류별로 모았다. 정리한 뒤에 앱이 검은 화면에서 멈췄다.
Table of contents
Open Table of contents
무엇이 바뀌었나
자료를 읽는 것을 앞에 모았다. 화면 준비를 그 뒤에 두고 소리를 마지막에 뒀다. 읽기에는 자연스러운 순서였다.
CCTextureCache 로 텍스처를 올리는 코드가 문제였다. 그것은 OpenGL 쪽에 올리는 작업이라 뷰가 먼저 있어야 한다. 원래 코드는 setOpenGLView() 가 맨 앞이었는데 자료를 앞으로 옮기면서 그 관계가 깨졌다. 읽기에 자연스러운 배치가 실제 의존 관계와 반대였다.
텍스처가 화면에 기대고 있었다
무엇이 무엇에 기대는지 적어 봤다. CCEGLView 를 CCDirector 에 물리는 것은 기대는 것이 없다. 해상도 설정과 텍스처 로딩은 그것에 기댄다. SimpleAudioEngine 과 저장 데이터는 기대는 것이 없다.
기대는 것이 없는 것부터 놓고 나머지를 그 뒤에 놨다. 뷰를 먼저 물리고 뷰에 안 기대는 것을 다음에 하고 뷰에 기대는 것을 그 뒤에 뒀다. 주석에 왜 그 순서인지도 적었다. 이것이 없으면 다음에 또 정리하다가 같은 일이 난다.
순서에 기대는 걸 줄였다
순서를 적어 두는 것보다 나은 것은 순서에 안 기대게 만드는 것이었다.
if (!CCDirector::sharedDirector()->getOpenGLView()) {
CCLOG("TextureLoader::preload - OpenGL 뷰가 없음");
return;
}
getOpenGLView() 로 필요한 것이 있는지 확인하고 없으면 로그를 남긴다. 순서가 틀리면 검은 화면만 보는 대신 이유가 남는다. 전부 이렇게 만들 수는 없었지만 한 번 겪은 자리에는 넣었다.
종료 순서와 확인 목록
시작 순서를 정하고 나니 종료 순서도 걸렸다. 저장이 게임 상태를 읽는데 그 전에 화면을 멈추면 상태가 이미 정리된 뒤일 수 있다. 종료는 시작의 역순이 대개 맞았고 나중에 만든 것을 먼저 정리한다.
이번에는 앱이 안 떠서 바로 알았지만 조금 이상한 정도면 못 알아챌 수 있다. 정리 전후로 확인할 것을 목록으로 정해 뒀다. 앱이 뜨는지와 시작 화면 그림이 다 나오는지와 소리가 나는지와 저장 데이터가 읽히는지와 스테이지를 끝까지 할 수 있는지 다섯이다.
읽기 좋게 고치는 작업은 동작이 바뀌면 안 되는 작업이다. 확인 목록이 있어야 그것을 보장할 수 있다.
정리
- 서로 기대는 것들은 순서가 곧 동작 조건이다
- 읽기에 자연스러운 순서와 실제 의존 관계가 반대일 수 있다
CCTextureCache는setOpenGLView()뒤에만 쓸 수 있다- 무엇이 무엇에 기대는지 적고 기대는 것이 없는 것부터 놓는다
- 왜 그 순서인지 주석에 남긴다
- 순서를 적는 것보다 순서에 안 기대게 만드는 것이 낫다
getOpenGLView()로 전제를 확인하면 검은 화면 대신 이유가 남는다- 읽기 좋게 고치는 작업에는 확인 목록이 필요하다