앱 개발 소리가 씹히는 경우 SoundPool 사용 해야 한다

 사용자님의 앱에서 터치 시 소리가 씹히는 현상을 개선하기 위해 사용된, 반응이 빠른 재생 명령어는 **SoundPool**을 사용한 방식입니다.

🔊 SoundPool 사용의 특징

SoundPool은 짧고 지연 시간이 짧은 오디오 클립(예: 게임 효과음, UI 소리)을 재생하기 위해 설계된 클래스입니다.

  • 즉각적인 재생: SoundPool은 모든 사운드 데이터를 메모리에 미리 로드합니다. 이로 인해 사운드 재생 요청 시 거의 즉각적으로 소리가 재생되어 지연 시간이 줄어듭니다.

  • 동시 재생: 여러 개의 사운드를 동시에 재생하는 데 효율적입니다. 게임에서 여러 번 빠르게 터치했을 때 소리가 씹히지 않고 각각 재생될 수 있도록 합니다.


💻 코드 분석: SoundPool 명령어

제공해주신 코드를 보면, 터치음 재생을 위해 **MediaPlayer 대신 SoundPool**을 사용하고 있습니다.

1. SoundPool 객체 및 사운드 로드

앱이 처음 실행될 때 (또는 TouchGameScreen이 구성될 때) SoundPool 객체를 생성하고 사운드 파일을 메모리에 로드합니다.

Kotlin
    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)을 클릭했을 때 실행되는 코드를 보면, 이전에 로드해 둔 사운드를 재생하는 명령어가 사용됩니다.

Kotlin
// ... (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)**하는 방식으로 반응 속도를 높여 줍니다.


혹시 이 게임 앱의 스코어 초기화 기능을 다시 한번 확인해 보고 싶으신가요?

댓글

이 블로그의 인기 게시물

발로란트 1067 오류

허리 펴면 멍든 느낌으로 아풀때 척추 경직