Là một chủ đề riêng cho vòng lặp trò chơi bắt buộc cho các trò chơi đơn giản?


10

Tôi mới phát triển trò chơi. Để tìm hiểu tôi đang tạo lại trò chơi này trên nền tảng Android. Bạn có thể quan sát video chơi trò chơi ở liên kết trên. Đây là một trò chơi đơn giản.

Tôi đã đọc rất nhiều bài viết về việc bắt đầu phát triển trò chơi. Hầu hết tất cả chúng đều được khuyến nghị sử dụng vòng lặp trò chơi trên luồng riêng biệt, điều này có ý nghĩa đối với các trò chơi khác. Tuy nhiên, đối với trò chơi cụ thể này, tôi có cần bắt đầu một chuỗi riêng biệt không?



Không chắc chắn đây là một bản sao, vì đây là về Android. Có một số cân nhắc khác về phân luồng trong nền tảng dựa trên Java khác với câu hỏi đó.
Sean Middleditch

Câu trả lời:


8

Một vòng lặp trò chơi thường được khuyến khích vì nó đơn giản . Hầu như bất kỳ trò chơi nào cũng có thể được phát triển và chạy đúng cách bằng cách sử dụng một vòng lặp, và hầu hết các trò chơi sẽ yêu cầu một chức năng hoạt động đúng.

Ví dụ, hầu hết các động cơ vật lý yêu cầu cập nhật liên tục đáng tin cậy cho một mô phỏng thích hợp. Ảnh động và nội dung động và đồ họa khác cần được cập nhật mỗi thay đổi, v.v ... Aka một cái gì đó bạn thực sự được miễn phí bằng cách sử dụng một vòng lặp.

Bây giờ hãy lưu ý rằng vòng lặp của bạn không phải chạy trên một luồng riêng biệt. Trong thực tế, hầu hết các trò chơi sẽ chạy vòng lặp trên luồng chính để đơn giản. Ngay cả các dự án Android của tôi cũng tuân theo nguyên tắc này.

Bây giờ câu hỏi thực sự ở đây là những gì bạn đề xuất thay thế ? Nếu bạn có một ý tưởng khác về cách đáng tin cậy để nhận đầu vào, thực hiện cập nhật và vẽ các khung phù hợp với bạn thì hãy tiếp tục! Nếu không, một vòng lặp trò chơi có thể là cách dễ nhất để đi.


Cách khác tôi nghĩ là cập nhật màn hình bằng chính luồng vì tất cả các hành động đều theo chuỗi - người chơi vuốt qua các quả bóng cùng màu, sau đó tất cả các quả bóng chạm nhau biến mất, các quả bóng còn lại rơi dưới trọng lực cùng với các quả bóng thay thế.
jin

Vì vậy, bạn không hỏi nếu một vòng lặp được yêu cầu? Mối quan tâm chính của bạn là nếu nó phải nằm trên một chủ đề riêng biệt, đúng không?
AturSams

1
chính xác. Câu hỏi của tôi là về chủ đề không phải là vòng lặp. đối với trò chơi đơn giản như vậy (mặc dù tôi sẽ may mắn có thể tạo ra một trò chơi như vậy) tôi có cần phải tạo ra một chủ đề mới hay mọi thứ có thể được thực hiện trên chủ đề chính?
jin

1
Không, nó không cần thiết. Miễn là bạn có một vòng lặp , thì không cần phải tạo vòng lặp thứ hai .

@jin bạn nên thực sự thay đổi tiêu đề và cách bạn viết câu hỏi của bạn sau đó.
vallentin

5

Không , một chủ đề riêng biệt là không cần thiết. Nếu bạn không làm gì quá mãnh liệt (điều đó không giống như trường hợp trong trò chơi bạn đã cho chúng tôi xem), mọi thứ đều có thể được thực hiện trên luồng chính.

Một luồng thứ hai là bắt buộc nếu bạn đang xử lý nhiều hoặc gặp sự cố với UI / đầu vào trở nên không phản hồi. Ví dụ: trong các trò chơi phức tạp hơn, bạn không muốn UI / đầu vào trở nên không phản hồi khi AI đang tính toán bước tiếp theo của nó. Vì trò chơi của bạn dường như chủ yếu đáp ứng đầu vào của người dùng và cập nhật hình ảnh, nên không cần một luồng thứ hai.


Trả lời câu hỏi ban đầu "Là một vòng lặp bắt buộc".

Không , nhưng các lựa chọn thay thế phức tạp hơn, khó thực hiện hơn và hiếm khi được sử dụng.

Trò chơi là theo định nghĩa tương tác. Ở mức tối thiểu, đó là chờ đợi đầu vào và cập nhật đầu ra. Cách đơn giản nhất để làm điều đó là một vòng lặp. Không bắt buộc phải sinh ra một chủ đề mới cho điều đó.

Mặc dù trò chơi mà bạn đề cập có vẻ đơn giản, nó có hình ảnh và âm thanh tương tác và nó liên tục cập nhật những trò chơi dựa trên đầu vào của người dùng.

Không có nhiều lựa chọn thay thế cho một vòng lặp trò chơi. Một số loại hệ thống dựa trên ngắt có thể có thể. Tuy nhiên, các hệ thống như vậy làm tăng sự phức tạp và giảm các yếu tố khác như tính quyết định. Có một lý do vòng lặp trò chơi rất phổ biến, chúng dễ thực hiện, dễ hiểu, linh hoạt và làm rất tốt.


Lần duy nhất tôi gặp phải các ngắt cấp thấp hơn là khi một nhiệm vụ CTNH nào đó được thực hiện và CPU / HĐH cần được thông báo để họ có thể xử lý đúng cách (đọc dữ liệu từ đĩa vào bộ nhớ và sau đó được thông báo rằng nó đã sẵn sàng để chúng tôi có thể quay lại kiểm soát ứng dụng và cho phép nó xử lý nó) vì vậy tôi không biết ý của bạn là gì và chỉ đơn giản là hiểu sai về nó.
AturSams

2

Trả lời cho câu hỏi thực tế (Có phải vòng lặp trò chơi phải nằm trong một chuỗi riêng biệt):

Lý do mọi người thường khuyên bạn nên sử dụng một luồng riêng biệt là vì họ không muốn xử lý nặng để can thiệp vào tương tác UI. Bạn là người duy nhất có thể biết nếu một chủ đề riêng biệt là cần thiết cho trò chơi của bạn . Nó hoàn toàn phụ thuộc vào công cụ và khung nếu vòng lặp trò chơi chính trong thiết kế hiện tại của bạn có thể ảnh hưởng đến thời gian phản hồi của UI. Nghĩ rằng bạn thường cho rằng nó sẽ không (trong các dự án nhỏ) trừ khi bạn có lý do để nghĩ khác.

Một lý do khác để giữ mã trong các luồng riêng biệt là để giữ mã theo mô-đun và đơn giản. Có hai đoạn mã không liên quan trộn lẫn với nhau thường có thể khiến mã trở nên ít đọc và có thể duy trì trong thời gian dài.

Có phải một vòng lặp trò chơi cần phải chạy trên luồng riêng của nó không? Có khả năng. Nếu có vấn đề với thời gian phản hồi hoặc mã và bạn cần nhiều mục UI để phản hồi bất kể xử lý nặng hay đơn giản là bạn muốn chia mã thành các tác vụ cụ thể xảy ra đồng thời vì lý do thiết kế. Tuy nhiên, nó được coi là một thực hành lập trình tiên tiến .

Một ví dụ đơn giản nhưng có lẽ không phải là một ví dụ tuyệt vời để minh họa là một trò chơi hai người chơi. Bạn có thể muốn chạy hai phiên bản của một lớp xử lý đầu vào của người dùng và chuyển đổi sang trạng thái thay đổi trong thể hiện của ký tự người chơi.

Một số khung khuyến khích / yêu cầu bạn sử dụng và hệ thống dựa trên sự kiện / gián đoạn như ActionScript3.0. Trong những trường hợp đó, mã vòng lặp thường sẽ đi đến OnEnterFramesự kiện hoặc một cái gì đó tương tự xảy ra 20 - 60 hoặc 120 lần mỗi giây.


Trả lời câu hỏi ban đầu (Tôi có cần một vòng lặp chính):

Tất cả sôi sục xuống quầy chương trình . Nếu bạn đang tạo một trò chơi sẽ chạy nhiều hơn một khoảng thời gian định trước và sẽ không tạo mã khi nó diễn ra, bạn sẽ cần yêu cầu máy tính của người dùng của mình lặp lại một số hướng dẫn mà trò chơi đã xử lý và những gì có thể sẽ thay đổi trong Trong khi đó là trạng thái (các giá trị được lưu trữ trong các đối tượng và toàn cầu của trò chơi).

Vì bạn biết bạn sẽ cần lặp lại hướng dẫn, có một số cách để hoàn thành nhiệm vụ này và liên tục xử lý các hướng dẫn tương tự. Tất cả các phương pháp này liên quan đến việc di chuyển bộ đếm chương trình trở lại hướng dẫn hiện có liên quan. Các câu lệnh luồng điều khiển phổ biến nhất khiến mã được lặp lại được gọi là các vòng lặp, một gotocâu lệnh khác hiếm khi được sử dụng trong mã hiện đại và có tác dụng tương tự trong trường hợp này (hoàn toàn không liên quan đến bạn).

Vì vậy, để trả lời câu hỏi trước đây của bạn, bạn có cần một vòng lặp? Vâng, bạn làm.


1
Theo tôi biết, các khung dựa trên sự kiện, như AS3, vẫn có một vòng lặp trò chơi chạy bên dưới. Tôi đang nói về các ngắt cấp thấp hơn, không phải là một khung thực hiện một hệ thống sự kiện.
MichaelHouse

Hmm .. Tôi không nghĩ mọi người thường sử dụng các ngắt cấp thấp hơn trong các trò chơi. AFAIK chúng chủ yếu được CPU sử dụng để giám sát các hoạt động IO. Tôi đã nghĩ đến một sự trừu tượng hóa ở cấp độ cao hơn như là một thực tiễn thiết kế nơi bạn phản ứng với đầu vào của người dùng hoặc hoạt động phần cứng (không bỏ phiếu) thay vì chạy một số hướng dẫn mỗi khung và sau đó nói với CTNH để hiển thị kết quả.
AturSams

1
Có, mọi người không thường xuyên sử dụng chúng nữa. Như tôi đã nói, chúng khó sử dụng hơn và chúng ta có nhiều cách tốt hơn để làm mọi thứ bây giờ. Tôi hiểu những gì bạn đang nói, và chắc chắn đó là một cách khác để nghĩ về mọi thứ, nhưng chỉ trên bề mặt nó có vẻ khác nhau, bên dưới nó là cùng một loại vòng lặp.
MichaelHouse

Tôi đồng ý với @ Byte56, nó thực hiện một vòng lặp, trừ khi chúng ta đang nói về một sự kiện cấp hạt nhân sử dụng các ngắt IO.
khái niệm3

1
Tôi biết điều đó nhưng hầu hết mọi thứ chúng tôi làm đều giống nhau bên dưới bề mặt (như tôi đã nói, thay đổi giá trị của bộ đếm chương trình). Điều này không có gì bí mật và tôi đã chỉ ra nó trong câu trả lời. Lập trình dựa trên sự kiện dường như khác nhau bởi vì chúng tôi di chuyển bộ đếm chương trình sang các chức năng khác nhau khi các sự kiện khác nhau xảy ra. Rõ ràng có khả năng một cuộc bỏ phiếu vòng lặp để kiểm tra nếu những sự kiện này xảy ra gần đây nhưng theo nguyên tắc thiết kế thì nó có vẻ khác nhau.
AturSams

0

Chỉ cần thêm vào câu trả lời của một số người khác ở đây, một điều mà không ai đã đề cập rõ ràng: Nếu bạn có nguy cơ chạy vòng lặp trò chơi của mình trong một luồng thứ hai và nó trở nên không phản hồi, bạn có nguy cơ HĐH chấm dứt ứng dụng của bạn. Đó là lý do tại sao nên sử dụng một chủ đề riêng biệt. Do đó (ví dụ) NDK's native_app_glue.c/ .hsinh ra một luồng riêng cho vòng lặp của bạn.

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.