FPS Arena에 3D 캐릭터를 붙였습니다. 웹에서 재 보니 복셀보다 프레임 타임이 두 배 였습니다. p50 기준 14.9ms 대 6.3ms.
재는 도구부터 만들었습니다
브라우저에서 프레임 타임을 눈으로 재는 방법은 없습니다. 그래서 도구를 먼저 만들었습니다.
숨은 데스크톱에서 크롬을 띄우고(업무 화면에 게임 창이 뜨면 안 됩니다), 개발자 도구로 붙어 프레임 간격을 모읍니다. 배포판에는 복셀로 돌릴 방법이 없어서, 로컬에 두 벌을 띄워 같은 조건에서 비교하도록 했습니다.
비교군이 없으면 "빨라졌다"를 말할 수 없습니다. 이 도구가 이번 작업의 절반입니다.
넷을 넣었고 넷 다 헛방이었습니다
먼저 떠오르는 것들을 넣었습니다.
- 재질 공유
- 장식 그림자 끄기
- 20m 밖 안 그리기
- 화면 밖 애니메이션 정지
넷 다 실제로 걸렸습니다. 드로우콜이 줄어든 것도 확인했고, 화면 밖 캐릭터가 7명 중 7명에서 0명으로 바뀌는 것도 확인했습니다.
프레임 타임은 하나도 안 움직였습니다.
걸렸는지와 효과가 있는지는 따로 재야 합니다. 저는 앞의 것만 확인하고 뒤의 것을 확인했다고 착각하고 있었습니다.
진단 플래그로 갈랐습니다
추측을 멈추고, 하나씩 통째로 꺼 보는 플래그를 만들었습니다.
| 무엇을 껐나 | 프레임 타임 |
|---|---|
| 애니메이션 전부 | 13.2 / 15.4 |
| 그림자 전부 | 13.5 / 14.0 |
| 양면 → 단면 | 14.4 / 14.9 |
| 그리기만 끄기(애니메이션은 그대로) | 7.6 / 8.1 |
앞의 셋은 전부 그대로였고, 그리기를 끄자 복셀 수준까지 내려갔습니다.
남은 값은 전부 그리는 횟수입니다. 웹에서는 그리기 한 번이 0.15ms쯤 합니다. 캐릭터 하나가 머리·몸통·팔·다리로 쪼개져 있으니, 사람이 여덟이면 그 수가 그대로 곱해집니다.
그래서 부위 메시를 합쳤습니다
부위 파괴 게임이라 몸이 부위별로 나뉘어 있는 것 자체는 규칙입니다. 그런데 그리는 단위까지 나뉘어 있을 이유는 없었습니다. 판정은 부위별로 두고 그리기는 하나로 합쳤습니다.
프레임 타임이 절반 가까이 내려갔습니다.
같이 붙인 것들도 있습니다. 3인칭 시점을 넣고, 망토는 카메라가 가까울 때만 흔들리게 했습니다. 멀리 있는 망토의 흔들림은 아무도 못 보는데 계산은 똑같이 듭니다. 상체가 조준선을 따라가는 처리를 넣고, 앉기는 양반다리로 대신했습니다. 떠 있던 포복 자세를 바닥에 붙였고, 투구와 모자는 하나로 합쳤습니다.
남는 것
최적화를 넣을 때 저는 "이건 분명히 도움이 된다"를 근거로 넣고 있었습니다. 넷 다 합리적이었고, 넷 다 실제로 동작했고, 넷 다 소용이 없었습니다.
병목이 어디인지 재기 전까지는 아무것도 고르면 안 됐습니다. 그리고 병목을 찾는 데 가장 빨랐던 방법은 최적화가 아니라, 의심되는 것을 통째로 꺼서 숫자가 움직이는지 보는 것이었습니다.