2013-01-23 5 views
5

Tôi đang tạo trò chơi 2d trong XNA. Khi sử dụng các thành phần trò chơi có thể kéo được, một thành phần nào tốt hơn cho hiệu suất?Làm thế nào để ngăn chặn việc vẽ thành phần XNA khi nó bị tắt màn hình?

1.Khi một thành phần không nằm trên màn hình, hãy xóa nó khỏi danh sách thành phần và khi màn hình của nó thêm vào.

2.When offscreen nó không chạy chức năng vẽ của mình (bằng cách sử dụng một "tỉnh táo" bool lĩnh vực và một lệnh if xung quanh mọi thứ trong chức năng vẽ)

Tôi đang sử dụng phương pháp 2 vào lúc này và nó hoạt động tốt. Cus tiện dụng của nó các draworder của các thành phần sẽ không thay đổi (nếu tôi loại bỏ và thêm lại nó nó sẽ, và tôi sẽ cần thêm mã để quản lý) Trong thực tế nó chỉ xảy ra với tôi rằng nếu nó không có trong danh sách các thành phần nó sẽ không cập nhật và tôi sẽ cần một cái gì đó khác để theo dõi xem nó trên màn hình hay không ..

Ngoài ra tôi không có phiên bản ưa thích của studio trực quan với profiler nên tôi chỉ hỏi ở đây mọi người nghĩ gì từ trải nghiệm của họ

+1

Bạn không cần một trình định dạng đắt tiền để xác định nhanh hơn trong thử nghiệm 'Đồng hồ bấm giờ 'đủ tốt cho điều đó. Profiler sẽ giúp giải thích * tại sao * một nhanh hơn cái kia (cụ thể là, phần nào của thuật toán này chậm, tiêu thụ bộ nhớ nhiều nhất, tôi cần phải bận tâm tối ưu hóa phần này, v.v.). – Servy

+2

Tôi sẽ tin rằng lựa chọn 2 sẽ nhanh hơn. – Cyral

+2

Bạn có thể sử dụng bao nhiêu 'DrawableGameComponent'? Nếu bạn đang sử dụng rất nhiều trường hợp của nó, bạn có thể sử dụng sai nó. –

Trả lời

5

Một khái niệm đôi khi bị bỏ qua về hiệu suất của CPU trong khi sử dụng SpriteBatch là cách bạn thực hiện việc ghép nối các sprites của mình. Và bằng cách sử dụng thành phần trò chơi có thể kéo không dễ dàng cho chính mình để tạo các chuỗi sprites hiệu quả.

Về cơ bản, GPU vẽ các sprites không chậm & CPU sắp xếp tất cả các sprites vào một lô không chậm. Phần chậm là khi CPU phải giao tiếp với GPU những gì nó cần để vẽ (gửi cho nó thông tin về lô). Giao tiếp CPU này tới GPU không xảy ra khi bạn gọi spriteBatch.Draw(). Nó xảy ra khi bạn gọi spriteBatch.End(). Vì vậy, các quả treo thấp để hiệu quả là gọi spriteBatch.End() ít thường xuyên hơn. (Tất nhiên điều này có nghĩa là gọi Begin() ít thường xuyên hơn). Ngoài ra, sử dụng spriteSortMode.Imediate rất ít vì nó ngay lập tức khiến CPU gửi từng thông tin sprites tới GPU (chậm)). Vì vậy, nếu bạn gọi Begin() & Kết thúc() trong mỗi lớp thành phần trò chơi và có nhiều thành phần, bạn sẽ mất nhiều thời gian không cần thiết và có thể tiết kiệm thời gian hơn. đáng lo ngại về vân tay trên màn hình.

Bên cạnh: GPU tự động bỏ qua các vân tắt màn hình từ trình đổ bóng pixel của nó. Vì vậy, tiêu hủy các vân tay trên màn hình sẽ không tiết kiệm thời gian GPU ...

+0

Cảm ơn rất nhiều! rất thông tin .. Ngoài ra, chỉ cần fyi, trò chơi của tôi có mức độ procedurally tạo ra các phòng. Tôi đã làm một bài kiểm tra căng thẳng với 140 phòng trước khi tôi có bất cứ điều gì được mã hóa cho hiệu suất và nó đã được hellah chậm.Sau đó tôi đã làm cho nó như vậy chỉ phòng bạn đang ở được rút ra (phương pháp 2 trong bài của tôi) Và hiệu suất trở lại hoàn hảo, trong ánh sáng của câu trả lời của bạn đó là tất cả CPU, có ý nghĩa như điều này trong chạy trên một craptop đấu tranh với phòng thu trực quan! :) Tôi nghĩ rằng tôi sẽ làm theo lời khuyên của bạn và kiến ​​trúc sư lại một chút để làm cho các câu lệnh bắt đầu và kết thúc của tôi nắm giữ nhiều hơn –

+0

Tôi muốn nói rằng chỉ vì bạn đang sử dụng drawablegamecomponents, điều đó không có nghĩa là bạn không thể sử dụng cùng một spritebatch.begin(). Nếu bạn đặt base.draw của bạn bên trong spritebatch, bạn có thể gọi bắt đầu từ tệp Game chính của bạn, sau đó thực hiện tất cả bản vẽ trong các thành phần của bạn, sau đó spritebatch.end trong tệp Trò chơi một lần nữa. – TopHatHacker

+0

@TopHatHacker Tôi đã từng đề cập đến điều đó nhưng không phải khi tôi nhận ra rằng nếu có một số thành phần có thể vẽ được 3D và một số thành phần 2d thì điều đó sẽ không hoạt động. –