Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 2337
Jeg lager noen små spill til iPad, og skriver i Xcode.

Jeg kjører denne metoden for å spille av korte MP3-filer:

Kode

- (void) startLyd{
    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *filePath = [mainBundle pathForResource:@"plassere" ofType:@"mp3"];
    NSData *fileData = [NSData dataWithContentsOfFile:filePath]; NSError *error = nil;
    self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData error:&error];
    [self.audioPlayer prepareToPlay]; [self.audioPlayer play];
}
Da fryser iPaden i noen tideler hver gang lyden lages. Jeg skjønner ikke hele koden selv, har bare googlet for å finne noe som funker. Hjelper det å flytte noe over til "View did load"? I så fall hva?
Mulig jeg er på bærtur da jeg ikkje har erfaring fra IOS utvikling. Men at lyden lagger hver gang den spilles av kan tyde på at lyden spilles av fra samme thread som resten av koden din kjører på. For da må appen vente på at lyden blir spilt av før den kan fortsette.

Løsningen min vil være å lage en egen thread for hver lyd som skal spilles av. Enkelt forklart:
  1. Start ny thread.
  2. La threaden ta seg av avspillingen av lyden.
  3. Avslutte thread.
▼ ... over en måned senere ... ▼
Denne koden er en egen metode, eller thread, om du vil. Problemet er at alle andre oppgaver tar pause i et par tideler mens denne metoden startes. Andre forslag? Hjelper det å gå over til Swift for dere som bruker det?
Sist endret av hinsidige; 21. desember 2015 kl. 17:10.
Så vidt jeg vet er ikke metoder automatisk asynkrone i objective-c hvis det er det du mener. Hvis du faktisk starter en egen tråd for avspillingen og programmet likevel henger bør du se om du har noe annet som kan forårsake at det går treigt å spille av lydfilen, f.eks å laste lydfilen i minne på forhånd eller om det er noen locks som kan være årsaken.
Sitat av hinsidige Vis innlegg
Denne koden er en egen metode, eller thread, om du vil. Problemet er at alle andre oppgaver tar pause i et par tideler mens denne metoden startes. Andre forslag? Hjelper det å gå over til Swift for dere som bruker det?
Vis hele sitatet...
Methoder og threads er ikke synonymer. Methode er en funksjon som tilhører og behandler data tilhørende en klasse. Threads gir deg muligheten til å kjøre koden parallelt eller asynkront med main threaden. Du kan lese mer om det her: https://developer.apple.com/library/...roduction.html
Alloker og initialiser i viewdidload f.eks, og spill den av når det trengs.
Da unngår du det du kan av lag når den skal spilles av.

Se eksempel her
http://stackoverflow.com/questions/2...-avaudioplayer
▼ ... over en uke senere ... ▼
Nja, har funnet en løsning jeg kan leve med nå.

Jeg har flere lyder, og de spilles av i hytt og pine. Problemet løses ikke helt ved å kjøre som vist i eksempelet til b1rken. Når en ny level starter, kommer det likevel en forsinkelse ved første behov for lyd. Kan det skyldes at appen har "nullstilt" AV-playeren når den har jobbet mye med flytting av images, endring av farger og størrelse på alt mulig, oppdatering av labels, +++ ?

Men jeg løser problemet slik: Når spillet eller en ny level starter, spilles en annen lyd. Om denne fører til forsinkelse, vil ingen merke det. Appen er uansett klar til umiddelbart spiller andre lyder like etterpå, f.eks. som en metode når to imager krasjer.