2008-09-15 45 views
11

Tôi chưa lập trình trò chơi trong khoảng 10 năm (Trải nghiệm cuối cùng của tôi là DJGPP + Allegro), nhưng tôi nghĩ tôi sẽ xem XNA cuối tuần để xem nó hình thành như thế nào.Lập trình trò chơi và xử lý sự kiện

Tôi khá ấn tượng, tuy nhiên khi tôi tiếp tục ghép nối với nhau một công cụ trò chơi, tôi có một câu hỏi cơ bản (có thể).

Bạn nên dựa vào các đại biểu và sự kiện của C# để thúc đẩy trò chơi? Là một lập trình viên ứng dụng, tôi sử dụng rất nhiều đại biểu và sự kiện, nhưng tôi không biết liệu có một chi phí đáng kể để làm như vậy hay không.

Trong công cụ trò chơi của mình, tôi đã thiết kế một loại "chase cam", có thể được gắn vào một đối tượng và sau đó tính toán lại vị trí của nó so với đối tượng. Khi đối tượng chuyển động, có hai cách để cập nhật cam đuổi theo.

  • Có phương thức "UpdateCameras()" trong vòng lặp trò chơi chính.
  • Sử dụng trình xử lý sự kiện và yêu cầu cam theo dõi đăng ký đối tượng.OnMoved.

Tôi đang sử dụng sau, vì nó cho phép tôi kết nối các sự kiện với nhau và tự động hóa độc đáo các bộ phận lớn của động cơ. Đột nhiên, những gì sẽ là rất lớn và phức tạp được giảm xuống đến một số ít 3-5 xử lý sự kiện dòng ... Một vẻ đẹp của nó.

Tuy nhiên, nếu trình xử lý sự kiện kích hoạt mỗi giây nano lần lượt là sự chậm lại lớn, tôi sẽ xóa nó và đi theo phương pháp vòng lặp.

Ý tưởng?

Trả lời

10

Nếu bạn nghĩ về một sự kiện dưới dạng danh sách người đăng ký, trong mã của bạn, tất cả những gì bạn đang làm là đăng ký người đăng ký. Số lượng các hướng dẫn cần thiết để đạt được điều đó có khả năng là tối thiểu ở cấp CLR.

Nếu bạn muốn mã của mình trở nên chung chung hoặc động, thì bạn cần phải kiểm tra xem có nội dung nào đó được đăng ký trước khi gọi một sự kiện hay không. Cơ chế sự kiện/đại biểu của C# và .NET cung cấp cho bạn chi phí rất ít (về mặt CPU).

Nếu bạn thực sự lo ngại về mọi chu kỳ đồng hồ, bạn sẽ không bao giờ viết logic trò chơi chung/động. Đó là một giao dịch giữa mã duy trì/cấu hình và tốc độ hoàn toàn.

Được viết tốt, tôi ủng hộ các sự kiện/đại biểu cho đến khi tôi có thể chứng minh đó là một vấn đề.

Cách duy nhất bạn thực sự biết nếu đó là vấn đề với bạn là bằng cách lập hồ sơ cho mã của bạn - bạn nên làm gì cho bất kỳ sự phát triển trò chơi nào!

1

XNA khuyến khích sử dụng giao diện, sự kiện và đại biểu để thúc đẩy nội dung được viết bằng nó. Hãy xem các lớp học liên quan đến GameComponent mà thiết lập này cho bạn.

Câu trả lời là "Nhiều như bạn cảm thấy thoải mái".

Để xây dựng một chút, ví dụ: bạn lấy và kế thừa từ lớp gamecomponent vào lớp cameracontroller và thêm nó vào bộ sưu tập Game.Component. Sau đó, bạn có thể tạo các lớp máy ảnh của bạn và thêm chúng vào bộ điều khiển cameracontroller của bạn.

Thực hiện việc này sẽ khiến bộ điều khiển cameracontroller được gọi thường xuyên và có thể chọn và kích hoạt camera thích hợp hoặc nhiều camera nếu đó là những gì bạn đang thực hiện.

Dưới đây là một ví dụ của việc này (Tất cả các hướng dẫn của ông là tuyệt vời): ReoCode

1

Trong thời gian phụ của tôi ra khỏi công việc thực tế, tôi đã học hỏi XNA quá.

IMHO (hoặc không quá khiêm tốn nếu bạn hỏi đồng nghiệp của tôi) là chi phí của xử lý sự kiện sẽ bị choáng ngợp bởi các yếu tố khác trong trò chơi như hiển thị. Với việc sử dụng nhiều sự kiện trong bình thường. Lập trình Net tôi sẽ là mã cơ bản được tối ưu hóa tốt.

Thành thật mà nói, tôi nghĩ rằng việc sử dụng phương pháp UpdateCameras có thể là một tối ưu hóa sớm. Hệ thống sự kiện có thể có nhiều công dụng hơn là camera.

4

Điều quan trọng là phải nhận ra rằng các sự kiện trong C# không được xếp hàng các sự kiện không đồng bộ (ví dụ như hàng đợi thông điệp Windows). Về bản chất chúng là danh sách các con trỏ hàm. Vì vậy, việc nâng cao một sự kiện không có tác động hiệu suất tồi tệ hơn việc lặp qua một danh sách các con trỏ hàm và gọi từng hàm.

Đồng thời, nhận ra rằng vì điều này, các sự kiện là đồng bộ. Nếu sự kiện của bạn người nghe chậm, bạn sẽ làm chậm lớp học nâng cao sự kiện.

1

Là một sang một bên, bạn có thể quan tâm để biết rằng Shawn Hargreaves, phát triển ban đầu của Allegro, là một trong những nhà phát triển chính trong nhóm XNA :-)

+0

Tôi đã nhận thấy điều đó. Đó là một thế giới nhỏ bé nhỏ. – FlySwat

2

Câu hỏi chính ở đây có vẻ là: "gì là chi phí liên quan đến việc sử dụng C# Đại biểu và Sự kiện? "

Sự kiện có ít chi phí đáng kể so với cuộc gọi chức năng thông thường.

Việc sử dụng các đại biểu có thể tạo ra rác ẩn và do đó ẩn. Rác có thể là một vấn đề hiệu suất gây ra lớn đặc biệt là trên XBox360.

Các mã sau đây tạo ra khoảng 2000 byte rác mỗi giây (60 fps) theo hình thức của các đối tượng EntityVisitor:

private delegate void SpacialItemVisitor(ISpacialItem item); 

    protected override void Update(GameTime gameTime) 
    { 
     m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects); 
    } 

    private void ApplyExplosionEffects(ISpacialItem item) 
    { 
    } 

Chừng nào bạn tránh tạo ra rác, các đại biểu là đủ nhanh cho hầu hết các mục đích. Bởi vì những mối nguy hiểm tiềm ẩn, tôi thích tránh chúng và sử dụng giao diện thay thế.

1

Trước khi đi vào tác động của một sự kiện về mặt hiệu suất, trước tiên bạn phải đánh giá xem có cần thiết hay không.

Giả sử bạn đang thực sự cố gắng cập nhật và không chỉ là một ví dụ, những gì bạn đang tìm kiếm không phải là sự kiện (mặc dù các sự kiện cũng có thể thực hiện thủ thuật), nếu bạn đang theo dõi khả năng hình đại diện là nó sẽ di chuyển hầu hết thời gian. Một cách tiếp cận tôi thấy cực kỳ hiệu quả là sử dụng phép biến đổi phân cấp, nếu bạn thực hiện điều này một cách hiệu quả máy ảnh sẽ không phải là đối tượng duy nhất được hưởng lợi từ hệ thống như vậy, mục tiêu sẽ là giữ máy ảnh trong không gian tọa độ của đối tượng mà nó đang theo dõi.

Cách tiếp cận đó không phải là cách tốt nhất nếu bạn muốn áp dụng một số độ co giãn với tốc độ và cách thức camera theo dõi đối tượng, tốt nhất là sử dụng cuộc gọi cập nhật, tham chiếu và tăng tốc cơ bản và vật lý kháng chiến.

Sự kiện hữu ích hơn cho những thứ chỉ thỉnh thoảng xảy ra hoặc ảnh hưởng đến nhiều khía cạnh khác nhau của ứng dụng, như một nhân vật chết, có thể nhiều hệ thống khác nhau muốn nhận thức được sự kiện như vậy, kiểm soát AI, và như vậy, theo dõi tất cả các đối tượng sẽ phải liên tục kiểm tra xem điều này có xảy ra ít hiệu quả hơn là ném một sự kiện và tất cả các đối tượng quan tâm chỉ được thông báo khi nó xảy ra.

+1

Một necromancer mới đã đến khu phố ... – Blau

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