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 đó.