Sử dụng thời gian nhàn rỗi trong các trò chơi theo lượt (RPG) để cập nhật


9

Nếu bạn chơi bất kỳ trò chơi RPG theo lượt nào, sẽ có những khoảng thời gian lớn khi không có gì xảy ra vì trò chơi đang lặp lại 'Wait_for_player_input'. Đương nhiên có vẻ hợp lý khi sử dụng thời gian này để cập nhật mọi thứ.

Tuy nhiên, điều này dường như ngay lập tức cho thấy rằng nó sẽ cần phải được xâu chuỗi. Là loại thiết kế này có thể trong một chủ đề duy nhất?

loop:  
if not check_something_pressed:  
    update_a_very_small_amount  
else  
  keep going

Nhưng nếu chúng ta nói 'a_very_small_amount' chỉ cập nhật một đối tượng duy nhất cho mỗi vòng lặp, thì việc cập nhật sẽ rất chậm.

Làm thế nào bạn sẽ đi về điều này, tốt nhất là trong một chủ đề duy nhất?

EDIT: Tôi đã gắn thẻ bất khả tri ngôn ngữ này vì đó có vẻ là điều hợp lý, mặc dù mọi thứ cụ thể hơn với Python sẽ rất tuyệt. ;-)

Chỉnh sửa thứ hai: Trò chơi này không có kế hoạch có bất kỳ thành phần hoạt hình nào; nghĩa là, tôi hiện đang chạy nó dưới dạng đầu vào chờ người chơi sau đó cập nhật mọi thứ và rút ra. Vì vậy, thay vì X FPS, nó phụ thuộc vào tốc độ của người dùng.

Câu trả lời:


7

Vâng, nó có thể làm trong một chủ đề duy nhất. Nói chung, mặc dù, bạn sẽ muốn cập nhật các đối tượng mỗi khung hình chứ không chỉ khi có chu kỳ dự phòng. Hoạt hình và chuyển động của bạn sẽ bị ngắt kết nối với tốc độ khung hình và trông khá rối nếu bạn không. Nếu bạn đang nói nhiều hơn về các bản cập nhật AI hoặc thứ gì đó không cần phải là thời gian thực, tôi sẽ đặt đồng hồ bấm giờ trên đó. Bạn nên biết tốc độ khung hình mục tiêu của bạn là bao nhiêu và thời gian nhàn rỗi sẽ là bất cứ điều gì còn lại sau khi mọi thứ khác đã hoàn thành.

Giả sử bạn đang nhắm mục tiêu 60 FPS cho trò chơi của bạn. Điều đó khiến bạn mất 16,667 ms để thực hiện tất cả các công việc bạn cần thực hiện mỗi khung. Khi bắt đầu trò chơi, hãy lấy thời gian hiện tại bằng cách sử dụng bộ đếm thời gian có độ phân giải cao nhất có sẵn, thêm 16,667 ms vào nó và lưu trữ ở đâu đó. Tôi nghĩ rằng hàm trong python là time () mặc dù đã được một thời gian kể từ khi tôi làm việc trong ngôn ngữ. Sau khi quá trình xử lý của bạn hoàn tất, hãy nhập một vòng lặp kiểm tra thời gian hiện tại so với thời gian bạn đã ghi. Nếu thời gian hiện tại nhỏ hơn thời gian kết thúc khung, update_a_very_small_amount. Tôi sẽ không lo lắng nhiều về việc xử lý đi qua phần cuối của khung vì bản cập nhật nhỏ của bạn sẽ nhanh chóng được xử lý. Nó sẽ chỉ là một chút chậm trễ khi bắt đầu khung hình tiếp theo và bạn dường như có đủ thời gian nhàn rỗi để xử lý nó.

Sau khi khung đã xử lý xong, hãy thêm 16,667 ms vào thời gian được lưu trữ cho đến cuối khung cuối cùng để tìm ra nơi kết thúc của khung tiếp theo. Nếu bạn sử dụng thời gian hiện tại + 16,667 ms và quá trình xử lý kết thúc, phần cuối của khung tiếp theo sẽ bị đẩy ra ngoài tuy nhiên nhiều thời gian khung cuối cùng đã chạy qua.

Re: Chỉnh sửa lần thứ hai

Để làm rõ, tôi sử dụng thuật ngữ tốc độ khung hình ở đây để chỉ ra một lần lặp thông qua vòng lặp chính. Nếu nó dựa trên tốc độ đầu vào của người dùng, tôi tưởng tượng rằng mục tiêu của bạn chỉ đơn giản là làm cho trò chơi cảm thấy nhạy bén. Nếu không, bạn chỉ có thể kiểm tra đầu vào và cập nhật mọi thứ mỗi lần qua vòng lặp ngay cả khi phải mất 10 giây để làm như vậy. Để làm cho nó cảm thấy nhạy hơn, có lẽ bạn sẽ muốn kiểm tra đầu vào khoảng 20 lần mỗi giây, cho tốc độ khung hình hiệu quả là 20 FPS, ngay cả khi bạn không thực sự vẽ những khung hình này. Điều này sẽ cung cấp cho bạn 50 ms để cập nhật mọi thứ trước khi bạn cần kiểm tra lại đầu vào.


2

Đối với Python cụ thể, bạn có thể thử và sử dụng Coroutines để thực hiện tính toán qua nhiều cuộc gọi cập nhật.

... coroutines là các thành phần chương trình tổng quát hóa các chương trình con để cho phép nhiều điểm vào để tạm dừng và tiếp tục thực hiện tại các vị trí nhất định ...

PEP-0342 chi tiết triển khai coroutine trong Python.

Bạn có thể tạo lịch trình và tác vụ của riêng mình để có thể mô phỏng đa luồng trên một luồng. Đây là cùng một cách mà các khung Javascript cho phép xử lý đa luồng như xử lý mặc dù Javascript được chạy trên một quy trình duy nhất.


1

Vâng, điều này là có thể. Trò chơi của bạn sẽ có một số loại vòng lặp trò chơi chính. Một cái gì đó như thế này:

while(gameRunning)
{
  checkUserInput()
  updateGame()
  renderGame()
}

Trong updateGame, bạn có thể lặp lại các đối tượng trò chơi của mình và cập nhật chúng "một chút". Nếu bạn đang thực hiện bất kỳ tính toán nặng nề nào trong phương pháp này, trò chơi sẽ đơn giản treo. Vì vậy, bạn cần một cách để phân tách các tính toán này để chạy qua nhiều lần lặp của vòng lặp trò chơi.

Làm thế nào để tách chúng ra, tùy thuộc vào loại trò chơi bạn đang xây dựng. Giả sử bạn có thói quen tìm đường dẫn sử dụng A * để tính toán đường đi qua mê cung. Bạn sẽ cần dừng thuật toán sau một khoảng thời gian nhất định hoặc sau một số lần lặp cố định, giữ cho đường dẫn được tính toán cho đến nay và đưa điều khiển quay trở lại vòng lặp trò chơi. Việc tìm đường dẫn sẽ tiếp tục trong lần cập nhật tiếp theo. Bạn thậm chí có thể di chuyển nhân vật dọc theo đường dẫn một phần trong khi nó vẫn đang được tính toán.

Hầu hết thời gian bạn không cần phải lo lắng về việc cập nhật cuộc gọi trò chơi quá lâu.

"Tối ưu hóa sớm là gốc rễ của mọi tội lỗi!"
Nếu bạn gặp phải một nút cổ chai hiệu năng trong thói quen cập nhật của mình, đó là thời gian để điều tra và tối ưu hóa. Vì bạn không thể biết trước phần nào trong trò chơi của bạn sẽ mất nhiều thời gian nhất để tính toán và có thể lãng phí thời gian để tối ưu hóa những thứ sai.


1

Cách tôi hiểu câu hỏi của bạn là về cơ bản bạn đang hỏi về đa nhiệm hợp tác.

Cơ sở hạ tầng cơ bản sẽ là một danh sách các con trỏ hàm, tất cả được gọi theo kiểu vòng tròn (trừ khi cần phải ưu tiên tinh vi hơn) và tất cả các chức năng này sẽ làm "một chút công việc", đủ nhỏ để không khiến trò chơi bị trở nên chậm chạp. Tôi đã thực hiện điều này trong DOS trước khi các luồng nóng và cả trên các thiết bị di động không hỗ trợ luồng.

Một câu hỏi tốt hơn, theo tôi, là phải làm gì trong khi chờ người chơi di chuyển. Những loại thứ nào sẽ đòi hỏi nhiều bộ xử lý đến mức chúng không thể được thực hiện khi đang di chuyển, đồng thời, tùy chọn đến mức nếu người chơi chỉ cần gõ một số phím di chuyển đủ nhanh, trò chơi không có Thời gian để xử lý những. Do đó, những thứ như tính toán A * cho vài nghìn AI đã được đưa ra.

Theo tôi, giải pháp tốt hơn là chỉ đơn giản là nhường / ngủ và để quản lý năng lượng của máy tính thực hiện công việc của mình. Người dùng máy tính xách tay sẽ thích bạn tốt hơn cho 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.