Làm thế nào để Pháo đài Lùn theo dõi rất nhiều thực thể mà không làm giảm hiệu suất?


79

Trong Pháo đài Lùn, bạn có thể có hàng trăm Người lùn, động vật, yêu tinh, v.v. trong trò chơi bất cứ lúc nào, mỗi người đều có AI và thói quen tìm đường phức tạp của riêng mình. Câu hỏi của tôi là làm thế nào điều này không tạo ra sự chậm lại đáng chú ý? Có phải mỗi Dwarf chạy trong chủ đề riêng của mình?


6
Câu hỏi thú vị. Mặc dù tôi không thích cách nó diễn đạt, vì nó chỉ là suy đoán để trả lời câu hỏi này như được diễn đạt. Dù sao, bạn có thể đã thấy bài viết này nói chuyện với Tarn Adams. Nơi họ ngắn gọn bao gồm tìm đường dẫn.
MichaelHouse

25
hoàn toàn tạo ra sự chậm chạp đáng chú ý khi bạn có một cấu trúc liên kết đường hầm phức tạp và hơn 100 người lùn.
Russell Borogove

3
Vâng, DF theo kinh nghiệm của tôi là cực kỳ chậm trong kịch bản bạn mô tả.
tranh luận

4
Phá hủy một cầu thang chính và xem khung hình của bạn rơi xuống như tảng đá trong giây lát trong khi mọi người lùn đột nhiên hối hận cùng một lúc.
Vịt Mooing

2
Tôi sẽ đồng ý và đồng ý rằng DF không phải là ví dụ tốt nhất; trong thực tế DF nổi tiếng là chịu các vấn đề về hiệu suất.
Robert S.

Câu trả lời:


110

Bất kỳ hệ thống nào có một luồng cho mỗi trong số rất nhiều ký tự sẽ hết tài nguyên rất nhanh. Các luồng có thể cung cấp cho bạn quyền truy cập vào các lõi xử lý bổ sung nhưng chúng không làm cho mọi thứ thực sự hiệu quả hơn và chúng đi kèm với chi phí hoạt động.

Câu trả lời đơn giản là hiệu quả trong việc xử lý từng thực thể trong trò chơi.

  • Đừng xử lý mọi thực thể mỗi khung.
  • Phân chia xử lý thành những thứ cần làm thường xuyên và những thứ không cần làm thường xuyên.
  • Truyền bá các thuật toán chạy dài trên nhiều khung để chúng không chặn xử lý trong các hệ thống khác.
  • Đảm bảo rằng các thuật toán hiệu quả và cấu trúc dữ liệu được sử dụng.
  • Lưu trữ kết quả của các tính toán đắt tiền nếu chúng có khả năng được sử dụng lại.

2
+1 cho điều này, vì thực sự giải thích những gì đang diễn ra, thay vì suy nghĩ về đồ họa như tôi. :)
Matt Kemp

4
Công bằng mà nói, tôi cũng cho bạn +1 vì tôi quên mất khía cạnh đó và điều đó rất đúng - đưa gfx ra khỏi phương trình và nó giống như làm cho máy tính nhanh hơn gấp 2 hoặc 3 lần.
Kylotan

Tôi đã nghe nói rằng DF bây giờ là đa luồng, nhưng ít nhất cho đến gần đây, tất cả đã được thực hiện trong một luồng. (Có thể vẫn còn, không chắc chắn)
Vịt Mooing

@MooingDuck Nó vẫn không.
Tharwen

63

Pháo đài lùn không phải là nguồn mở và trong khi có rất nhiều phỏng đoán và kỹ thuật đảo ngược có thể đi sâu vào cách thức hoạt động của tất cả mọi thứ, thay vào đó tôi sẽ tập trung vào một số kỹ thuật cơ bản để tối ưu hóa một trò chơi 3D (không phải đồ họa 3D, thế giới 3D) của cùng loại.

Như trường hợp của tất cả các trò chơi video, có rất nhiều khói và gương đang tạo ra ảo ảnh về sự phức tạp từ các quy tắc và hệ thống đơn giản. Những phạm vi này từ việc sử dụng các số ngẫu nhiên đơn giản cho chuyển động không có mục đích cho đến trước khi nướng một lưới các nút cấp cao để tìm đường.

Phong trào

Nói về tìm đường, đây thường có thể là một vấn đề rất khó giải quyết đối với các không gian rộng như bản đồ DF có thể (nhiều như 768x768x64 IIRC) tuy nhiên vấn đề có thể được đơn giản hóa và tăng tốc theo những cách sau:

  • Mạng nút được nướng sẵn: Khi bản đồ được tạo, thế giới có thể được chia thành các phần và mỗi đoạn có thể có lối ra và lối vào được ánh xạ. Khi một đoạn được cập nhật, chẳng hạn như khi một bức tường được xây dựng, chỉ có mạng lưới của đoạn đó cần được cập nhật.
  • Tìm đường theo giai đoạn: Chạy một đường dẫn trên toàn bản đồ, ô cho ô, sẽ mất rất nhiều thời gian, thay vào đó bạn sẽ tìm đường trên mạng chunk lớn hơn, ánh xạ tất cả các kết nối giữa các đoạn, và sau đó chỉ chạy một đường trong khi chuyển từ chunk sang chunk. Điều này làm 2 điều cho bạn. Nó tăng tốc độ tìm đường bằng cách phá vỡ nó trên nhiều mảnh nhỏ hơn và nó cũng cho phép thiết bị thay đổi hướng một phần dọc theo đường dẫn khi một đoạn cập nhật. Nó sẽ đường dẫn lại qua mạng lớn nếu có bất kỳ nút nào cần cập nhật chéo.
  • Chỉ đạo ngẫu nhiên: Khi không di chuyển đến mục tiêu, đơn vị chỉ cần đi bộ không mục đích. Nhiều roguelike chỉ di chuyển đơn vị theo một hướng ngẫu nhiên, cảm thấy không tự nhiên. Có thể sử dụng nhiều kỹ thuật lái khác nhau, những kỹ thuật đơn giản được ưu tiên để di chuyển theo đường thẳng và càng ngày càng ít cơ hội di chuyển theo các hướng tỏa ra phía sau, chỉ có khoảng 1% cơ hội. Vì vậy, các đơn vị đôi khi sẽ đảo ngược hoàn toàn hướng, nhưng chỉ hiếm khi.

Tôi sẽ không bao gồm những điều cơ bản của tìm đường. Hầu hết các roguelike sử dụng A *, nhưng có những phương pháp khác để lột da mèo. Mmmm da mèo ..

Nhiệm vụ cá nhân

Một trong những điều quan trọng khiến các đơn vị DF bật và cảm thấy sống động là danh sách mục tiêu cá nhân của họ. Trong thực tế, nhiều trò chơi roguelike có điều này ở mức độ cơ bản. Về cơ bản, mỗi đơn vị có một danh sách các mong muốn (và đối với dorfs của bạn, các nhiệm vụ họ có thể nhận mà bạn yêu cầu thực hiện) và họ sẽ chọn từ chúng dựa trên tính cách (số liệu thống kê của họ).

Một số nhiệm vụ có yêu cầu. Làm một chiếc váy da đòi hỏi dorf phải ở trong một cửa hàng tương tự và có các mặt hàng X. Vì vậy, tất cả những người được kiểm tra và thêm dưới dạng nhiệm vụ vào danh sách của họ. Đơn giản như thế.

Vì hầu hết thời gian một đơn vị sẽ quá cảnh, việc kiểm tra xem đơn vị nào đang thực hiện có thể rất nhanh, chỉ một số đơn vị sẽ đưa ra lựa chọn tại bất kỳ thời điểm nào và do đó, tổng thể không có sự chậm lại nào cho hàng trăm hoặc Hàng ngàn đơn vị. Và hãy nhớ rằng, trong DF mọi thứ từ ong đến troglodyte đến cây đều là đơn vị.


Khi thực hiện một số nghiên cứu bổ sung, rõ ràng là, vui nhộn, DF đang thực hiện một công việc khủng khiếp là tìm đường nói chung. Nó không phá vỡ bản đồ thành nhiều phần, nó phá vỡ bản đồ thành các phân đoạn hoặc khu vực được kết nối, (tốt hơn là không có gì chắc chắn) vì vậy đánh giá trên của tôi thậm chí còn ít hơn một ví dụ về cách DF hoạt động hơn tôi nghĩ. :) Điều đó không phải để nói rằng DF là bất cứ điều gì ít hơn đáng kinh ngạc vì hàng triệu lý do khác.

Nó cho thấy rằng điều quan trọng trong một trò chơi là chơi trò chơi. Không đồ họa, không lập trình tuyệt vời, không viết hay, không nhạc hay, thậm chí không có giao diện; không có gì khác thậm chí là 1% quan trọng như chính trò chơi.


1
1024X1024X32? Dọc là 128 hoặc 256 tôi tin. Nó lớn hơn nhiều so với 32.
Lawton

@Lawton Tôi tin rằng tôi không chính xác về kích thước tối đa, nhưng chiều cao không phải là không chính xác. Tôi đang sửa nó. Tôi đã tải trò chơi và bắt đầu tôi chỉ cao khoảng 45 cấp. Nhiều thứ có thể là 'mô phỏng' nhưng tôi không có quyền truy cập vào chúng để đào hoặc xây dựng.
DampeS8N

@ DampeS8N Tôi vừa tải lên một bản đồ trung bình chưa được chỉnh sửa và có thể xem từ +16 đến -156, khoảng 180 cấp độ. Bản đồ 40 cấp là ngoại lệ, không phải là quy tắc. Ngay cả khi bạn chỉ có thể đào 40 trong số chúng do bị chặn bởi một tầng chứa nước hoặc dung nham, thì điều đó không liên quan, bởi vì khu vực bên dưới vẫn còn vui nhộn mô phỏng.
Lawton

@Lawton, bản đồ của tôi chỉ cho phép tôi vượt qua 45 cấp độ. Chúng hoàn toàn có thể thay đổi nhưng tôi không thể dễ dàng tìm thấy số lượng trên mỗi bản đồ có thể truy cập được. Nó cũng có thể phụ thuộc vào phiên bản trò chơi mà chúng tôi đang sử dụng. Cuối cùng, câu trả lời của tôi không quan trọng lắm.
DampeS8N

Đó là một bài viết cũ nhưng độ sâu trong pháo đài lùn phụ thuộc vào các lớp trầm tích. Giống như lớp vỏ trái đất dày hơn ở một số nơi. DF không hoàn toàn chính xác về mặt địa chất nhưng người đàn ông họ nghiên cứu nó giống như pro: D.
Madmenyo

50

Từ trang này :

Chà, [đường dẫn] trông tuyệt vời từ cuối của tôi, vì có một tấn các nhân vật cùng làm một lúc.

TA: Người lùn chủ yếu di chuyển xung quanh với A *, với heuristic đường phố cũ thường xuyên. Phần khó khăn là nó thực sự không thể gọi A * nếu họ không biết rằng họ có thể đến đó trước, hoặc cuối cùng sẽ làm ngập bản đồ và giết chết bộ xử lý.

Tôi không biết liệu đây có chắc chắn là cách anh ta ngăn chặn "làm ngập bản đồ" hay không , nhưng cách thông thường để làm điều này trong các trò chơi là sử dụng một sự thay đổi thành A * được gọi là Tìm đường phân cấp A * , hoặc HPA *. Ý tưởng là chia lưới thành nhiều phần nhỏ hơn nhưng lớn hơn, sau đó sử dụng A * để tìm đường đi tốt nhất từ ​​mỗi khối đến các đoạn lân cận. Bạn có thể sử dụng điều này để xây dựng một biểu đồ nhỏ hơn nhiều để chạy A * cho mỗi đơn vị.

Tìm đường phân cấp

Bạn cũng có thể nhóm các khối đó thành các khối thậm chí lớn hơn, đó là nơi "phân cấp" đến từ.

Thuật toán này chỉ tìm thấy các đường dẫn gần tối ưu, nhưng đối với các trò chơi như Dwarf-Fortress thường là ok. Nó vẫn được đảm bảo để tìm một con đường nếu một người tồn tại; và khi không có đường dẫn, nó sẽ chỉ lấp đầy đồ thị nhỏ hơn, tiết kiệm một lượng thời gian khổng lồ.

Ngoài ra còn có một bản tóm tắt HPA * liên quan đến các đơn vị có thể đi qua một số địa hình nhưng không phải là các địa điểm khác (chẳng hạn như vách đá, các đơn vị không khí có thể đi qua nhưng các đơn vị mặt đất không thể) . Nó được gọi là HAA * , và có một bài viết rất dễ giải thích ở đây .

Bạn có thể đọc thêm về các thuật toán tìm đường khác nhau ở đây .


3
Tôi thấy video này từ nhà phát triển RimWorld rất ngộ. Đây là một trò chơi tương tự, trong khi chỉ ở dạng 2D. Ông giải thích những điều cơ bản đằng sau việc tìm đường và lợi ích của việc tách bản đồ thành các khu vực. youtube.com/watch?v=RMBQn_sg7DA
Sire

18

Nếu bất cứ điều gì, thì ngược lại - toàn bộ mọi thứ chạy trên một luồng và giờ nó đã chạm đến điểm đang trở thành yếu tố chặn (lần trước tôi đã kiểm tra!)

Lý do nhanh là không có đồ họa lạ mắt. Thật là lừa dối, nhưng điều chính yếu làm mọi thứ chậm lại là vẽ mọi thứ (nghĩ lên hai phần ba khung hình trong các tiêu đề AAA). Vì pháo đài lùn khá cơ bản, nó dành phần còn lại của thời gian đó để làm những điều thú vị.


8
Một điểm dữ liệu có lợi cho điều này là việc viết lại OpenGL từ một thời gian trước mà tôi nhớ đã mang lại sự gia tăng tốc độ khung hình lớn. Vì vậy, ngay cả việc thực hiện đồ họa sprite đơn giản mà DF đã có hiệu quả.
millimoose

3
Đồ họa +1 Dải = lượng thời gian rảnh rỗi khổng lồ cho điện toán chơi trò chơi
Laurent Couvidou

2
Điều đáng chú ý là đồ họa của DF cũng đòi hỏi khắt khe như bất kỳ game 2D độc lập hiện đại nào. Có rất nhiều kết cấu, ngay cả khi chúng nhỏ và đơn giản, và chúng có thể được trải rộng trên màn hình HD đầy đủ của bất động sản. Không có bất kỳ hiệu ứng hạt hào nhoáng nào hoặc những gì có bạn, nhưng công việc "vẽ tất cả các pixel" thô này vẫn còn và do số lượng lệnh gọi cần thiết cho kích thước gạch nhỏ thực sự là một thách thức lớn để thực hiện.
DampeS8N

Ban đầu nó có thể trông giống như một câu trả lời ngớ ngẩn, nhưng điều này là chính xác, hãy tưởng tượng những gì có thể được thực hiện với sức mạnh GPU 4-12gb gram và 4-12tflops nếu bạn không cần phải vẽ các nguyên hàm phức tạp, mở rộng, kết cấu, biến đổi các vectơ 3d thành một mảng 2d pixel, shader, v.v.
Felype

10

Tôi không biết DF được mã hóa như thế nào nhưng số lượng AI không thực sự gây ấn tượng với tôi bởi vì những gì mọi người thường giám sát rằng AI không cần độ chính xác . Hoàn toàn khả thi để làm hầu hết mọi thứ chỉ sau vài giây. Cũng có thể sử dụng các tính toán không chính xác. Sự không hoàn hảo tiết kiệm rất nhiều hiệu suất . Bạn có thể chạy quy trình ra quyết định 100 đơn vị cứ sau 100 ms hoặc bạn có thể chạy nó với 1000 đơn vị mỗi giây, sẽ mất cùng thời gian CPU nhưng ... bạn có 10 lần đơn vị.

Đây là một ví dụ đơn giản về cách người ta có thể xử lý nhiều đơn vị:

int curUnit;
Array<Unit> units;
[...]
while([...]) // Game Loop
{
  [...game logic...]
  // process 10 AIs per Frame
  for(int i=0; i++; i<10)
  {
    curUnit++
    if(curUnit == units.length()) curUnit=0;
    if(curUnit < units.length())
      units[curUnit].processAI();
  }

  // Update the position of all units, this should be as optimized as possible
  foreach(Unit& unit in units){ unit.move(); };

  [...graphics...]
}

AI sẽ ngày càng ít phản ứng hơn, nhưng người chơi có thể sẽ chỉ chú ý đến nó trong những trường hợp cực đoan.


Có rất nhiều điều để nói về việc bước qua các nhiệm vụ không chính xác ở mức khung hình. Các trò chơi AAA thường có hộp thời gian rõ ràng cho từng bộ phận riêng lẻ theo tỷ lệ phần trăm của khung để một bộ phận không thể giẫm lên chân của các bộ phận khác. Nếu phương pháp tạo hiệu ứng lắc lư cây dựa trên tốc độ và hướng gió chậm, sẽ có ít cây được xử lý hơn là ăn hết ngân sách của các đội khác.
DampeS8N
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.