În dezvoltarea jocului Hangman Hints, am realizat rapid că sunetul nu este doar un detaliu, ci coloana vertebrală a feedback-ului de joc. Inițial, am folosit expo-av, standardul pentru majoritatea aplicațiilor React Native. Însă, pentru un joc unde timing-ul este critic, expo-av s-a dovedit a fi prea lent. Am făcut trecerea la expo-audio și iată de ce această decizie a transformat experiența utilizatorului.
Problema cu expo-av în gaming
expo-av este un player multimedia generalist. Este excelent pentru streaming de podcast-uri sau redarea unui video, dar suferă de o latență considerabilă la redarea efectelor sonore scurte (SFX). Pe Android, expo-av folosește MediaPlayer, care adaugă un overhead semnificativ de buffering. În testele mele, am observat o latență de ~80ms, ceea ce face ca sunetul de „litera corectă” să pară desincronizat.
De ce expo-audio câștigă teren
expo-audio utilizează AudioTrack direct pe Android, reducând latența la aproximativ 50ms (o îmbunătățire de 30ms). Pentru un joc, acești milisecunde fac diferența dintre o interfață „nervoasă” și una „moale”.
AudioPool: Gestionarea a 8+ sunete simultane
Pentru a evita drop-out-urile, am implementat un AudioPool. Această clasă preîncarcă asset-urile și gestionează redarea concurentă.
class AudioPool {
private pool: Map<string, Audio.Sound> = new Map();
async preload(key: string, source: any) {
const { sound } = await Audio.Sound.createAsync(source);
this.pool.set(key, sound);
}
async play(key: string, priority: number) {
const sound = this.pool.get(key);
if (sound) {
await sound.setPositionAsync(0);
await sound.playAsync();
}
}
}
Sincronizarea cu Haptice
Feedback-ul multisenzorial este esențial. Folosind expo-haptics, am sincronizat vibrația cu declanșarea sunetului. Pe iOS, am configurat AVAudioEngine pentru a asigura o procesare de joasă latență.
// Configurare iOS pentru mixare corectă
await Audio.setAudioModeAsync({
playsInSilentModeIOS: true,
staysActiveInBackground: false,
interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_MIX_WITH_OTHERS,
});
Hook-ul useGameAudio
Pentru a integra totul în fluxul de lucru React, am creat un hook care folosește useReducer pentru a gestiona starea audio curentă.
export const useGameAudio = () => {
const [state, dispatch] = useReducer(audioReducer, initialState);
const playSound = async (type: 'correct' | 'wrong') => {
await audioPool.play(type, 1);
Haptics.impactAsync(type === 'correct' ?
Haptics.ImpactFeedbackStyle.Light :
Haptics.ImpactFeedbackStyle.Heavy
);
};
return { playSound };
};
Instabilitate la redări repetate
Un alt aspect pe care l-am observat în practică este că, după un număr de redări repetate ale aceluiași sunet prin AudioPool, expo-audio a început să dea erori și sunetele au încetat să mai fie redate. Nu am identificat mesajul exact de eroare, dar simptomul a fost consistent: apelurile succesive către play() funcționau corect pentru primele redări, iar apoi, după un anumit numar de repetiții, redarea sunetului pur și simplu nu mai avea efect, fără feedback vizibil în consolă. Acest tip de instabilitate este inacceptabil într-un joc, unde același sunet (de exemplu „litera corectă”) se poate declanșa de zeci de ori într-o singură sesiune.
Concluzii
Trecerea la expo-audio a rezolvat problemele de latență față de expo-av, dar, privind retrospectiv, cred că pentru acest caz de utilizare soluția optimă ar fi fost implementarea audio nativă în React Native, fără a depinde de wrapper-ele Expo. Un modul nativ scris direct pentru platformă elimină stratul intermediar impus de API-ul Expo și oferă acces neîngrădit la AudioTrack pe Android și AVAudioEngine pe iOS, fără limitările de configurare pe care le-am întâlnit cu expo-audio. Pentru un joc precum Hangman Hints, unde fiecare milisecundă contează, aceasta rămâne, în opinia mea, alegerea potrivită — cu prețul unui efort mai mare de întreținere și al pierderii comodității oferite de Expo.
În final, partea de sunet a fost portată pe react-native-audio, acum nu mai există erori la redarea sunetelor.
Dacă dezvolți un joc unde feedback-ul sonor este critic, nu te limita la ce oferă Expo. Investește în implementare nativă și vei avea control complet asupra performanței audio.

