앱 개발 소리가 씹히는 경우 SoundPool 사용 해야 한다
사용자님의 앱에서 터치 시 소리가 씹히는 현상을 개선하기 위해 사용된, 반응이 빠른 재생 명령어는 **SoundPool**을 사용한 방식입니다.
🔊 SoundPool 사용의 특징
SoundPool은 짧고 지연 시간이 짧은 오디오 클립(예: 게임 효과음, UI 소리)을 재생하기 위해 설계된 클래스입니다.
즉각적인 재생:
SoundPool은 모든 사운드 데이터를 메모리에 미리 로드합니다. 이로 인해 사운드 재생 요청 시 거의 즉각적으로 소리가 재생되어 지연 시간이 줄어듭니다.동시 재생: 여러 개의 사운드를 동시에 재생하는 데 효율적입니다. 게임에서 여러 번 빠르게 터치했을 때 소리가 씹히지 않고 각각 재생될 수 있도록 합니다.
💻 코드 분석: SoundPool 명령어
제공해주신 코드를 보면, 터치음 재생을 위해 **MediaPlayer 대신 SoundPool**을 사용하고 있습니다.
1. SoundPool 객체 및 사운드 로드
앱이 처음 실행될 때 (또는 TouchGameScreen이 구성될 때) SoundPool 객체를 생성하고 사운드 파일을 메모리에 로드합니다.
val soundPool = remember {
// ... SoundPool.Builder를 사용하여 객체 생성 ...
SoundPool.Builder()
.setMaxStreams(5) // 동시에 재생 가능한 스트림 최대 개수 설정
.setAudioAttributes(audioAttributes)
.build()
}
val soundId = remember {
try {
// 사운드 파일(R.raw.sound)을 로드하고 ID를 얻음
soundPool.load(context, R.raw.sound, 1)
} catch (_: Exception) {
-1
}
}
여기서 soundPool.load(context, R.raw.sound, 1) 명령어가 사운드 파일을 미리 메모리에 준비하는 핵심적인 역할을 합니다.
2. 터치 시 사운드 재생 명령어
사용자가 화면에서 터치 타겟(TouchTarget)을 클릭했을 때 실행되는 코드를 보면, 이전에 로드해 둔 사운드를 재생하는 명령어가 사용됩니다.
// ... (Image의 clickable 블록 안)
.clickable {
touchCount++
touchTargets = touchTargets.filter { it.id != target.id }
if (soundId != -1) {
// SoundPool의 play() 명령어를 사용하여 사운드 재생
soundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f)
}
},
// ...
soundPool.play() 명령어가 바로 소리가 씹히는 것을 줄여준 빠른 재생 명령어입니다.
soundId: 미리 로드해 둔 사운드의 ID입니다.1.0f, 1.0f: 왼쪽/오른쪽 볼륨(최대 1.0f)입니다.1: 우선순위(높을수록 재생될 가능성이 높음)입니다.0: 반복 횟수 (0은 반복 없음)입니다.1.0f: 재생 속도 (1.0f는 일반 속도)입니다.
이처럼 SoundPool은 미리 로드(load) 해놓은 사운드를 **즉시 재생(play)**하는 방식으로 반응 속도를 높여 줍니다.
혹시 이 게임 앱의 스코어 초기화 기능을 다시 한번 확인해 보고 싶으신가요?
댓글
댓글 쓰기