2013-08-16 44 views
5

Tôi đã tạo một lớp nút để kiểm tra xem nút có được chọn hay không (khi chuột di chuột qua nút). Khi nút được chọn, không được chọn hoặc nhấp vào nút đó sẽ phát tệp wav. Vấn đề là có sự chậm trễ lớn giữa việc phát âm thanh và trạng thái của nút thay đổi. Chương trình nên kiểm tra mọi khung hình để xem liệu các điều kiện cho âm thanh để chơi đã được đáp ứng nhưng fps dường như không phải là vấn đề (60 và 600 khung hình/giây cho cùng một độ trễ). Tôi đã thử giảm giá trị bộ đệm trong pygame.mixer.init() nhưng điều đó cũng cho thấy không có sự khác biệt.Pygame - Độ trễ âm thanh

file âm thanh:

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] 

Tạo đối tượng:

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

Mã từ lớp nút để kiểm tra nếu nút được chọn (đây là bên trong phương pháp .display được gọi là mỗi khung) :

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 

Mã từ lớp nút kiểm tra xem nút được click (đây là bên trong phương pháp .clickEvent được gọi khi nút chuột trái được nhấp):

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

Vì vậy, câu hỏi của tôi là: Tại sao lại có một sự chậm trễ lâu và tôi có thể làm cho nó ngắn hơn?

Trả lời

10

Tôi cũng gặp sự cố với âm thanh bị trễ. Tôi thấy rằng gọi pygame.mixer.pre_init() trước pygame.init() giải quyết vấn đề của tôi:

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

Tôi vẫn nhận được độ trễ âm thanh. – Guney

+0

Tôi cũng vậy, mặc dù nó giảm từ 0,4 đến 0,3 s. Vẫn tự hỏi ** tại sao ** sự chậm trễ xảy ra. – Lewistrick

1

Trong trường hợp của tôi sự chậm trễ là giữa 0,2 và 0,5 giây. Để gọi pygame.mixer.pre_init() là một giải pháp rất tốt nhưng độ trễ cũng phụ thuộc vào các giá trị đã cho.

1

Tìm thấy câu trả lời được đăng trong một question khác, đề xuất thay đổi kích thước bộ đệm.

5

Tôi biết điều này là cũ, nhưng tôi đã tìm thấy giải pháp tốt nhất mà tôi đã thấy cho đến thời điểm này.

Khắc phục khá đơn giản. Tôi sử dụng để có sự chậm trễ trong các dự án pygame của tôi tất cả các thời gian vì tôi sẽ khởi tạo pygame trước khi khởi tạo máy trộn. (mà luôn luôn có vẻ như cách bạn nên làm điều đó với tôi).

Tuy nhiên nếu bạn khởi tạo bộ trộn trước khi khởi động chính pygame, nó sẽ loại bỏ mọi sự chậm trễ. Điều này cố định tất cả các vấn đề chậm trễ của tôi. hy vọng nó giúp.

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

điều này đã khắc phục được sự cố của tôi, cảm ơn! – Macumbaomuerte

0

Giảm kích thước bộ đệm sẽ giảm độ trễ. Các bộ đệm phải là một sức mạnh của 2. Các bộ đệm mặc định là 4096, nhưng bạn có thể thay đổi nó khi bạn khởi tạo máy trộn như hình dưới đây:

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

Thông tin thêm có thể được tìm thấy trên pygame docs

1

Tôi đã có một âm thanh chậm trễ, quá.Bây giờ, điều này hoạt động tốt đối với tôi:

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

Với pg.mixer.pre_init(22100, -16, 2, 64) âm thanh đóng nhanh hơn nhưng được xoắn, okay cho hiệu ứng âm thanh nhưng không phải cho âm nhạc thực sự làm nền.

Các vấn đề liên quan