Hiệu suất chậm khi triển khai A * trong trò chơi phòng thủ tháp


9

Tôi đang tạo một trò chơi Tower Defense trong Flash không có đường dẫn được xác định trước.

Mặc dù lưới của tôi là 40x40 (nhỏ?), A * đang gặp khó khăn khi tính toán lại mỗi lần. Vì vậy, tôi đã thực hiện sửa đổi của riêng mình để giảm bớt tính toán lại và số lượng tế bào cảm ứng giảm xuống khoảng 900 (khi sửa đổi gần gốc). Nó vẫn đóng băng trong một thời gian rất ngắn, nhưng có thể phát hiện được, khi một tòa tháp mới được đặt.

Đây có phải là một vấn đề thực hiện, hoặc là 40x40 quá nhiều?

Biên tập:

Cấu trúc mã của tôi:

  • Tất cả dữ liệu được lưu trong mảng 2d của các ô.
  • Mỗi ô chứa cha mẹ của nó theo hướng đường dẫn (1-8 theo chiều kim đồng hồ) và mảng được mã hóa theo bit của các con của nó trong đường dẫn (mỗi bit đại diện cho một con).
  • Việc tìm kiếm được thực hiện bởi A * với ước tính khoảng cách eidianidian.

Bạn sẽ cần phải cụ thể hơn nhiều ở đây. Chúng tôi không biết mã của bạn trông như thế nào, cấu trúc của nó như thế nào, v.v. và vì vậy chúng tôi không thể đưa ra bất kỳ kết luận nào về việc làm cho nó chậm.
Sean James

1
Khi tôi triển khai A * lần cuối cùng, tôi nhớ nó chạy qua lưới 64x64 trong tối đa 1ms. Vì vậy, yeah, nó dường như là một vấn đề với việc thực hiện của bạn. Tôi đề nghị đăng mã của bạn hoặc ý chính của nó để chúng tôi có thể giúp bạn thêm.
Marc Müller

Xem bản chỉnh sửa tôi đã thêm
Dani

1
Nếu 40x40 quá chậm, rất có thể bạn đang làm điều gì đó rất sai. Hoặc gửi mã của bạn hoặc hồ sơ nó. Ngoài ra, mở rộng quy mô và xem điều gì sẽ xảy ra - nếu lưới 80x80 mất hơn bốn lần thời gian, bạn đã có một thứ gì đó cực kỳ bị hỏng trong đó.
ZorbaTHut

Tiêu đề có thể là một chút thông tin hơn, xin vui lòng?
tenpn

Câu trả lời:


4

Tôi không thể nhận xét, nhưng hồ sơ đầu tiên trong Flex, mọi thứ khác là phỏng đoán.


Làm thế nào tôi có thể hồ sơ dự án flash trong flex?
Dani

Có và không. Tôi không nghĩ rằng bạn tải dự án flash trực tiếp. Tôi nghĩ rằng bạn có thể cấu hình swf mà không cần nguồn và vẫn nhận được thông tin cấp độ chức năng. Tôi sẽ làm một tìm kiếm google cho "hồ sơ dự án flash trong flex" hoặc tương tự. Tôi đã làm và nhận được điều này: flexblog.edchipman.ca/ Quảng có vẻ đầy triển vọng.
Jonathan Fischoff

Cảm ơn, thực sự đã giúp tôi tìm ra phần có vấn đề (không có trong thuật toán, xem bình luận về câu hỏi)
Dani

13

Tôi cho rằng TD là 'Tháp phòng thủ'

Tôi nghĩ rằng A * sẽ hơi quá mức cho việc này.

Khi bắt đầu trò chơi, lũ lụt lấp đầy khu vực trò chơi từ các điểm thoát để tạo bản đồ di chuyển:

 |---------|
 |5|4|3|3|3|
 |5|4|3|2|2|
->5|4|3|2|1->
 |5|4|3|2|2|
 |5|4|3|3|3|
 |---------|

và chuyển động luôn hướng tới một hình vuông có giá trị thấp hơn.

Khi người chơi đặt một tháp, cập nhật từng ô trong tám ô vuông liền kề: đối với mỗi ô vuông, đặt giá trị chuyển động của nó thành nhiều hơn một giá trị liền kề thấp nhất. Nếu giá trị thay đổi, lặp lại quy trình tập trung vào ô vuông được cập nhật. Sau đó, để kiểm tra xem tuyến đường đến lối ra không bị chặn, hãy đảm bảo tất cả các ô vuông nằm liền kề với một hình vuông có giá trị thấp hơn.

Khi người chơi xóa một tháp, đặt giá trị chuyển động thành nhiều hơn một ô vuông liền kề thấp nhất và lặp lại quy trình trên.

Một cách tiếp cận đơn giản hơn sẽ là làm lại việc lấp lũ.


6
Làm lại việc lấp lũ tốn kém hơn so với làm A * cho một số lượng nhỏ đơn vị - đại khái là chiều dài của bảng - ít nhất là về mặt thuật toán (và vì đây là Flash, các hằng số không phải thuật toán như bố cục bộ nhớ có thể ' t được sử dụng rất hiệu quả). Tuy nhiên, đây là một mô hình rất tốt cho nhiều đơn vị giao tiếp và được gọi là khuếch tán hợp tác - scalablegamedesign.cs.colorado.edu/wiki/Collaborative_Diffusion .

@Joe Wreschnig: wow liên kết tốt đẹp. Tôi đã sử dụng kỹ thuật đó trước đây nhưng chưa bao giờ biết nó được gọi là gì. Cảm ơn.
tenpn

@Joe, miễn là có ít nhất một vài rào cản trên bản đồ, tôi không nghĩ rằng điều này sẽ không hiệu quả hơn so với việc gọi A *. Đó là, tôi tin rằng chỉ đối với một bản đồ rộng mở, gần như không có rào cản với vài đơn vị có thể tệ hơn.
edA-qa mort-ora-y

@edA: Theo định nghĩa, vùng lũ cuối cùng phải chạm vào mọi điểm có thể truy cập trên bản đồ; A * cung cấp giới hạn trên đã được chứng minh về số điểm phải chạm, nhiều nhất là mọi điểm có thể truy cập trên bản đồ và thường ít hơn nhiều. Lấp đầy là một thuật toán đơn giản hơn để tối ưu hóa những thứ như bố cục bộ nhớ, nhưng như tôi đã nói, trong Flash có lẽ không thành vấn đề.

@Joe, đó là điều tôi đang tranh luận là thậm chí chỉ với một số ít tháp, A * có thể sẽ chạm vào gần như tất cả các không gian. Nhưng đối với N quái vật, nó chỉ cần vượt quá Total_squares / N để có hiệu quả thấp hơn so với lũ lụt.
edA-qa mort-ora-y

2

Kỳ lạ, tôi nghĩ rằng tôi đã trả lời này, nhưng câu trả lời dường như không còn nữa. Tạo thuật toán tìm kiếm của bạn sao cho có thể cập nhật theo nhiều bước để khi bạn đặt tháp và phát hình động, bạn có thể thực hiện từng chút một khung hình và bạn sẽ có một khoảng thời gian từ nửa giây đến giây để cập nhật A * không có tạm dừng đáng chú ý. Đó là độ trễ - iF bạn không thể tăng tốc, tìm cách che giấu nó. Chơi một hình ảnh động trong khi đặt một tòa tháp sẽ là điều tự nhiên cho một trò chơi và imo là một nơi tốt để che giấu nó.


Đây là một ý tưởng tốt nói chung, nhưng xấu cho câu hỏi cụ thể này. A * trên một lưới nhỏ như vậy sẽ gần như ngay lập tức, không mất một khoảng thời gian đáng kể.
davr

Đủ công bằng. Đó là câu trả lời duy nhất tôi có thể đưa ra sẽ giải quyết vấn đề mà không biết chi tiết thực hiện sẽ gây ra sự chậm lại.
Kaj

0

Để bắt đầu, bạn có thể thay đổi mảng của mình thành một vectơ - sẽ cung cấp cho bạn một số cải tiến về tốc độ. Đăng mã và chúng tôi có thể đề xuất nhiều tối ưu hơn.


0

Tôi đoán rằng sự chậm lại của bạn là bởi vì bạn đang tính toán một đường dẫn cho tất cả các ký tự cùng một lúc. Tính toán một đường dẫn cho một nhân vật là nhanh nhưng nếu có hai chục nhân vật trong cảnh thì điều đó có thể sa lầy.

Thay vào đó, bạn nên trải tải trên một vài khung hình. Sắp xếp các bản cập nhật AI của bạn để các nhân vật khác nhau cập nhật đường dẫn của họ trên các khung khác nhau. Sẽ thực sự đáng chú ý nếu một nhân vật không phản ứng cho đến một giây sau, nhưng chỉ một khung hình sẽ không gây ra phản ứng xấu.


Điều này đã được trả lời gần một năm trước và chỉ bị va đập vì công việc chỉnh sửa của Grace. (Không liên quan gì đến quá nhiều ký tự.)

Cảm ơn vì đã cho tôi biết. Tôi đã không thông báo ngày.
jhocking
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.