Thời gian tải trước trò chơi so với thời gian tải trò chơi


9

Tôi đang phát triển một trò chơi trong đó có một mê cung ngẫu nhiên .
Có một số sinh vật AI, ẩn giấu mê cung. Và tôi muốn họ đi theo một con đường nào đó theo hình dạng mê cung.

Bây giờ có hai khả năng để tôi thực hiện điều đó, cách đầu tiên (mà tôi đã sử dụng) là bằng cách tính toán một số đường dẫn ẩn nấp mong muốn một khi mê cung được tạo ra.
Thứ hai, là bằng cách tính toán một con đường một lần cần được tính toán, khi một sinh vật bắt đầu ẩn nấp nó.

Mối quan tâm chính của tôi là thời gian tải. Nếu tôi tính toán nhiều đường dẫn khi tạo mê cung, thời gian tải trước hơi lâu, vì vậy tôi nghĩ về việc tính toán chúng khi cần.
Hiện tại, trò chơi không 'nặng' nên việc tính toán các đường dẫn trong trò chơi giữa chừng không đáng chú ý, nhưng tôi e rằng nó sẽ một khi nó sẽ trở nên phức tạp hơn.

Bất kỳ đề xuất, ý kiến, ý kiến, sẽ được giúp đỡ.

Biên tập:

Hiện tại, hãy plà số lượng đường được tính toán trước, một sinh vật có xác suất 1/pđi theo một đường dẫn mới (có nghĩa là tính toán đường dẫn) thay vì đường dẫn hiện có.
Một sinh vật không bắt đầu tuần tra cho đến khi con đường được tính toán hoàn toàn, vì vậy không cần phải lo lắng về việc anh ta bị giết trong quá trình này.


8
Tại thời điểm này, nó sẽ được tối ưu hóa trước. Tôi sẽ để nó như là cho đến khi có một vấn đề.
John McDonald

3
Và để hòa nhập một chút với @JohnMcDonald, nếu bạn có thể tính toán các đường dẫn giữa trò chơi này và không đáng chú ý, chúng có thể có bao nhiêu yếu tố đóng góp trong thời gian tải?
James

Câu trả lời:


6

BerickCook đã thể hiện ý tưởng chính xác. Để lại các tính toán nếu chúng hoạt động đúng bây giờ.

Nếu bạn có thể thực hiện phép tính trước đó và bạn chắc chắn rằng bạn sẽ không cần chúng vào giữa trò chơi, thì hãy làm điều đó trước. Khác làm điều đó sau khi tải. Nếu tính toán trong trò chơi là không đáng chú ý, bạn có thể làm điều đó ở đó. Nếu tại một thời điểm nào đó, sự phức tạp phát triển và các tính toán trở nên quá nặng nề bắt đầu tối ưu hóa.

Nhưng có một điều: nếu tính toán của bạn được triển khai để chạy mid game, bạn luôn có thể buộc chúng phải được thực hiện trong khi tải.

Có nhiều giải pháp:

  • tính toán / tải các đường dẫn trong quá trình tạo / tải mức
  • sử dụng một luồng thứ hai để tính toán các đường dẫn
  • tối ưu hóa thuật toán của bạn
  • sử dụng một hệ thống ngắt nếu bạn không có quyền truy cập vào luồng.

Tôi đã thấy và sử dụng tùy chọn cuối cùng trong một trò chơi thị trường đại chúng. Chỉ cần đảm bảo rằng bạn lưu đúng tất cả dữ liệu cần thiết để tính toán tiếp tục và kiểm tra thường xuyên thời gian / thao tác còn lại trong quá trình tính toán.

Tùy thuộc vào trường hợp của bạn, hệ thống ngắt có thể đưa ra các giải pháp sơ bộ và một phần có thể được sử dụng trước khi tính toán kết thúc.


Chỉnh sửa : trả lời @Keeper

"Thuật toán ngắt" chỉ hữu ích vì những hạn chế mà chúng tôi có. Về cơ bản, chúng tôi giảm nhẹ đến việc thiếu đa luồng.

Tại một thời điểm chúng tôi đã có một trò chơi trong đó AI phải tính toán số lượng lớn các bước di chuyển dựa trên nhiều từ điển. Trong quá trình tính toán này, tất cả các hình ảnh động sẽ dừng lại vì từ điển được mở rộng với nhiều dữ liệu hơn và bộ dữ liệu chứa dữ liệu đã bị thay đổi và kém hiệu quả hơn khi trò chơi được điều chỉnh cho nhiều người chơi (trong đó AI phải tương tác ngay cả khi di chuyển của người chơi). Chúng tôi chỉ có một luồng có sẵn cho vòng lặp trò chơi (bắt buộc là mã đa nền tảng phải chạy trên tất cả các nền tảng được hỗ trợ). Tại thời điểm này, nó đã được quyết định phá vỡ thuật toán tính toán để chúng tôi có thể làm gián đoạn nó. Do đó, chúng tôi không thể sử dụng hệ thống đệ quy tại chỗ vì các biến không thể được lưu. Các hàm được thay thế bằng các đối tượng chỉ đơn giản chứa tất cả các biến và con trỏ cần thiết cho các đối tượng cha và con. Tôi không

  • lưu trạng thái của các tính toán hiện tại của nó
  • ngắt ở cuối vòng lặp hoặc trong vòng lặp (khi đối tượng con bị gián đoạn)
  • thoát khi hết thời gian
  • tiếp tục khi nó dừng hoặc khởi động lại một vòng lặp ở chỉ mục bên phải hoặc gọi đối tượng con hiện đang ở đầu ngăn xếp con của nó.
  • làm sạch mọi thứ nếu tính toán bị gián đoạn
  • cho kết quả một phần tốt nhất.

Chỉ các hoạt động đắt tiền nhất được chia thành các đối tượng riêng biệt và phải mất một thời gian để tìm đúng nơi mà chúng ta có thể dừng các phép tính, nhưng cuối cùng nó hoạt động rất tốt.

Chúng tôi đã mất hiệu suất, nhưng hiệu suất cảm nhận tốt hơn cho người dùng vì hoạt ảnh chạy trơn tru trên tất cả các nền tảng, tất cả các nền tảng sau đó có thể sử dụng từ điển lớn hơn mà không bị ảnh hưởng hay đóng băng. Ngoài ra, điều này cho phép chúng tôi chạy song song nhiều trường hợp khi chúng tôi cần sau này.

Tất nhiên bây giờ trên iPhone và iPad, trò chơi không cần điều này, sử dụng một luồng thứ hai sẽ là lý tưởng. Nhưng tôi nghi ngờ mã vẫn còn đó.


Cảm ơn, điều đó nghe rất thú vị. Bạn có thể giải thích rõ hơn về khái niệm "hệ thống ngắt" (tại sao và như thế nào). (googling nó không hữu ích lắm ..). Tôi sẽ thêm một số chi tiết cho câu hỏi.
Keeper

@Keeper Tôi hy vọng tôi đã trả lời câu hỏi của bạn về phần ngắt quãng. Đó là một nỗi đau trong nhưng phải làm và nó không liên quan trên hầu hết các hệ thống hiện đại.
Coyote

Mặc dù bây giờ tôi sẽ không sử dụng phương pháp này, bạn đã mở mắt cho tôi một cái gì đó mới. Câu trả lời của bạn xứng đáng được chấp nhận.
Keeper

8

Hiện tại, vì việc tính toán các đường dẫn giữa trò chơi là không đáng chú ý, đó là cách tiếp cận lý tưởng. Nếu / khi đến điểm mà trò chơi bị gián đoạn bởi các tính toán, thì hãy chuyển nó sang tính toán trên mỗi đường dẫn trước khi mức được tải.

Thời gian tải ban đầu lâu hơn có thể được tha thứ, nhưng biến động FPS ngẫu nhiên trong khi chơi thường không có.


2

Một khả năng nếu bạn cần là chuyển các phép tính sang luồng thứ hai vì hầu như mọi PC đều có nhiều lõi CPU ngày nay.

Quy trình cơ bản sẽ là:

  • Khi một sinh vật yêu cầu một đường dẫn thêm yêu cầu vào hàng đợi yêu cầu an toàn của luồng và báo hiệu luồng.
  • Sinh vật đứng yên trong khi chờ đợi chủ đề bật ra khỏi hàng đợi đó, xử lý nó và đưa nó vào danh sách hoàn thành.
  • Mỗi khung kiểm tra danh sách đã hoàn thành từ luồng chính và gán đường dẫn hoàn thành cho sinh vật.

Bạn cũng phải coi chừng một vài trường hợp cạnh thêm (ví dụ: nếu sinh vật chết trước khi yêu cầu được xử lý).


2
Nếu bạn không muốn giới thiệu luồng, bạn cũng có thể tính toán đường dẫn của mình tăng dần (ví dụ: tính toán một số bước mỗi khung hình).
bummzack
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.