2012-03-06 38 views
5

Có khoảng 60 mẫu âm thanh trong đơn đăng ký của tôi. Tôi phải chơi nó với độ chính xác cao trong thời gian. 5ms sẽ mater. Âm thanh phải phát để phản hồi hành động của người dùng. Vì vậy, tôi không biết những gì âm thanh sẽ chơi tiếp theo. Tôi nghĩ rằng aboud precreating của SoundEffectInstance cho tất cả các âm thanh. Việc tạo ra SoundEffectInstance có mất thời gian và bộ nhớ không? Có đầy đủ bản sao của SoundEffect trong bộ nhớ hay chỉ một số thông tin con trỏ. Tôi có thể cải thiện ứng dụng của mình nếu tôi sẽ xử lý trước SoundEffectInstances không? Có cách nào khác để chơi mẫu càng sớm càng tốt trong XNA?Cách phát âm thanh càng sớm càng tốt?

+0

Bạn có cần tất cả âm thanh vào bất kỳ lúc nào trong ứng dụng hoặc có âm thanh được gán cho các màn hình khác nhau không? – Msonic

+0

Rất ít bộ bằng 60 âm thanh.Người dùng chọn đặt sau đó có thể là bất kỳ âm thanh nào từ bộ – xander27

Trả lời

3

A SoundEffect chứa dữ liệu dạng sóng thực tế. Nó sử dụng một lượng lớn bộ nhớ (nhiều như dữ liệu dạng sóng yêu cầu).

Một SoundEffectInstance là một đối tượng nhỏ, chứa dữ liệu về phát lại (vị trí, âm lượng, v.v ...) và một nút điều khiển cho "giọng nói" đã được phân bổ để phát lại.

Khi bạn sử dụng SoundEffect.Play, nội bộ nó tạo ra một SoundEffectInstance. Nó cũng có thể bơi các trường hợp này - vì vậy nó không cần phải tạo lại chúng trên các cuộc gọi tiếp theo.

Tạo SoundEffectInstance mất một chút thời gian và bộ nhớ. Đối với hiệu ứng âm thanh trong một trò chơi đang chạy ở 30FPS (33ms trên mỗi khung hình), độ trễ liên quan sẽ không đáng kể.


Nếu bạn đang cố gắng để phát lại âm nhạc trình tự bằng cách trộn hiệu ứng âm thanh lại với nhau khác nhau, nơi mà thậm chí 5ms vấn đề, bạn cần phải thực hiện trộn âm thanh của riêng bạn sử dụng DynamicSoundEffectInstance. Điều này sẽ đảm bảo rằng âm thanh được đồng bộ hóa xuống mẫu.


Nếu bạn đang cố gắng tạo một số loại "công cụ" có thể phát trong thời gian thực và bạn đang cố gắng giảm độ trễ đầu vào-đầu ra xuống 5ms - sau đó bỏ cuộc. 5ms là vô lý tốt và thường đòi hỏi thiết bị và phần mềm chuyên dụng.

Tuy nhiên, nếu bạn cần giảm độ trễ đầu vào-đầu ra của mình tốt nhất có thể, bạn có thể nhập cuộc thăm dò ý kiến ​​thường xuyên hơn một lần cho mỗi khung hình. Và bạn vẫn có thể sử dụng DSEI. Tôi không chắc chắn nếu DSEI có một kích thước bộ đệm phát lại cấu hình, nhưng nếu nó bạn nên làm cho nó càng nhỏ càng tốt mà không cần giới thiệu âm thanh trục trặc.

2

Khi người dùng chọn một bộ, bạn nên tải các hiệu ứng âm thanh đó vào từ điển, vì vậy việc truy cập chúng sẽ nhanh hơn sau này.

Tuy nhiên, bạn không nên tải tất cả các hiệu ứng âm thanh, đặc biệt là những hiệu ứng bạn không cần trong một màn hình hoặc bộ nhất định. Ngoài ra, bạn nên dỡ bỏ các hiệu ứng âm thanh mà bạn sẽ không cần nữa.

Cần có thời gian để tải các hiệu ứng âm thanh đó, tùy thuộc vào kích thước và số lượng bạn muốn tải. Tôi khuyên bạn nên tạo một màn hình tải cơ bản để tải/dỡ nội dung trong trò chơi của bạn (hầu hết các trò chơi đều làm theo cách đó). Bạn sẽ được tải soundeffect (định dạng wav tôi đoán?) Trong bộ nhớ, không chỉ là một con trỏ, vì vậy đó là lý do tại sao hiệu ứng âm thanh cần phải được giữ ngắn.

Hiệu ứng âm thanh đã tải sẽ phát rất nhanh (độ trễ không thể nhận thấy). Tính năng tải trước sẽ tăng hiệu suất của ứng dụng là với chi phí sử dụng bộ nhớ.

+0

Tôi sẽ cần tải trước đối tượng SoundEffectIstance cho mọi âm thanh hoặc chỉ SoundEffect? – xander27

+1

Tôi tìm thấy có [link] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffect.aspx) rằng ** "Tất cả các đối tượng SoundEffectInstance được tạo từ một tài nguyên bộ nhớ chia sẻ SoundEffect "**. Vì vậy, tôi có thể tạo bất kỳ số lượng 'SoundEffectInstance' – xander27

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