10

ボタンが選択されているかどうかをチェックするボタン クラスを作成しました (マウスがボタンの上に置かれている場合)。ボタンを選択、選択解除、またはクリックすると、wav ファイルが再生されます。問題は、サウンドの再生とボタンの状態の変化の間に大きな遅延があることです。プログラムはすべてのフレームをチェックして、サウンドを再生するための条件が満たされているかどうかを確認する必要がありますが、fps は問題ではないようです (60 fps と 600 fps で同じ遅延が発生します)。のバッファ値を減らしてみましたpygame.mixer.init()が、それでも違いはありません。

サウンド ファイル:

buttonSoundSelect = pygame.mixer.Sound(os.path.join(soundPath, "button1.wav"))
buttonSoundUnselect = pygame.mixer.Sound(os.path.join(soundPath, "button2.wav"))
buttonSoundClick = pygame.mixer.Sound(os.path.join(soundPath, "button3.wav"))
buttonSounds = [buttonSoundSelect, buttonSoundUnselect, buttonSoundClick]

オブジェクトの作成:

playButton = button(textInactive = "Play", font = mainFont, sounds = buttonSounds,  command = playAction)

ボタンが選択されているかどうかを確認するボタン クラスのコード (これは、.displayフレームごとに呼び出されるメソッド内にあります):

    if pygame.mouse.get_pos()[0] >= self.x and pygame.mouse.get_pos()[0] <= self.x + self.width and \
       pygame.mouse.get_pos()[1] >= self.y and pygame.mouse.get_pos()[1] <= self.y + self.height:

        self.surfaceActive.blit(self.textSurfaceActive, (self.width / 2 - self.font.size(self.textActive)[0] / 2,
                                                   self.height / 2 - self.font.size(self.textActive)[1] / 2))

        self.surface.blit(self.surfaceActive, (self.x, self.y))

        if self.selected == False:
            if self.sounds != None:
                self.sounds[0].stop()
                self.sounds[1].stop()
                self.sounds[2].stop()
                self.sounds[0].play()
            self.selected = True

    else:

        self.surfaceInactive.blit(self.textSurfaceInactive, (self.width / 2 - self.font.size(self.textInactive)[0] / 2,
                                                     self.height / 2 - self.font.size(self.textInactive)[1] / 2))

        self.surface.blit(self.surfaceInactive, (self.x, self.y))

        if self.selected == True:
            if self.sounds != None:
                self.sounds[0].stop()
                self.sounds[1].stop()
                self.sounds[2].stop()
                self.sounds[1].play()
            self.selected = False

ボタンがクリックされたかどうかをチェックするボタン クラスのコード (これは.clickEvent、マウスの左ボタンがクリックされたときに呼び出されるメソッド内にあります):

    if self.command != None:

        if pygame.mouse.get_pos()[0] >= self.x and pygame.mouse.get_pos()[0] <= self.x + self.width and \
           pygame.mouse.get_pos()[1] >= self.y and pygame.mouse.get_pos()[1] <= self.y + self.height:    

            if self.sounds != None:
                self.sounds[2].play()
            self.command()

だから私の質問は、なぜ長い遅延があるのですか?それを短くすることはできますか?

4

7 に答える 7

17

また、音の遅れにも問題がありました。pygame.mixer.pre_init()私の問題を解決する前に呼び出すことがわかりましたpygame.init()

pygame.mixer.pre_init(44100, -16, 1, 512)
pygame.init()
于 2013-08-29T14:13:04.857 に答える
14

これが古いことは知っていますが、これまでに見た中で最良の解決策を見つけました。

修正は実際には非常に簡単です。以前は、ミキサーを初期化する前に pygame を初期化していたため、常に pygame プロジェクトで遅延が発生していました。(これは、私には常にあなたがすべき方法のように思えました)。

ただし、pygame 自体を初期化する前にミキサーを初期化すると、すべての遅延が取り除かれます。これにより、すべての遅延の問題が修正されました。それが役に立てば幸い。

pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.mixer.init()
pygame.init()
于 2015-12-16T23:51:21.130 に答える
11

バッファのサイズを小さくすると、レイテンシが減少します。バッファーは 2 の累乗でなければなりません。デフォルトのバッファーは 4096 ですが、以下に示すように、ミキサーを初期化するときに変更できます。

pygame.mixer.init(44100, -16, 2, 64)

詳細については、pygame のドキュメントを参照してください。

于 2016-04-01T22:09:05.887 に答える
1

私の状況では、遅延は 0.2 ~ 0.5 秒でした。pygame.mixer.pre_init() を呼び出すことは非常に良い解決策ですが、遅延は指定された値にも依存します。

于 2014-02-25T18:30:20.930 に答える
1

別の質問に投稿された回答が見つかりました 。これは、バッファー サイズの変更を提案しています。

于 2015-08-04T13:31:54.407 に答える