소리꽃 KeyBloom 33
0.1.7을 내보내면서 공연 중 프레임이 떨어지던 문제를 잡은 날. 모션 하나를 합치고 건반에도 손을 댔다.
오늘 한 일
배경 이미지가 진짜 범인이었다
실기 확인에서 배경 이미지를 깔면 음 다섯 개만 눌러도 23fps까지 떨어졌다. 파동과 발광을 켜면 15fps, 공연 출력 창까지 열면 10fps였다.
파티클이 무거운 줄 알았는데 아니었다. 배경을 그리는 코드가 매 프레임 원본 사진을 화면 크기로 다시 줄이고 있었다. 큰 사진일수록 비싸고, 창이 둘이면 두 배다.
배치 결과를 화면 크기에 맞춰 한 번만 만들어 두고 그다음부터는 그대로 찍게 바꿨다. 10fps가 62fps가 됐다. 같은 파티클 수에서 배경이 더하는 비용은 2.56ms에서 2.78ms로, 사실상 사라졌다.
성능 보호
배경을 걷어내고 나니 파티클 자체의 한계가 드러났다. 릴리스 빌드로 재 보니 공연 출력 창 없이 60fps가 유지되는 건 약 1,000개까지고, 출력 창을 켜면 500~750개로 반토막이었다. 개수 슬라이더는 100까지 열려 있어서 페달을 밟고 화음을 쌓으면 쉽게 넘어간다.
상한을 낮추는 방법도 있었지만 그러지 않았다. 같은 설정이 기기마다 750개에서 3,000개까지 갈리는데, 어디에 선을 그어도 한쪽이 손해다. 대신 기기가 스스로 찾게 했다.
프레임이 밀리면 단계적으로 줄인다. 1단계는 발광 크기를 절반으로(칠하는 픽셀이 4분의 1로 준다), 2단계는 개수를 절반으로, 3단계에서 발광을 끈다. [재생] 설정에서 끌 수 있고 기본은 켜져 있다 — 실제로 밀릴 때만 동작하므로 여유 있는 기기에서는 아무 일도 안 일어난다.
영상 추출에는 적용하지 않는다. 추출은 한 장씩 미리 그리는 방식이라 느려질 뿐 품질이 안 떨어진다. 그래서 이 기능을 켜도 최종 결과물은 손해가 없다.
관객 화면 우선
여기까지 해도 공연 출력 창은 버벅였다. 창이 둘이면 같은 파티클을 두 번 그린다는 구조가 남아 있어서다.
그래서 출력 창이 열려 있으면 연주자 미리보기를 30fps로 낮추기로 했다. 관객이 보는 화면과 연주자가 곁눈질하는 모니터는 중요도가 다르다. 덜 중요한 쪽을 먼저 양보시키니 관객 화면이 매끄러워졌고, 미리보기가 30fps인 것은 연주에 지장이 없었다.
미리보기에 「관객 우선」이라고 표시한다. 설정과 실제가 다른 상태를 사용자가 모르면 안 된다.
모션 하나를 합쳤다
「상승 후 흐트러짐」과 「피어오름」이 사실 같은 물리에 값만 달랐다. 「피어오름」에 흩어짐 슬라이더를 달아 흡수했다. 최대로 하면 예전 흐트러짐이 되고 그 사이 값도 전부 쓸 수 있다. 기존 프로젝트 파일은 열 때 자동으로 옮겨진다.
폭과 분수
폭을 키우면 파티클이 태어나는 자리까지 좌우로 벌어져서, 건반에서 피어오르는 게 아니라 처음부터 흩어진 채로 시작했다. 시작 위치는 항상 눌린 건반 너비로 고정하고, 폭은 날아가며 벌어지는 정도만 맡게 했다.
분수는 밑에서부터 너무 빨리 퍼져서 발사각과 가로 속도를 좁혔다. 한동안 기둥으로 모여 솟다가 위에서 꺾인다. 높이를 낮췄을 때 꼭대기가 자로 자른 듯 평평하던 것도 도달 높이에 편차를 줘서 흩뜨렸다.
건반에 입체감
0.1.8용으로 시작했다. 아래 모서리만 둥글게, 흰 건반 사이는 테두리 선 대신 틈으로, 검은 건반에는 명암과 흰 건반에 드리우는 그림자를 넣었다. 조절값 다섯 개를 파일 맨 위에 모아 전부 0으로 두면 예전 사각형으로 돌아간다.
막힌 부분
자동 감량이 7초 주기로 진동했다
단계를 올리고 내리는 판단을 매 프레임 하게 했더니, 한 번 튄 부하에 1·2단계를 건너뛰고 3단계까지 직행한 뒤 거기서 오르내리기를 반복했다. 3단계는 발광이 통째로 꺼지는 단계라 껐다 켜졌다 하는 게 원래 끊김보다 더 거슬렸다.
방금 조치의 효과가 아직 평균에 반영되지 않았는데 다음 판단을 한 것이 원인이었다. 프레임은 이미 회복 중인데 판단에 쓰는 값이 느린 상태로 남아 계속 올렸다.
- 해결: 단계를 바꾼 뒤 1.5초는 판단을 쉬게 했다. 되돌리는 조건도 6초에서 12초로 늦추고, 발광을 다시 켜는 되돌림은 한 박자 더 지켜본다. 3단계 체류가 43%에서 2%로 줄었다.
앱 창에 다른 프로젝트 사이트가 떴다
개발용으로 앱을 띄웠는데 전혀 다른 프로젝트의 화면이 나왔다.
개발 서버 주소가 흔한 기본값이라 다른 프로젝트가 먼저 그 자리를 차지하고 있었다. 그러면 우리 서버는 조용히 다음 자리로 밀리는데, 앱은 원래 주소만 보고 있어서 남의 화면을 그대로 띄운다.
- 해결: 주소를 우리 것으로 고정하고, 그 자리가 막혔으면 조용히 밀리는 대신 오류로 멈추게 했다. 남의 사이트가 뜨는 것보다 안 켜지는 게 낫다.
릴리스 태그를 잘못 올려 설치본 주소가 깨졌다
태그를 올리면서 점을 하나 더 찍었다. 업데이트 안내 파일은 정상으로 보이는데 그 파일이 가리키는 설치본만 404가 나는 상태였다. 버전 숫자만 보면 멀쩡해서 확인 안 했으면 몰랐다.
기존 사용자가 업데이트를 받으려다 실패하는 형태라 조용히 나쁘다.
- 해결: 태그를 고치고, 앞으로 업로드 뒤에 설치본 주소와 안내 파일을 각각 확인하는 절차를 문서에 박아 뒀다.
건반 명암을 정면 시점 관행대로 넣었다
검은 건반 윗면에 하이라이트를 넣고 광택도 위를 밝게 했는데, 왜 있어야 하는지 설명이 안 됐다.
이 건반은 위에서 내려다본 시점이다. 화면 위쪽이 건반 안쪽이고 아래쪽이 연주자 쪽이다. 그런데 「버튼은 위가 밝다」는 정면 시점 관행을 그대로 가져와서, 대응하는 물체가 없는 밝은 띠가 떠 있었다. 게다가 베이스 명암과 방향이 반대라 서로 싸웠다.
- 해결: 흰 건반·검은 건반·광택 셋 다 「안쪽은 그늘, 앞쪽은 빛」으로 통일했다. 시점을 먼저 정하고 명암을 거기 맞춰야 한다는 걸 파일에도 적어 뒀다.
다음에 할 일
- 건반 룩 2단계 — 검은 건반 측면, 흰 건반이 검은 건반 사이로 파고드는 실제 폭, 눌림 표현
- 크로마키 출력 — 키 색과 파티클 색이 겹치는 문제부터. 무지개 모드는 모든 색조를 써서 어떤 키 색이든 겹치고, 발광은 반투명이라 경계가 물든다
- 9:16·1:1 비율 영상 추출
- 라이브 모드 영상 촬영 기획
- 분수·파동 등 상수 미세튜닝은 실기로 보며