Bối cảnh
Old Lucas Arts (kỷ nguyên ScummVM) và nhấp vào các trò chơi phiêu lưu đồ họa được sử dụng tìm đường dẫn được tính toán trước. Đây là một phác thảo sơ bộ của kỹ thuật.
Bước 1
Tầng trong mỗi phòng được chia thành cái mà họ gọi là "hộp đi bộ", tương đối giống với các nút trong lưới điều hướng, nhưng giới hạn ở hình dạng hình thang. Ví dụ:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
Bước 2
Một thuật toán ngoại tuyến (ví dụ Dijkstra hoặc A *) sẽ tính toán đường đi ngắn nhất giữa mỗi và mỗi cặp nút và lưu trữ bước đầu tiên của đường dẫn trong ma trận 2D, được lập chỉ mục theo từng chiều bởi nút bắt đầu và kết thúc được sử dụng. Ví dụ: sử dụng các hộp đi bộ ở trên:
___ ___ ___ ___
| A | B | C | D | <- Start Node
___|___|___|___|___|
| A | A | A | B | C | ---
|___|___|___|___|___| |
| B | B | B | B | C | |
|___|___|___|___|___| |-- Next node in shortest path
| C | B | C | C | C | | from Start to End
|___|___|___|___|___| |
| D | B | C | D | D | ---
|___|___|___|___|___|
^
|
End Node
Như bạn có thể đoán, các yêu cầu bộ nhớ tăng nhanh khi số lượng nút tăng (N ^ 2). Vì một đoạn ngắn thường sẽ đủ lớn để lưu trữ từng mục trong ma trận, với một bản đồ phức tạp gồm 300 nút sẽ dẫn đến việc lưu trữ thêm:
300^2 * sizeof(short) = 176 kilobytes
Bước 3
Mặt khác, việc tính toán con đường ngắn nhất giữa hai nút là cực kỳ nhanh và tầm thường, chỉ là một loạt các tra cứu vào ma trận. Cái gì đó như:
// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
Current = LookUp[Current, End]
Path.Add(Current)
ENDWHILE
Áp dụng thuật toán đơn giản này để tìm đường đi ngắn nhất từ C đến A trả về:
1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit
Câu hỏi
Tôi nghi ngờ rằng với phần cứng mạnh mẽ ngày nay, cùng với các yêu cầu về bộ nhớ để thực hiện điều này cho mọi cấp độ, bất kỳ lợi ích nào mà kỹ thuật này từng có hiện nay đều vượt trội khi chỉ cần thực hiện A * khi chạy.
Tôi cũng đã nghe nói rằng ngày nay việc tra cứu bộ nhớ thậm chí có thể chậm hơn so với tính toán chung, đó là lý do tại sao việc tạo các bảng tra cứu sin và cos không còn phổ biến nữa.
Nhưng tôi phải thừa nhận rằng tôi chưa quá am hiểu về những vấn đề này về hiệu quả phần cứng cấp thấp, vì vậy tôi nhân cơ hội này để hỏi ý kiến của những người quen thuộc hơn với chủ đề này.
Trên công cụ của tôi, tôi cũng cần khả năng tự động thêm và xóa các nút vào biểu đồ khi chạy ( xem phần này ) để tuyến đường được tính toán trước chỉ làm cho mọi thứ trở nên phức tạp hơn, vì vậy tôi đã loại bỏ nó (không đề cập đến giải pháp A * thời gian chạy của tôi đã chạy hoàn hảo ). Tuy nhiên, tôi vẫn còn băn khoăn ...
Điểm mấu chốt, kỹ thuật này ngày nay vẫn còn phù hợp trong bất kỳ kịch bản nào?