2011-09-16 25 views
5

Tôi đang tìm kiếm một vấn đề hiệu suất trong phần Vẽ mã xna của tôi cho các cửa sổ điện thoại 7 thỉnh thoảng xuất hiện sau vài giây. Có cách nào tốt nhất để gọi SpriteBatch.Begin để vẽ thứ gì đó không? Nếu nó được gọi cho mỗi vài sprites (trong mỗi lớp khi nó thu hút người chơi, nền, các đối tượng nền, ...) hoặc sẽ gọi ngay từ đầu -> vẽ mọi thứ trong tất cả các lớp con - tốt hơn cho hiệu suất?Tần suất gọi SpriteBatch.Begin() /. End()?

Trả lời

2

Bạn không nên sử dụng chúng nhiều hơn mức cần thiết, vì Begin() có nghĩa là chuẩn bị thiết bị để hiển thị sprite và End() có nghĩa là khôi phục trạng thái trước đó của nó. Điều này có thể khác nhau thông qua một số cờ trong Begin() cho biết bạn không muốn thay đổi trạng thái, và có thể làm phức tạp mã của bạn bởi vì bạn sẽ phải tự thiết lập một số trạng thái.

Thay đổi trạng thái thiết bị thường chậm và bạn nên tránh thực hiện chúng nếu không bắt buộc, chúng cũng có thể ảnh hưởng đến bất kỳ thứ gì bạn đang làm, vì vậy nếu bạn muốn hiển thị thứ gì đó không có trong SpriteBatch, bạn nên gọi End(), bạn đang render sprites bạn nên gọi nó một lần cho tất cả các sprites.

Để tránh gọi End() để sửa đổi các trạng thái không hiển thị trên ảnh trước đó, bạn nên gọi Flush() thay vì End(). Điều này làm cho các sprites xếp hàng đợi với các biến đổi hiện tại và các trạng thái thiết bị, nhưng để nguyên trạng thái. Hàm End() nào gọi là Flush() và thiết lập lại các trạng thái cụ thể được thiết lập bởi Begin().

2

Điều tốt nhất là thực hiện cuộc gọi chỉ bắt đầu/kết thúc một lần trên mỗi Draw(), điều này làm cho tất cả các sprites trong một lô được xử lý bởi card đồ họa cùng một lúc. Bạn chỉ nên sử dụng nhiều lô sprite nếu cần. Ví dụ về khi bạn có thể cần phải bao gồm:

  • Bạn muốn áp dụng một hiệu ứng duy nhất sprites nhất định, nhưng không phải người khác
  • Bạn muốn chụp ảnh màn hình
  • Bạn muốn làm một cái gì đó phức tạp hơn với các hiệu ứng

Có ai có thể nghĩ ra một lý do khác cho nhiều lô sprite (bắt đầu-> kết thúc) không?

+0

Danh sách quá tải cho Bắt đầu ở đây: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspx Nếu bạn muốn bất kỳ điều gì ở đây khác nhau, chẳng hạn khi chuyển qua hiệu ứng tùy chỉnh hoặc ma trận biến đổi khác, bạn phải thực hiện một cuộc gọi khác. –

+0

Xin chào, tôi không thể chụp ảnh màn hình của một hình ảnh cụ thể nhưng có thể chụp ảnh màn hình trên một hình ảnh khác. Bất kỳ ý tưởng nào, tại sao điều này có thể xảy ra? – nagavamsikrishna

+0

@salsabear, Điều đó nghe giống như tài liệu cho một câu hỏi mới. Nếu bạn bao gồm mã trong câu hỏi, hãy đảm bảo chỉ bao gồm các phần phụ thuộc. –

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