안드로이드 스튜디오로 리듬게임을 제작시 레이턴시 관련 문제 해결방법

2024. 5. 4. 01:30카테고리 없음

이제 꽤나 리듬게임 다워진 모습이다. 아직 구현해야할것도 많고 개선해야할것도 많지만. 나름 사람구실은 하고있는모습니다

 

이 리듬게임을 제작하면서 겪었던 문제와 해결방법에대해서 제작기간 중간에 한번 정리해볼려고한다.

 

1. 버튼을 눌렀을때 반응이 0.5초정도 느리다.

원인은 일단 onClickedListener << 이였다.

 

제작기간내내 버튼을누르고 타격소리를 출력하고, 판정을 처리하고, 판정처리후 노트가 사라지는 작업이 0.5초정도 지연이 됐었다. 처음에는 게임엔진을 사용하지않은 순수자바 게임의 한계라고 생각했으나.

 

답은 리스너의 작동형태였다.

 

onClickedListener은 눌렀다가 뗄때 메소드를 실행하기 떄문에. 사실상 누른시점에 처리를 바로해야하는 리듬게임에선 적합하지 않은 형태이다.

 

그에대한 대안으로 onTouchListener 이 있다.

 

onTouchListener은 메소드내에서 onTouch의 매개변수, ACTION_DOWN (누름) ACTION_UP을 사용해 처리를 각각 할 수 있는데.

 

우린 리듬게임을 제작하고있으니  ACTION_DOWN (누름) 에 처리메소드를 작성하여 누르자마자 즉시 처리를 하게 하면 된다.

 

노란줄이 쫙 뜰텐데. 이것은 ACTION_UP(뗄때) performClick() 이란 클릭을 처리했다, 즉 실제 터치를하면 눌렀다가 떼는것처럼 그 행동을 처리해주는 메소드에요 (메소드로 다른행동 -> 실제클릭과 같은 효과를 낼때도 사용)

 

그것을 ACTION_UP을 오버라이드 해서 사용할꺼면, ACTION_UP내의 메소드가 끝나고 button(버튼이름).performClick()을 사용해서 안전하게 처리해라. 라는뜻입니다

 

이렇게하면 즉각적인 터치반응으로 게임이용자에게 좋은 사용자경험과 낮은 레이턴시를 제공할 수 있습니다.

 

2. 노트블럭 데이터를 생성하고. 그려주는등의 무거운 메소드의 처리방법

여기서 쓰레드를 사용해야하는 이유가 나오는데. 위에서 말한 노트블럭 데이터를 동기화하고, 실시간으로 내려오게 그려주는등의 부하가 많이갈수밖에 없는 메소드는 UI Thread에서 처리한다.

 

여기서 보이는 noteManager은 내 ui작업,복잡한 계산작업을 처리해주는 클래스고. 이것을 처음에는 깡으로 Activity의 onCreate()에서 실행을 해버렸다. 결국 메인쓰레드에서 그 복잡한 작업들과 다른작업들이 한번에 돌아갔다는건데.

 

당연히 부하가 엄청 심할수 밖에없었다. 노트가 많이 겹치거나 게임이 진행될수록 부하가 심해져 게임이 다운되거나 노트가 밀리는 현상이 일어났다.

 

그 모든작업을 따로 메소드를 하나 작성하여 UI Thread에서 처리를 해주니. 체감상 3배이상 게임이 쾌적해진것을 느낄수있었다. 잔렉은 존재하지만 그것또한 차차 해결해보고 해결법을 블로그에 개제할거다.