Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Как правильно воспроизводить звуки на iOS

Использую SpriteKit и все хорошо, если выключить звуки то показывает практически стабильные 60fps. Но стоит включить звуки, как начинаются неприятные просадки на 2-3-4-5 кадров во время воспроизведения звуков, которые особо ничего не портят, но при этом создают неприятные микрофризы, чувствуется что не хватает плавности.
Собственно воспрос: как выводить звуки на iOS/SpriteKit без потери fps?
Изначально я использовал для воспроизведения SKAudioNode без dispatch, и просадки были значительными, потом переделал под следующий вид:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
SKAudioNode *newAudio = [[SKAudioNode alloc] initWithFileNamed:nameSound]; [newAudio runAction:[SKAction changeVolumeTo:1.0 duration:0]]; newAudio.autoplayLooped = false;
dispatch_async(dispatch_get_main_queue(), ^{ [scene addChild:newAudio]; [newAudio runAction:[SKAction play]]; }); });
После этого изменения стало намного лучше, но все равно, как выше написал, остались неприятные просадки от которых хотелось бы избавиться. Если вообще убрать воспроизведение звуков, то стабильные 60fps.
Пробовал так же воспроизводить звуки через AVAudioPlayer, но получалось хуже чем с SKAudioNode, просадки были еще больше.


Ответ

Я юзаю AVAudioPlayer
Каких-то проседаний фпс именно из-за звука пока не замечал. Раньше юзал SKAction.playSoundFile... и вот там не фпс проседал, а игра фризилась при первом воспроизведении звука из-за того что я создавал экш при каждом создании ноды. Решается простым вынесением экшна в проперти и последующем его применении к объекту.
Через SKAction'ы
Property:
let soundAction: SKAction = SKAction.playSoundFileNamed("nameOfFile.wav", waitForCompletion: false)
В методе, в котором нужно воспроизвести звук:
run(soundAction)
Через AVAudioPlayer:
var musicPlayer: AVAudioPlayer?
let url = Bundle.main.url(forResource: filename, withExtension: nil)
musicPlayer = AVAudioPlayer(contentsOf: url!)
if let player = musicPlayer { player.numberOfLoops = -1 player.prepareToPlay() player.play() }

Комментариев нет:

Отправить комментарий