Khi nào một công cụ song song trở thành một giải pháp tốt?


8

Tôi thường cố gắng phá vỡ trò chơi Tôi đang cố gắng thử một kiến ​​trúc dựa trên các nhiệm vụ song song, nhưng điều đó dường như không phải là một yêu cầu lớn đối với dự án của tôi vì vậy tôi tránh điều này vào lúc này. Tôi dự định chỉ thử nó trong một dự án đồ chơi trước, để "chơi với khái niệm".

Bây giờ, điều tôi đang hỏi là, rất nhiều game (không phải AAA) không yêu cầu hiệu năng thực sự cao, cảm giác như sử dụng một công cụ dựa trên nhiệm vụ không đáng bận tâm cho đến khi ... trường hợp nào?

Hiện tại, tôi chỉ đoán rằng điều đó là cần thiết khi bạn thực sự cần khai thác hiệu suất tối đa của phần cứng (đa lõi). Có trường hợp nào khác là sử dụng công cụ dựa trên nhiệm vụ không? Hoặc có thể, đối với các dự án mới, luôn luôn tốt khi bắt đầu với một công cụ dựa trên nhiệm vụ?

Câu trả lời:


7

Luồng được sử dụng trong hai tình huống:

  1. Khi bạn có nhiều việc phải làm nhưng cần duy trì khả năng phản hồi của người dùng.
  2. Khi bạn cần sức mạnh của nhiều hơn một lõi xử lý trên nền tảng / yêu cầu tối thiểu yêu thích của bạn.

Nếu bạn có thể mong đợi một cách hợp lý một trong hai hoặc cả hai điều này là cần thiết, thì hãy đi cho nó. Khác, không. Tất nhiên, không ai có thể ngăn bạn xâu chuỗi cho vui vì bạn có thể, hoặc chọc ngoáy và điều tra nó, nhưng về mặt thực hiện luồng vì lợi ích của việc thực sự có được một ứng dụng đa luồng, thì hai trường hợp sử dụng ở trên là khá nhiều đó


2
+1 cho khả năng đáp ứng: một trong những yêu cầu đối với dự án chính của tôi là không có màn hình tải, trải nghiệm liên tục để có thể ngâm tối đa. Đó là một điểm hay.
Klaim

1
+1 chính xác lý do tại sao tôi sử dụng nhiều luồng trong trò chơi giải đố: công việc nặng nhọc (kiểm tra hàng triệu kết hợp) mà không đóng băng UI.
tro999

"Không có màn hình tải, trải nghiệm liên tục" - bạn sẽ phải xây dựng toàn bộ kiến ​​trúc của mình xung quanh ý tưởng này, đó là một sự thoát khỏi thiết kế "tải một cấp và chơi trong đó, sau đó tải một cấp độ khác" mà hầu hết các động cơ nhỏ sử dụng.
Patrick Hughes

14

Nếu trò chơi của bạn sẽ chuyên sâu về phần cứng từ xa thì bạn cần các luồng để đối phó với tất cả các phần cứng hiện đại; CPU tương lai sắp ra mắt trong một hoặc hai năm tới sẽ bắt đầu tạo ra 4 lõi tối thiểu và tối đa 16 lõi cho thị trường đam mê / hiệu năng. Nếu bạn đang thực hiện bất kỳ đa luồng nào, chắc chắn thực hiện một kiến ​​trúc hướng theo nhiệm vụ vì bất kỳ mô hình luồng nào khác vốn đã bị phá vỡ cho các công cụ trò chơi hướng tới.

Bây giờ hãy nhớ rằng "tác vụ" tôi có nghĩa là "công việc" chứ không phải "các luồng riêng biệt cho các hệ thống con động cơ khác nhau." Bạn hoàn toàn không muốn làm một cái gì đó như có một luồng đồ họa, một luồng vật lý, một luồng AI, v.v. Điều đó không vượt quá một số lõi nhỏ và dù sao nó cũng không thực sự mang lại cho bạn bất kỳ sự song song thực sự nào. Vật lý không nên chạy nhiều hơn một bản cập nhật cho mỗi bản cập nhật AI (bạn muốn AI của mình có thể phản ứng với các sự kiện vật lý) và đồ họa gần như không có gì mới để kết xuất nếu vật lý không chạy, do đó, mỗi hệ thống con tự nhiên chạy theo trình tự đặt hàng. Bạn không'

Những gì bạn muốn là làm điều này. Tạo một ống chỉ. Chạy vòng lặp trò chơi của bạn với chuỗi cập nhật hệ thống con cổ điển. Tuy nhiên, đối với mỗi hệ thống con, hãy phân tách khối lượng công việc thành các lô riêng biệt và phân phối chúng cho nhóm luồng. Đợi tất cả các công việc hoàn thành trước khi chạy trạng thái tiếp theo của vòng cập nhật trò chơi. Một số hệ thống con có thể có nhiều trạm biến áp; ví dụ, đồ họa có thể tạo ra một loạt các công việc để loại bỏ và sau đó là một loạt các công việc thứ hai để thực hiện tạo hàng đợi. Cách tiếp cận này tránh được vấn đề đồng bộ hóa của cách tiếp cận đầu tiên, chia tỷ lệ cho số lượng lõi lớn hơn nhiều, và thẳng thắn chỉ là dễ dàng hơn để mã hóa, gỡ lỗi và bảo trì.


Cảm ơn những lời khuyên về cách chế tạo loại động cơ này nhưng tôi đã được ghi chép đầy đủ nên không cần thiết. Đó là câu hỏi "khi nào nó đáng giá" mà tôi hỏi. Tôi nghĩ rằng vẫn là một điều tốt để chỉ ra những thông tin cho những người không biết vì vậy đừng xóa chúng :)
Klaim

Nghe có vẻ rất hợp lý
Den

Giống như Apple, một khi bạn đã quen với công việc thì sẽ không quay trở lại =) Đây là một gợi ý kiến ​​trúc tốt cho bất kỳ công cụ mới nào.
Patrick Hughes

@SeanMiddleditch Bạn không chỉ thay đổi mức độ chi tiết của luồng theo cách đó sao? Thay vì chỉ một luồng trên mỗi hệ thống (thực sự không có khả năng mở rộng, một số hệ thống đói nhiều năng lượng hơn các hệ thống khác và cũng có thể có nhiều hệ thống có sẵn lõi hơn), bạn đang thực hiện nhiều luồng trên mỗi hệ thống. Vì vậy, bạn đang tinh chỉnh mức độ chi tiết của dữ liệu mà mỗi luồng hoạt động. Không chắc chắn làm thế nào điều này sẽ diễn ra, nhưng tôi không có gì tốt hơn để thêm vào. Bạn vẫn giữ quan điểm này sau 7 năm? Cảm ơn.
Nikos

1
@ Nik-Lz: không, bởi vì "nhiều luồng trên mỗi hệ thống" ngụ ý rằng bạn biết các luồng trên mỗi hệ thống nên là gì. Bạn nên có 2 chủ đề để kết xuất và 3 cho vật lý? Có bao nhiêu cho AI? Tất cả sẽ không phụ thuộc vào cảnh cụ thể và ngay cả nơi người chơi đang nhìn và những gì đang diễn ra trong thời điểm này? Một hệ thống công việc dễ dàng linh hoạt quy mô theo nhu cầu trước mắt thay vì tạo toàn bộ một luồng cho một hệ thống con có thể không cần nó ngay bây giờ.
Sean Middleditch

0

Có hai cách sử dụng trong đa luồng, một là để tăng cường hiệu suất chương trình của bạn và hai là để chương trình chạy khi có một quá trình lớn đang diễn ra. ví dụ: khi bạn đang cố tải một số dữ liệu, thật phiền nếu chương trình của bạn bị treo, vì vậy bạn có thể sử dụng một luồng khác để tải và giữ cho luồng chính miễn phí để tiếp tục vòng lặp chính. tăng cường hiệu suất bằng cách sử dụng các chủ đề là mặt khác một cái gì đó thực sự khó khăn. vì thông thường bạn làm mọi thứ trong một quy trình tuyến tính và đó là điều tương phản với xử lý song song. và bạn luôn phải sử dụng luồng chính của mình để cập nhật thiết bị đồ họa khiến việc phân chia nhiệm vụ giữa các luồng trở nên khó khăn hơn.


1
Threading không khó. :) Đó chỉ là điều mà nhiều người không bao giờ học cách làm đúng, vì vậy họ nghĩ rằng nó khó do thiếu kinh nghiệm. Đặc biệt trong các trò chơi, nhiều thuật toán và cấu trúc dữ liệu cốt lõi khá dễ xử lý với nhiều luồng. Chẳng hạn, các cập nhật vật lý có thể được chia thành các đảo của các đối tượng và mỗi trang trại được đưa vào một luồng khác nhau để tích hợp và phân giải. Tương tự như vậy, việc loại bỏ các đối tượng cho đồ họa là hoàn toàn không có sự tranh chấp truy cập dữ liệu đọc-ghi.
Sean Middleditch

@seanmiddleditch Tôi không nói rằng việc sử dụng các luồng chính nó là một điều khó khăn nhưng quản lý để sử dụng các luồng hiệu quả và cân bằng chúng để chia sẻ cùng tải là một điều khó khăn.
Ali1S 232
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.