What is unity native audio plugin SDK?

Optimer Lyd i Unity: Native Plugins og Lav Latens

23/06/2024

Rating: 4.19 (12149 votes)

I spiludvikling er lydkvalitet og responsivitet afgørende for at skabe en fordybende og engagerende oplevelse. Unity, som en af de mest populære spilmotorer, tilbyder omfattende lydfunktioner, men for udviklere, der søger at skubbe grænserne for ydeevne og tilpasning, er native lydløsninger uundværlige. Denne artikel dykker ned i Unity Native Audio Plugin SDK og den mere specialiserede tilgang, der kaldes Native Audio, for at give dig en dybdegående forståelse af, hvordan du kan optimere lyd i dine Unity-projekter, især med fokus på at reducere latens på mobile platforme.

Does unity use audiotrack vs native audio?
When Unity started and when Native Audio initialized it logs the same thing about AudioTrack since ultimately both mine and Unity uses AudioTrack. Then it is possible to compare what Unity instruct Android to do vs. what I programmed Native Audio to create an AudioTrack. Left : short while after a Unity game starts.
Indholdsfortegnelse

Hvad er Unity Native Audio Plugin SDK?

Unity Native Audio Plugin SDK er et kraftfuldt værktøj, der giver udviklere mulighed for at skabe brugerdefinerede lydbehandlingseffekter (DSP) og tilknyttede grafiske brugerflader (GUI'er) direkte i C eller C++. I modsætning til Unitys indbyggede lydkomponenter, der primært er designet til generel brug, giver dette SDK enestående kontrol over lydbehandlingskæden. Det er ideelt til at implementere avancerede effekter som sofistikerede equalizere, multibånds kompressorer, ringmodulatorer eller endda fuldgyldige synthesizere, der kræver høj ydeevne og lavt niveau adgang til lyddata.

Arkitektur og Udvikling

SDK'et består af to hoveddele: den native DSP-plugin (typisk en .dll på Windows eller .dylib på OSX) og den valgfrie C#-baserede GUI. Den native del håndterer den faktiske lydbehandling, mens C#-delen giver en tilpasset brugergrænseflade i Unity-editoren til at styre plugin'ens parametre. Udviklingsprocessen begynder med at definere plugin'ens parametre ved hjælp af enkle enum-værdier og registrere dem med Unity. Callback-funktioner som CreateCallback, ProcessCallback og ReleaseCallback er kernen i plugin'ens funktionalitet, der håndterer instansiering, lydbehandling og frigivelse af ressourcer.

En vigtig funktion er muligheden for at synkronisere effekter med DSP-uret via parameteren state->dsptick i ProcessCallback. Dette gør det muligt at skabe temposynkroniserede effekter eller synthesizere, der følger spillets interne timing, hvilket er afgørende for musikbaserede spil eller interaktive lydlandskaber. Plugin'er kan returnere UNITY_AUDIODSP_OK for succesfuld udførelse, hvilket indikerer problemfri integration med Unitys lydmotor.

Platformkompatibilitet og Indlæsning

Native audio-plugins skal kompileres specifikt for hver målplatform, hvilket sikrer optimal ydeevne. På iOS linkes plugin-koden statisk ind i Unity-binærfilen, mens på Windows og OSX indlæses plugins dynamisk. For at Unity automatisk kan detektere og indlæse et native audio-plugin ved opstart, skal dets DLL-filnavn starte med "audioplugin" (case-insensitivt). Dette sikrer, at effekterne er tilgængelige, før Unity begynder at oprette mixer-aktiver, der måtte afhænge af dem.

Native Audio: En Vej til Ultralav Latens på Mobile Enheder

Mens Unity Native Audio Plugin SDK fokuserer på tilpassede lydeffekter, adresserer 'Native Audio'-tilgangen (ofte implementeret som et separat plugin eller bibliotek) et mere specifikt og kritisk problem: høj lydlatens på mobile platforme. Unitys standardlydpipeline, som ofte er baseret på FMOD, er designet til fleksibilitet og brugervenlighed, men introducerer uundgåeligt en vis forsinkelse. For spiltyper som rytmespil, responsive UI-lyde eller præcise skudlyde kan selv små forsinkelser forringe brugeroplevelsen markant.

Årsager til Latens i Unitys Standardlyd

Unitys lydsystem udfører mange operationer, der bidrager til latens:

  • Intern mixing: Unity mixer alle samtidige lyde internt, før de sendes til operativsystemet. Dette giver ubegrænset samtidighed, men kræver en buffer og forsinkelse.
  • Sikre indstillinger: Unity initialiserer ofte native lydkilder med sikre, men ikke altid lav-latens indstillinger.
  • Komfortfunktioner: Funktioner som AudioMixerGroup, volumenfadere, effekter og spatialisering tilføjer behandlingslag, der kræver ventetid.
  • Standardiseret samplingsfrekvens: Unity kan omdanne lyd til en standardiseret samplingsfrekvens (f.eks. 24000Hz på Android), hvilket kan introducere yderligere forsinkelse og endda kvalitetsforringelse, hvis enheden foretrækker en anden frekvens.

Hvordan Native Audio Reducerer Latens

Native Audio-tilgangen omgår Unitys interne pipeline ved at interagere direkte med operativsystemets native lydbiblioteker. Dette opnås ved:

  • Uafhængige lydkilder: Anmodning om flere uafhængige native lydkilder fra operativsystemet, helt adskilt fra den Unity bruger.
  • Direkte dataadgang: Eksport af AudioClip-data til et hukommelsesområde, som den native side kan læse direkte.
  • Øjeblikkelig afspilning: Signalering fra C# til den native side for at afspille lyden øjeblikkeligt, uden at vente på slutningen af en frame eller intern mixing. Dette er en "ingen mixing"-politik for de mest kritiske lyde.
  • Begrænset samtidighed: Da der ikke er nogen mixing, er antallet af samtidige lyde begrænset af antallet af native lydkilder, der kan allokeres (f.eks. typisk 7 "hurtige" lydspor og op til 32 samlede spor på Android).

Denne tilgang er primært understøttet på iOS og Android (fra Unity 2019.4 LTS eller nyere), og den fungerer kun ved runtime, ikke i Unity-editoren.

Does unity support native audio?
Unity won't let you use only a subset of its hard-wired audio pipeline. But with Native Audio we can go native and make as much compromises as we want. Simplify, take dirty shortcuts, and aim for the lowest latency. Sacrificing functions and convenience that Unity was designed for as a friendly game engine.

Native Audio på Android: Fokus på Høj Ydeevne

Android er berygtet for sin varierende lydlatens, og Native Audio-løsninger følger ofte Googles bedste praksis for at opnå højtydende lyd. Dette inkluderer:

  • Brug af OpenSL ES (C/NDK): I stedet for Java-baserede API'er som MediaPlayer eller SoundPool, der kan introducere mere latens.
  • "Fast Track"-lyd: Sikring af, at lydspor instansieres på hardwareniveau som "Fast Track"-lyd. Dette kræver nøje overholdelse af visse betingelser, herunder matchning af enhedens native samplingsfrekvens og bufferstørrelse.
  • Indbygget resampler: Dynamisk omsampling af lyddata for at matche enhedens foretrukne samplingsfrekvens (f.eks. 44100Hz eller 48000Hz), hvilket er afgørende for at opnå "Fast Track"-status.
  • Nul-polstret hukommelse: Sikring af, at længden af lyddata er et eksakt multiplum af enhedens native bufferstørrelse for at minimere jitter og sikre konsistent planlægning.
  • Dobbelt buffering: For at lydafspilning kan starte så hurtigt som muligt.

Native Audio kan endda udkonkurrere naivt kodet native Android-apps med hensyn til latens, fordi den overholder alle disse best practices. Det er en "barebone"-tilgang, der ofrer mange af Unitys indbyggede lydfunktioner for at opnå den absolut laveste latens.

Sammenligning af Android Lyd API'er

Flere API'er kan bruges til lyd på Android, men Native Audio vælger OpenSL ES (og potentielt AAudio i fremtiden) af specifikke grunde:

APIKarakteristikLatensNative Audio Tilgang
MediaPlayer (Java)Højere niveau, multimedieafspilning, mange funktioner.Høj (ikke til lav latens)Undgås
SoundPool (Java)Pool af lyde, automatisk sporstyring, flere funktioner (f.eks. afspilningshastighed).Bedre end MediaPlayer, men langsommere end OpenSL ES for kritiske lyde.Ikke valgt pga. potentiel latens og mindre kontrol over "Fast Track".
(Java) AudioTrackLaveste Java-niveau, direkte bufferkontrol.Næsten lig OpenSL ES, men C# til Java "bro" kan tilføje latens.Erstattet af OpenSL ES for direkte C-kommunikation og bedre "Fast Track"-kontrol.
OpenSL ES (C/NDK)Laveste C-niveau, direkte til Hardware Abstraction Layer (HAL).Meget lav, foretrukket for høj ydeevne.Valgt af Native Audio for at opnå "Fast Track" og lavest mulige latens.
AAudio (C/NDK)Nyere API (Android Oreo+), designet til høj ydeevne.Potentielt endnu lavere end OpenSL ES (især i "EXCLUSIVE"-tilstand).Fremtidig overvejelse for Native Audio.

Benchmarking af Latens

Målinger viser en dramatisk reduktion i latens med Native Audio. For eksempel kan en lyd, der tager 321.2 ms at afspille med Unitys standardindstillinger på en Xiaomi Mi A2, reduceres til 78.2 ms med Native Audio – en forbedring på over 75%. Selvom disse tal varierer mellem enheder, viser den relative forbedring tydeligt Native Audios effektivitet. Det er vigtigt at bemærke, at Unitys "Best Latency"-indstillinger blev brugt til sammenligning, men selv da er Native Audio markant hurtigere.

Eksempel på latensreduktion (ms):

EnhedUnity Standard (ms)Native Audio (ms)Forbedring (%)
Xiaomi Mi A2 (2018)321.278.2-75.65%
Xperia Z5 (2015)120.669.0-42.79%
Samsung Galaxy Note 8 (2017)263.665.6-75.11%
iPod Touch Gen 5 (2012)94.658.8-37.84%

Denne markante forbedring skyldes den direkte adgang til operativsystemets lydhardware og undgåelse af unødvendige mellemlag.

Håndtering af Native Lydspor og Ressourcer

Operativsystemer, især Android, har begrænsninger for antallet af native lydspor (AudioTrack-instanser), der kan allokeres. Der er en hard limit på 7 "Fast Track"-spor per enhed og typisk en samlet grænse på 32 spor. Native Audio allokerer typisk et lille antal (f.eks. 3-4) spor ved opstart for at sikre lav latens og effektiv ressourceudnyttelse. Overallokering af spor kan føre til, at andre apps mister lyd, eller at dine egne spor bliver "døde" ved tilslutning/frakobling af hovedtelefoner.

En vigtig optimering i Native Audio er den "altid-spillende" tilgang, hvor sporene konstant "spiller" stilhed, selv når der ikke er nogen aktiv lyd. Dette forhindrer den latens og potentielle frame rate-fald, der kan opstå ved gentagen start og stop af lydspor, som nogle Android-enheder reagerer negativt på. Det er en afgørende detalje for ydelse og stabilitet.

Derudover skal native lydløsninger være opmærksomme på "wake locks" på Android. Hvis native lydkilder ikke frigives, når appen minimeres, kan det dræne batteriet og signalere dårlig opførsel til Play Store. Native Audio (fra v4.3.0+) håndterer dette ved at frigive ressourcer ved minimering og genoprette dem ved maksimering.

Hvornår skal man bruge hvad?

Valget mellem Unitys indbyggede lydsystem, Native Audio Plugin SDK og en specialiseret Native Audio-tilgang afhænger af dine projektbehov:

  • Unitys Standardlyd: Ideel til de fleste spil, hvor brugervenlighed, fleksibilitet og rigtige funktioner (mixere, effekter, spatialisering) er vigtigere end absolut minimum latens. Fungerer på tværs af alle platforme uden yderligere kode.
  • Unity Native Audio Plugin SDK: Brug dette, når du har brug for at implementere unikke og komplekse lydeffekter eller DSP-pipelines, der ikke er tilgængelige i Unitys standardbibliotek. Det giver dybdegående kontrol over lydbehandlingen og er velegnet til Windows- og OSX-baserede projekter, hvor du ønsker at tilføje dit eget "hemmelige våben" inden for lyd.
  • Native Audio (lav latens): Dette er løsningen, når responsivitet i realtid er absolut kritisk, især på mobile enheder (iOS/Android). Tænk på rytmespil, præcise UI-feedback-lyde, eller enhver situation, hvor en forsinkelse på selv få millisekunder forringer oplevelsen. Vær dog opmærksom på, at det kommer med afvejninger i form af begrænset samtidighed og færre indbyggede funktioner sammenlignet med Unitys fulde mixerstak.

Ofte Stillede Spørgsmål

Hvad er den primære fordel ved Native Audio sammenlignet med Unitys standardlyd?

Den primære fordel er markant reduceret lydlatens, især på mobile enheder (iOS og Android). Dette giver en mere responsiv og direkte lydoplevelse, hvilket er afgørende for spiltyper, hvor timing er vigtig.

What is unity_audiodsp_OK?
if(valuestr != NULL) valuestr = 0; return UNITY_AUDIODSP_OK; It simply enables reading an array of floating-point data from the native plug-in. Whatever that data is, the plug-in system doesn’t care about, as long as the request doesn’t massively slow down the UI or the native code.

Understøtter Native Audio Plugin SDK alle platforme?

SDK'et understøtter primært Windows og OSX for udvikling af custom DSP-plugins. På iOS skal plugin-koden statisk linkes. Den specifikke Native Audio-tilgang til lav latens er dog fokuseret på iOS og Android.

Kan jeg bruge Unitys AudioMixerGroup og effekter med Native Audio?

Nej. Native Audio omgår Unitys interne mixerpipleine for at opnå lavest mulig latens. Dette betyder, at funktioner som AudioMixerGroup, volumenfadere og Unitys indbyggede effekter ikke kan bruges direkte med Native Audio-spor. Du skal administrere volumen og grundlæggende effekter på den native side.

Hvor mange samtidige lyde kan jeg afspille med Native Audio?

Antallet er begrænset af de native lydspor, operativsystemet kan allokere. Typisk er der en grænse på 7 "Fast Track"-spor og op til 32 samlede spor per enhed. Det anbefales at allokere et lille antal (f.eks. 3-5) spor for kritiske lyde og lade Unitys standardlyd håndtere mindre kritiske lyde med højere samtidighed.

Er der en kvalitetsforbedring med Native Audio udover latensreduktion?

Ja, potentielt. Unitys standardlyd på Android kan i nogle tilfælde nedgradere lydkvaliteten ved at omsample til en fast frekvens (f.eks. 24000Hz). Native Audio bevarer ofte den oprindelige lydkvalitet eller omsampler kun for at matche enhedens native samplingsfrekvens, hvilket kan resultere i en renere lyd.

Hvad sker der, hvis jeg overallokerer native lydspor?

Overallokering kan føre til, at din app eller andre apps på enheden mister lyd. Operativsystemet har en hård grænse for det samlede antal spor, og hvis du overskrider denne, kan nye lydspor ikke oprettes, hvilket resulterer i stilhed. Det kan også føre til problemer med "døde spor" ved tilslutning/frakobling af hovedtelefoner.

Konklusion

At mestre lyd i Unity handler ikke kun om at tilføje lydeffekter, men også om at sikre, at de leveres med den rette præcision og responsivitet. Unity Native Audio Plugin SDK giver dig frihed til at skabe skræddersyede, højtydende lydeffekter, mens den dedikerede Native Audio-tilgang tilbyder en banebrydende løsning på lydlatensproblemer på mobile enheder. Ved at forstå disse værktøjer og deres afvejninger kan du skabe en lydoplevelse, der ikke blot er rig og fordybende, men også øjeblikkelig og tilfredsstillende for dine spillere. Dette er næste skridt mod at levere en sandt professionel lydoplevelse i dine Unity-spil.

Hvis du vil læse andre artikler, der ligner Optimer Lyd i Unity: Native Plugins og Lav Latens, kan du besøge kategorien Teknologi.

Go up