Làm cách nào để triển khai Fog of War một cách hiệu quả trong trò chơi Chiến lược thời gian thực?


7

Sương mù chiến tranh được triển khai như thế nào trong các game RTS như StarCraft II hay Age of Empires ? Tôi đang thực hiện một RTS và lên kế hoạch cho mọi đơn vị trên sân để có tầm nhìn tròn lên đến một bán kính nhất định.

Suy nghĩ đầu tiên của tôi là có một mặt nạ màu đen cho mọi điểm trừ các điểm gần với các đơn vị, nơi nó trong suốt. Bản thân hoạt động mặt nạ này rất nhanh trong hầu hết các API đồ họa (ví dụ: chỉ cần gọi mixtrong một shader ). Phần khó là tìm ra mặt nạ nào sẽ sử dụng và cách cập nhật nó: cập nhật nó khi bất kỳ đơn vị nào di chuyển rất nặng bộ xử lý.

Có cách nào đơn giản hơn để quản lý loại sương mù chiến tranh này không?

Câu trả lời:


5

Nếu trò chơi của bạn có chiếm chỗ dựa trên ô, bạn có thể giảm sương mù tính toán chiến tranh bằng cách giới hạn ngày đến thời điểm khi một đơn vị vượt qua ngưỡng từ ô này sang ô khác.


Vâng, chỉ cần nghĩ về điều này. Tôi có thể có các ô vuông trong trường trò chơi của mình, giả sử 128x128 hoặc đại loại như thế. Tôi có thể có 3 trạng thái tế bào, nhìn thấy đầy đủ, không nhìn thấy và nhìn thấy một phần. Điều đó có thể làm việc ra.
ChemiCalChems

9

Câu trả lời tiếp theo dựa trên trải nghiệm RTS của chính họ, phù hợp trực quan với Age Of Empires và các trò chơi RTS khác

Ngày nay không chỉ có một, mà là 2 Fog Of Wars (FOW)

Tĩnh FOW đơn giản hơn (một khi được tiết lộ, vẫn mở):

FOW đầu tiên được tính toán trên CPU và được sử dụng cho logic trò chơi để kiểm tra các đơn vị "nhìn thấy" trong trò chơi và có thể / không thể làm gì. Đối với RTS, nó phải giống nhau 100% giữa tất cả các máy của người chơi và cài đặt đồ họa và có thể lặp lại 100%, giả sử rằng RTS theo truyền thống sử dụng nhiều người chơi bước khóa. Do đó, để tránh tải CPU thêm, nó phải chi tiết hơn - ví dụ: 1 mẫu trên mỗi ô trên 5 dấu kiểm logic của trò chơi (hoặc bạn có thể tối ưu hóa bằng cách chỉ cập nhật hình ảnh đơn vị khi chúng đến ô mới).

FOW thứ hai được hiển thị trên GPU và năng động / chi tiết hơn. FOW này là những gì người chơi nhìn thấy . GPU có thể kết xuất / cập nhật mọi khung hình ở độ phân giải cao hơn nhiều mà CPU có thể xử lý (ví dụ 4096 * 4096 pixel), để tạo ra các vòng tròn nhìn mượt mà. FOW chính xác hơn nhiều, có thể không khớp với logic của trò chơi FOW một chút, điều đó không sao, vì sự không phù hợp điển hình xảy ra ở cạnh FOW nơi phán đoán chính xác là mơ hồ.

Tại sao không sử dụng GPU FOW cho cả logic và hình ảnh? Phải mất rất nhiều thời gian để truyền dữ liệu kết cấu từ GPU trở lại CPU. Kết xuất GPU không thể tin cậy được, nó có thể khác nhau rất nhiều giữa cấu hình / trình điều khiển / cài đặt của người chơi.

Đối với FOW tĩnh, bạn có thể thoát khỏi một loại cập nhật "phụ gia" - mỗi lần cho mỗi mẫu FOW - chọn mức sáng nhất và giữ nó.


Làm cho FOW năng động là một vấn đề phức tạp khác. Đơn giản nhất, FOW năng động có thể có 5 trạng thái: được bảo hiểm đầy đủ, bán thăm dò, khám phá, bán tiết lộ, tiết lộ đầy đủ. Bạn có thể ánh xạ các trạng thái này thành 0, 1-49, 50, 51-99, 100-255. Bây giờ khi đơn vị tiết lộ sương mù, nó sẽ hiển thị thành 255. Mỗi dấu hiệu bạn mờ "bán lộ" và "tiết lộ đầy đủ" FOW bằng ví dụ 10. Điều này có nghĩa là khi đơn vị rời đi, FOW vẫn "tiết lộ đầy đủ" trong 15 tích tắc trước khi bắt đầu mờ dần đến nửa tiết lộ và sau đó 5 tích tắc khác trước khi dừng lại ở "khám phá".


Làm thế nào để có được thông tin về các vị trí và bán kính nên được che dấu hay không? Nơi lưu trữ các giá trị cho bao nhiêu dấu tích khu vực này vẫn sẽ được nhìn thấy? Nếu những phần đó không được thực hiện hiệu quả như được hỏi trong câu hỏi - thì không có lý do gì để gọi nó là một giải pháp hiệu quả. Nếu bạn có thể giải thích làm thế nào để làm điều này, bạn sẽ là tốt nhất! Thật tệ khi OP đã đóng câu hỏi này như đã trả lời. Bởi vì anh ta đã không có được một ý tưởng thực sự về một giải pháp của sương mù thực hiện chiến tranh. Câu trả lời cho các thực hành tốt, nhưng vẫn còn rất nhiều cho nó.
Mặt trăng thí sinh _Max_

Ví dụ: bạn sẽ đi qua mọi đơn vị O (n) hoặc mọi ô O (n ^ 2)? Hoặc có thể thêm mọi đơn vị đã thay đổi ô của mình thành Heap và thực hiện với O (2log (n)) (Bổ sung + Xóa).
Mặt trăng thí sinh _Max_

Bạn cũng có thể thêm một Heap Fibros, điều đó sẽ làm cho nó O (log (n)).
Mặt trăng thí sinh _Max_

-2

Unity cho phép bạn thêm "cookie" vào nguồn sáng, nó sẽ che ánh sáng dựa trên kết cấu hình ảnh - mà bạn có thể cập nhật bằng cách sử dụng RenderTexture cho kết cấu đó và sau đó cập nhật với sương mù chiến tranh của bạn.

Tôi sẽ đề nghị giữ và cập nhật sương mù dữ liệu chiến tranh thô trong bộ nhớ chính, và sau đó, một lần trên mỗi khung hình, tuôn ra bất cứ thứ gì bạn cần cho mặt nạ sương mù chiến tranh của bạn trên RenderTexture.


Điều này không trả lời câu hỏi.
Sean Middleditch

2
Tôi nghĩ rằng bạn đã bị hạ thấp bởi vì nó trả lời câu hỏi trong một ngữ cảnh cụ thể: sự thống nhất, trong một câu hỏi chung
MVCDS
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.