Kiến trúc công cụ trò chơi MVC (Model-View-Controller) - Có hay không? [đóng cửa]


18

Tôi đang đọc một cuốn sách tuyệt vời, Hoàn thành mã hóa trò chơi và cuốn sách đó khuyên bạn nên sử dụng phương pháp MVC (Model-View-Controller) , với ba lớp chính:

  1. Lớp ứng dụng trò chơi
  2. Logic trò chơi
  3. Chế độ xem trò chơi

Đối với tôi, cách tiếp cận này trông giống như một sự quá mức cho một trò chơi máy tính di động.

Ý kiến ​​của bạn là gì? Có đáng để thực hiện kiến ​​trúc này không, ngay cả khi nó bổ sung thêm giao tiếp cần thiết giữa các mô-đun? Thiết kế này có thể tiêu thụ rất nhiều năng lượng CPU, đến cuối cùng, kết quả sẽ chậm hơn đáng kể so với khi nó không được thực hiện?


5
-1 và bỏ phiếu để đóng. Mọi thứ đáng nói về MVC trong các trò chơi đã được nói tại gamedev.stackexchange.com/questions/3426/ , và cho đến nay tất cả những gì chúng ta có ở đây là rác.

@Joe Wreschnig điều đó khá khắc nghiệt, nhưng tôi đoán là sự thật ...
Spooks

@chaos: Trên thực tế, tôi đã bỏ phiếu cho câu trả lời của bạn, nhưng chúng tôi thực sự không cần câu trả lời khác nói rằng "hãy sử dụng các mẫu nếu họ giúp, đừng nếu họ không làm." Hoặc có lẽ chúng tôi đã làm, nhưng sau đó vẫn thực sự buồn. Mặc dù vậy, tôi vẫn không biết cách đề cập đến các biểu thức như "Thiết kế thời gian chạy như thừa kế" ngoài rác.

2
@Joe: Ồ, cảm ơn. :) Lập luận rằng OOP là miễn phí có phần làm lu mờ tâm trí. Tôi cho rằng theo một số tiêu chuẩn, chúng ta không cần các điểm như của tôi được nhắc lại, nhưng các điều không xảy ra và do đó, các câu hỏi trùng lặp có thể gây tranh cãi. Nó cũng phục vụ chức năng cho phép những người đến sau vào trang web như tôi cạo một chút đại diện mặc dù hoạt động đã ồ ạt ngừng hoạt động. :) Ý tôi là, chết tiệt, tôi có 40K rep trên SO, nhưng ở đây tôi thậm chí không thể chỉnh sửa wiki wiki.
hỗn loạn

Câu trả lời:


30

Tôi phần nào hỗ trợ sử dụng cấu trúc MVC ngay cả đối với một game di động đơn giản. Nếu không có gì khác, nó sẽ giúp giải quyết vấn đề khiến các nhà phát triển không bị nó cắn đủ lần: tách mã hiển thị khỏi logic trò chơi.

Tuy nhiên, tôi cũng sẽ nói rằng MVC, giống như tất cả các mẫu thiết kế, tồn tại để làm cho cuộc sống của bạn dễ dàng hơn . Điều đó có nghĩa là nếu tại bất kỳ thời điểm nào, việc tuân thủ một số quy tắc về những gì bạn nên và không nên làm khi sử dụng MVC sẽ khiến cuộc sống của bạn trở nên khó khăn hơn, hãy bỏ qua nó . Một trong hai điều sẽ xảy ra: 1) bạn sẽ bị cắn sau đó, và sau đó sẽ hiểu tại sao việc làm khác đi ở nơi đầu tiên thực sự sẽ giúp cuộc sống của bạn dễ dàng hơn trong thời gian dài, hoặc 2) không có hậu quả gì.

Lập trình máy tính, về bản chất, có rất nhiều người theo quy tắc, những người coi trọng việc tuân thủ nguyên tắc tao nhã hơn là thực sự hoàn thành bất cứ điều gì, và họ thích thúc đẩy hệ thống giá trị của họ; đừng để họ biến bạn thành một trong số họ Điều quan trọng nhất có thể xảy ra với trò chơi của bạn là vận chuyển nó .


Chaos thân mến, tôi thích câu trả lời của bạn nhất, vì vậy tôi đánh dấu nó là câu trả lời cho câu hỏi của tôi. Cách tiếp cận MVC thêm trừu tượng vào thiết kế mã. Việc trừu tượng hóa thường thêm các bước bổ sung của mã, có thể tránh được với thiết kế thẳng hơn. Theo tôi hiểu chính xác, tôi không cần phải lo lắng về chi phí được giới thiệu bởi sự trừu tượng được thêm vào do kết quả của thiết kế MVC.
Bunkai.Satori

1
Câu trả lời tốt, +1 về điều đó .. Lý thuyết là tốt và tốt nhưng nó có thể khiến các trò chơi không được vận chuyển nếu bạn không hoàn thành nó.
James

@ Bunkai.Satori: Nó thêm tính trừu tượng và IMO là sự trừu tượng hữu ích trả theo cách của nó. Tôi đồng ý với tuyên bố cuối cùng của bạn, với việc làm rõ rằng có một chi phí, và tôi không nghĩ rằng bạn cần phải lo lắng về nó.
hỗn loạn

4

Các thiết kế thời gian biên dịch không tiêu thụ năng lượng CPU, trừ khi bạn có một trình biên dịch cực kỳ khó tin. Một ngôn ngữ hoặc cách tiếp cận hướng đối tượng không khác nhau về đặc điểm hiệu suất so với ngôn ngữ thủ tục. Bạn sẽ không gọi bất kỳ chi phí bổ sung nào cho việc sử dụng MVC. Tính mô đun tồn tại ở thời gian biên dịch, không phải thời gian chạy, một khi mã được nội tuyến và tối ưu hóa, nó sẽ không tạo ra bất kỳ sự khác biệt nào cả.

Nhiều trò chơi hiện đại thực sự chạy các mô hình và quan điểm về các luồng riêng biệt và đạt được lợi ích hiệu suất tuyệt vời trên hầu hết các nền tảng.

Cuối cùng, MVC là một thiết kế tốt giúp bạn tăng cường bảo trì và ít lỗi hơn vv miễn phí . Không có lý do gì để không sử dụng nó. Nó giống như hỏi tại sao bạn nên sử dụng một forvòng lặp thay vì viết tay goto. Trừ khi bạn có một thiết kế vượt trội trong tâm trí, nó chắc chắn sẽ tốt hơn không có gì.

Chỉnh sửa: Thiết kế thời gian biên dịch không tiêu thụ năng lượng CPU. Thiết kế thời gian chạy như thừa kế rõ ràng làm.


-1. MVC là một quyết định thời gian thiết kế. Kế thừa là một quyết định thời gian thiết kế. Cả hai xảy ra trước thời gian biên dịch và thời gian chạy. Cả hai đều có tác động lớn đến hiệu suất. Nội tuyến không phải lúc nào cũng làm cho mã nhanh hơn. Đề xuất luồng của bạn là vô cùng ngây thơ. Không có gì miễn phí.

Cảm ơn DeadMG vì câu trả lời của bạn. Về cơ bản, tôi có nghĩa là với mỗi mức độ trừu tượng, mã sẽ được slover, vì ngày càng có nhiều bước trung gian được thêm vào. MVC là thiết kế trừu tượng hơn, rất có thể sẽ dẫn đến nhiều bước hơn để đạt được cùng một nhiệm vụ. Điều này sẽ có ảnh hưởng đến tốc độ, imo.
Bunkai.Satori

4

Hầu như luôn luôn có một sự đánh đổi giữa sự rõ ràng của mã và các yêu cầu kỹ thuật (tốc độ, bộ nhớ, v.v.) của chương trình. Các ngôn ngữ hướng đối tượng có một chi phí vượt trội so với các ngôn ngữ thủ tục, nhưng chúng đã được chứng minh là có nhiều lợi thế hơn các ngôn ngữ thủ tục, đặc biệt là trong việc duy trì lâu dài mã (lỗi, v.v.) và thường phát triển nhanh.

Vì vậy, trong tâm trí đó, tôi đề xuất rằng MVC đáng để thực hiện vì lợi ích của bạn là lập trình viên trò chơi . Mã của bạn sẽ tuân thủ tốt hơn các nguyên tắc hướng đối tượng, đặc biệt là đóng gói và bạn có thể sẽ có thời gian duy trì mã dễ dàng hơn nhiều (sửa lỗi hoặc thêm các tính năng mới).

Mặt khác, đảm bảo thực sự hoàn thành một trò chơi và không dành quá nhiều thời gian để làm việc với "công cụ" mà nó không bao giờ được thực hiện.

Để biết thêm thông tin, vui lòng đọc câu hỏi "Tại sao MVC & TDD không được sử dụng nhiều hơn trong kiến ​​trúc trò chơi?" và câu trả lời thực sự dài của tôi.


1
Ngôn ngữ OO không chậm hơn ngôn ngữ thủ tục. Nếu bạn viết một số mã trong C ++ không dịch chuyển bit, nó sẽ không chậm hơn so với C. Một ngôn ngữ hoặc chương trình không chậm hơn so với thủ tục chỉ vì nó là hướng đối tượng. Các chương trình chỉ thể hiện những bất lợi về hiệu suất vì chúng được viết kém . Kết quả là, tôi cảm thấy cần phải hạ thấp câu trả lời của bạn.
DeadMG

Xin chào Ricket, cảm ơn bạn đã giải thích yoru. Nghe có vẻ rất logic. DeadMG, một mặt là bạn đúng, Mặt khác, tôi nghĩ rằng cách tiếp cận OO thêm nhiều bit thông tin trong mã được biên dịch hơn ngôn ngữ thủ tục. Các bit bổ sung của mã liên quan đến OO này làm cho mã kết quả chậm hơn. Bạn có đồng ý không?
Bunkai.Satori

3
Whoa now ... Chắc chắn một dòng đơn giản trong C ++ like a++sẽ giống hệt như a++trong C (trong đó alà một kiểu nguyên thủy, v.v.). Nhưng hãy xem xét một lớp C ++ đơn giản với một hàm ảo thực hiện điều gì đó, hàm ảo đó phải chịu một chi phí khổng lồ so với một hàm C đơn giản, ngay cả khi mã bên trong giống hệt nhau. Ngôn ngữ hướng đối tượng có một chi phí chung . Xin lỗi vì đã nói rõ ràng "tốc độ". Nếu phân bổ bộ nhớ thêm và như vậy không dẫn đến một chương trình chậm hơn thì bạn hoàn toàn chính xác.
Ricket

2
Nếu chức năng là ảo, điều đó có nghĩa là chương trình cần phải chọn giữa 2 phiên bản khác nhau của cùng một chức năng trong thời gian chạy. (Nếu không, bạn sẽ không biến nó thành ảo.) Trong trường hợp này, dù sao bạn cũng có thêm một điều kiện hoặc mức độ gián tiếp, mà bạn phải tự thực hiện bằng ngôn ngữ thủ tục (ví dụ: thông qua con trỏ hàm hoặc câu lệnh chuyển đổi) . Đó không phải là chi phí - đó là nội tại của vấn đề.
Kylotan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.