【发布时间】:2017-08-20 14:09:05
【问题描述】:
制作一个简单的 spritekit 游戏。在那里,我听到了AVFoundation 声音库所做的按钮触摸声音等声音。但是有这个麻烦。按下任何按钮时,我的帧速率总是下降,这听起来。但是,如果我将所有声音都静音,则没有延迟。这是我的代码:
import AVFoundation
class GameAudio {
static let shared = GameAudio()
private var buttonClickSound = AVAudioPlayer()
private var completionSound = AVAudioPlayer()
private var swishSound = AVAudioPlayer()
private var gridSwishSound = AVAudioPlayer()
private let Volume: Float = 0.8
func setupSounds() {
print("GameAudio setupSounds()")
if let path = Bundle.main.path(forResource: SoundNames.ButtonClickSoundName, ofType: "mp3") {
let url = URL(fileURLWithPath: path )
do {
buttonClickSound = try AVAudioPlayer(contentsOf: url)
} catch {
print(error)
}
}
if let path = Bundle.main.path(forResource: SoundNames.CompletionSoundName, ofType: "mp3") {
let url = URL(fileURLWithPath: path)
do {
completionSound = try AVAudioPlayer(contentsOf: url)
} catch {
print(error)
}
}
if let path = Bundle.main.path(forResource: SoundNames.SwishSoundName, ofType: "mp3") {
let url = URL(fileURLWithPath: path )
do {
swishSound = try AVAudioPlayer(contentsOf: url)
} catch {
print(error)
}
}
if let path = Bundle.main.path(forResource: SoundNames.GridSwishSoundName, ofType: "mp3") {
let url = URL(fileURLWithPath: path)
do {
gridSwishSound = try AVAudioPlayer(contentsOf: url)
} catch {
print(error)
}
}
buttonClickSound.volume = Volume
completionSound.volume = Volume
swishSound.volume = Volume
gridSwishSound.volume = Volume
}
func playButtonClickSound() {
buttonClickSound.play()
}
func playCompletionSound() {
completionSound.play()
}
func playSwishSound() {
swishSound.play()
}
func playGridSwishSound() {
gridSwishSound.play()
}
}
在我的 GameViewController 中,我调用 GameAudio.shared.setupSounds() 来预加载我所有的声音。
public struct Actions {
static func buttonIsTouched(_ button: SKNode, sound: Bool, completion: @escaping () -> ()) {
if button.hasActions() { return }
if sound {
GameAudio.shared.playButtonClickSound()
}
button.run(touchedButtonAction(scaleFactor: button.returnScaleFactor()), completion: completion)
}
}
class MenuNode: SKNode {
private let settings: Settings
var delegate: MenuNodeDelegate?
private let playButton = SKSpriteNode(imageNamed: SpriteNames.PlayButtonName)
private let MenuNodeTreshold: CGFloat = 12.0
init(settings: Settings) {
self.settings = settings
super.init()
setupButtons()
isUserInteractionEnabled = false
}
private func setupButtons() {
playButton.position = CGPoint(x: 0.0 - playButton.frame.size.width / 2.0 - MenuNodeTreshold / 2.0, y: 0.0)
addChild(playButton)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
if playButton.contains(location) {
Actions.buttonIsTouched(playButton as SKNode, sound: settings.sound, completion: {
self.delegate?.playButtonTouched()
})
}
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我在游戏中的所有操作都使用Actions 结构。我有buttonTouchedAction(),我在不同的节点上使用它。我用一个“播放”按钮从我的菜单中添加了一些代码。因此,例如,我在设备上运行我的游戏,它显示菜单节点,等待几秒钟然后点击按钮,在我的帧速率下降之后,我有一秒钟的延迟,然后场景切换到游戏场景。
【问题讨论】:
-
你能贴出当你的按钮被“点击”时执行的代码吗?
-
完成了斯托扬。编辑了一些额外的代码。
-
GameAudio中是否存在错误的代码实现,例如使用四个AVAudioPlayer()来代替我的声音?或者这样可以吗? -
您的 GameAudio 没问题。使用尽可能多的播放器 - 它只会影响内存使用。我认为您的 FPS 下降是由于切换场景,而不是来自播放实际声音。为了验证,只需删除切换场景的代码,并在播放声音时观察 FPS。切换场景时预期 FPS 下降是正常的,我还没有找到解决方法。
-
@Stoyan 但我只有一个场景并在两个节点之间切换 -
MenuNode和GameNode,最后一个是我所有游戏内容的所在。在我的GameNode中,我什至有这个问题,我点击形状,并且滞后在他的位置,没有切换任何节点。
标签: ios swift sprite-kit avfoundation lag