2013-08-16 288 views
5

我做了一個按鈕類,檢查是否選擇了一個按鈕(當鼠標懸停在按鈕上)。當按鈕被選中時,取消選中或點擊它播放一個wav文件。問題在於聲音播放和按鈕狀態改變之間存在巨大的延遲。程序應該檢查每一幀,看看是否符合聲音播放的條件,但fps似乎不是問題(60和600 fps給出相同的延遲)。我已經嘗試減少pygame.mixer.init()中的緩衝區值,但這也顯示沒有區別。pygame - 聲音延遲

聲音文件:

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() 

所以我的問題是: 爲什麼會出現長時間的延遲,我可以把它縮短?

回答

10

我也有聲音滯後的問題。我發現,調用pygame.mixer.pre_init()之前pygame.init()解決我的問題:

pygame.mixer.pre_init(44100, -16, 1, 512) 
pygame.init() 
+0

我仍然有聲滯後。 – Guney

+0

我也是,儘管它從0.4下降到0.3秒。仍然想知道爲什麼**延遲發生。 – Lewistrick

1

在我的情況下延遲爲0.2和0.5秒之間。 調用pygame.mixer.pre_init()是一個很好的解決方案,但延遲也取決於給定的值。

1

發現在另一個 question張貼答案,建議更改緩衝區大小。

5

我知道這是舊的,但我發現迄今爲止我所見過的最佳解決方案。

實際上這個修復很簡單。我以前一直都在推遲pygame項目,因爲我會在初始化調音臺之前初始化pygame。 (這總是你應該對我做的方式)。

但是,如果您在初始化pygame之前初始化調音臺,它將消除所有延遲。這固定了我所有的延遲問題。希望能幫助到你。

pygame.mixer.pre_init(44100, -16, 2, 2048) 
pygame.mixer.init() 
pygame.init() 
+0

這解決了我的問題,謝謝! – Macumbaomuerte

0

減小緩衝區的大小將減少延遲。該緩衝區必須是2的冪默認緩存爲4096,但是當你初始化混頻器,你可以改變它如下圖所示:

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

更多信息,可以在pygame docs

1

我有一個發現聲音延遲也是如此。現在,這個工作正常,我:

pg.mixer.pre_init(44100, -16, 1, 512) 
pg.init() 
pg.mixer.init() 

隨着pg.mixer.pre_init(22100, -16, 2, 64)聲音播放速度較快,但被扭曲,好聲音的影響,但不是真正的音樂作爲背景。