2009-02-21 23 views
22

Tôi không biết cách trò chơi thương mại hoạt động bên trong rất nhiều, nhưng các trò chơi nguồn mở mà tôi đã gặp không có vẻ ồ ạt vào luồng. Tương tự như vậy đối với hầu hết các ứng dụng máy tính để bàn khác, thông thường hai hoặc ba luồng dường như được sử dụng (ví dụ: logic chương trình và cập nhật GUI).Tại sao các chương trình lớn (chẳng hạn như trò chơi) sử dụng vô số chủ đề khác nhau?

Tại sao trò chơi không có nhiều chủ đề? Ví dụ các chủ đề riêng biệt cho vật lý, âm thanh, đồ họa, AI vv?

+2

Tính song song rất khó. Không chỉ "wow, đây là khó khăn" -hard nhưng "về mặt lý thuyết, rất nhiều vấn đề không phải là song song" -hard. –

Trả lời

14

Nhiều trò chơi trong những ngày này đang sử dụng hệ thống "công việc" hoặc "công việc" để xử lý song song. Tức là, trò chơi sinh ra một số chuỗi công nhân cố định được sử dụng cho nhiều nhiệm vụ. Công việc được chia thành các phần nhỏ và xếp hàng đợi, sau đó được gửi đi để được xử lý bởi các chủ đề công nhân khi chúng có sẵn.

Điều này đang trở nên đặc biệt phổ biến trên bảng điều khiển. PS3 dựa trên cấu trúc Cell nên bạn cần phải sử dụng xử lý song song để có được hiệu năng tốt nhất từ ​​hệ thống. Xbox 360 có thể mô phỏng một nhiệm vụ/thiết lập công việc được thiết kế cho PS3 vì nó có nhiều lõi. Có thể bạn sẽ tìm thấy hầu hết các trò chơi mà rất nhiều thiết kế hệ thống được chia sẻ giữa các mã hóa 360, PS3 và PC, vì vậy PC có khả năng sử dụng cùng một loại chiến thuật.

Trong khi rất khó để viết threadsafe mã, như nhiều câu trả lời khác chỉ ra, tôi nghĩ rằng có một vài lý do khác cho những điều bạn đang thấy:

  • Thứ nhất, nhiều trò chơi mã nguồn mở là một vài tuổi. Đặc biệt với thế hệ console lập trình song song này đang trở nên phổ biến và thậm chí cần thiết như đã đề cập ở trên.
  • Thứ hai, rất ít dự án nguồn mở có vẻ lo lắng về việc đạt được hiệu suất cao nhất có thể. Như John Carmack đã chỉ ra cho dự án Utah GLX, mã được tối ưu hóa cao thường khó duy trì hơn so với mã không được tối ưu hóa, vì vậy mã sau thường được ưu tiên trong các ngữ cảnh nguồn mở.
  • Thứ ba, tôi sẽ không thực hiện một số lượng nhỏ các chuỗi được tạo bởi trò chơi có nghĩa là nó không sử dụng tốt công việc song song.
15

Lý do chính là, như thanh lịch như nó âm thanh, sử dụng nhiều chủ đề trong một chương trình phức tạp như một trò chơi 3D thực sự, thực sự, thực sự khó khăn. Ngoài ra, trước khi giới thiệu khá gần đây về các hệ thống đa lõi chi phí thấp, việc sử dụng nhiều luồng không mang lại nhiều khuyến khích về hiệu suất.

23

Tôi không biết về các trò chơi bạn đã chơi, nhưng hầu hết các trò chơi đều chạy âm thanh trên một chuỗi riêng biệt. Mã mạng, ít nhất các trình lắng nghe socket chạy trên một chuỗi riêng biệt.

Tuy nhiên, phần còn lại của công cụ trò chơi thường chạy trong một chuỗi. Có những lý do cho việc này. Ví dụ: hầu hết quá trình xử lý trong trò chơi sẽ chạy một chuỗi phụ thuộc duy nhất. Đồ họa phụ thuộc vào trạng thái của động cơ vật lý cũng như trí tuệ nhân tạo. Thiết kế cho nhiều chủ đề có nghĩa là bạn phải có độ trễ khung giữa các hệ thống con khác nhau cho đồng thời. Bạn nhận được thời gian phản ứng nhanh hơn và chơi trò chơi snappier hơn nếu các hệ thống con này được tính tuyến tính mỗi khung hình. Các phần của trò chơi mà lợi ích nhất từ ​​song song là tất nhiên các hệ thống con rendering được offloaded để card đồ họa tăng tốc cao song song.

0

Có nhiều vấn đề với điều kiện chủng tộc và khóa dữ liệu khi sử dụng nhiều chuỗi. Vì các phần khác nhau của trò chơi khá phụ thuộc vào nhau nên không có ý nghĩa gì khi thực hiện tất cả các kỹ thuật bổ sung cần thiết để sử dụng các chuỗi tải.

1

Tôi sắp sửa đăng bài tương tự như William, nhưng tôi muốn mở rộng nó một chút. Rất khó để viết mã tối ưu cho tương lai. Với sự lựa chọn giữa viết một cái gì đó mà sẽ mở rộng đến phần cứng bạn không có so với viết một cái gì đó mà sẽ làm việc trên phần cứng bạn có, hầu hết mọi người sẽ chọn để làm thứ hai. Kể từ khi mô hình đơn lõi đã được với chúng tôi quá lâu, hầu hết các mã đã được viết (đặc biệt là cho các trò chơi, nơi có áp lực cực đoan để có được nó ra khỏi cửa) không phải là bằng chứng trong tương lai.

x86 rất tốt với các lập trình viên trò chơi, vì chúng tôi không phải suy nghĩ về các nhánh của nền tảng phần cứng ít được tha thứ hơn.

0

Rất khó để sử dụng các chuỗi không có vấn đề và hầu hết các API GUI đều dựa trên mã hóa sự kiện. Chủ đề ủy quyền sử dụng các cơ chế khóa làm tăng thêm độ trễ cho mã và thường sự chậm trễ đó là không thể đoán trước tùy thuộc vào người hiện đang giữ khóa.

Có vẻ hợp lý khi tôi có một chủ đề đơn lẻ (hoặc có lẽ rất ít) xử lý mọi thứ theo cách điều khiển sự kiện thay vì hàng trăm luồng đều gây ra lỗi lạ và không thể lặp lại.

1

Khác với những thách thức kỹ thuật về lập trình cho nhiều lõi, trò chơi thương mại phải chạy tốt trên hệ thống cấp thấp với nhiều lõi để kiếm tiền. Bây giờ các bộ vi xử lý đa nhân đã hết thời gian và các bộ điều khiển trò chơi chính có nhiều lõi, nó chỉ là vấn đề thời gian trước khi lõi kép hiển thị trên danh sách yêu cầu hệ thống tối thiểu cho trò chơi PC.

Đây là liên kết đến an interview with Orion Granatir từ Intel, nơi anh ấy đang nói về việc các nhà phát triển trò chơi tận dụng lợi thế của đa luồng.

1

Thực tế là mọi người ở đây đều khẳng định rằng việc đa luồng khó thực sự rất buồn. Chúng tôi rất cần phải làm cho hệ thống đồng thời dễ dàng.

Cá nhân tôi nghĩ chúng ta sẽ cần một sự thay đổi mô hình và các công cụ mới.

+1

thật không may, đó là cách nó là. Công cụ sẽ không làm cho các chủ đề dễ dàng hơn (chúng tôi đã có một số, ví dụ như openmp hoặc TBB). Vấn đề đơn giản là khó khăn. Có thể chúng ta sẽ có được các công cụ tốt hơn, nhưng chúng sẽ xuất hiện với chi phí cho hiệu năng đồng thời để làm cho các ứng dụng hoạt động chính xác. – gbjbaanb

+0

thay đổi mô hình, sau đó công cụ;) – Pyrolistical

15

Bạn cần phải suy nghĩ, lợi ích thực tế của chủ đề là gì? Hãy nhớ rằng trên một máy tính cốt lõi, các chủ đề không thực sự cho phép thực hiện đồng thời, chỉ là ấn tượng của nó. Đằng sau hậu trường, CPU là bối cảnh chuyển đổi giữa các chủ đề khác nhau, làm một công việc nhỏ trên mỗi lần. Vì vậy, nếu tôi có một số nhiệm vụ liên quan đến việc không chờ đợi, chạy chúng đồng thời (trên một lõi đơn) sẽ không nhanh hơn chạy chúng tuyến tính. Trong thực tế, nó sẽ chậm hơn, do chi phí bổ sung của chuyển đổi ngữ cảnh thường xuyên.

Nếu đúng như vậy thì tại sao lại sử dụng đề tài trên một máy tính lõi đơn? Đầu tiên, vì đôi khi các tác vụ có thể kéo dài trong một thời gian chờ đợi trên một số tài nguyên bên ngoài, chẳng hạn như đĩa hoặc thiết bị phần cứng khác, để có sẵn. Trong khi nhiệm vụ trong một giai đoạn chờ đợi, luồng cho phép các tác vụ khác tiếp tục, do đó sử dụng thời gian của CPU hiệu quả hơn.

Thứ hai, nhiệm vụ có thể có thời hạn của một số loại để hoàn thành, đặc biệt nếu họ đang phản hồi sự kiện. Ví dụ cổ điển là giao diện người dùng của ứng dụng. Máy tính phải trả lời các sự kiện hành động của người dùng càng nhanh càng tốt, ngay cả khi nó đang bận thực hiện một số tác vụ chạy dài khác, nếu không người dùng sẽ bị kích động và có thể tin rằng ứng dụng đã gặp sự cố. Luồng cho phép điều này xảy ra.

Đối với trò chơi, tôi không phải là lập trình viên trò chơi, nhưng sự hiểu biết của tôi về tình hình là: trò chơi 3D tạo mô hình lập trình của thế giới trò chơi; người chơi, kẻ thù, vật phẩm, địa hình, vv Thế giới trò chơi này được cập nhật theo các bước rời rạc, dựa trên lượng thời gian đã trôi qua kể từ lần cập nhật trước. Vì vậy, nếu 1ms đã trôi qua kể từ lần cuối vòng lặp trò chơi, vị trí của đối tượng được cập nhật bằng cách sử dụng vận tốc của nó và thời gian trôi qua để xác định delta (rõ ràng là vật lý phức tạp hơn một chút, nhưng bạn có được ý kiến). Các yếu tố khác như AI và khóa đầu vào cũng có thể đóng góp vào bản cập nhật. Khi mọi thứ đã kết thúc, thế giới trò chơi được cập nhật được hiển thị dưới dạng khung mới và quá trình bắt đầu lại. Quá trình này thường xảy ra nhiều lần trong một giây.

Khi chúng ta nghĩ về vòng lặp trò chơi theo cách này, chúng ta có thể thấy rằng động cơ trên thực tế đạt được một mục tiêu rất giống với mục tiêu của luồng. Nó có một số nhiệm vụ chạy dài (cập nhật vật lý của thế giới, xử lý đầu vào của người dùng, vv), và nó cho thấy rằng chúng đang xảy ra đồng thời bằng cách chia nhỏ chúng thành những phần nhỏ và xen kẽ những phần này, nhưng thay vì dựa vào CPU hoặc hệ điều hành để quản lý thời gian dành cho mỗi CPU, chính nó đang thực hiện nó. Điều này có nghĩa là nó có thể giữ tất cả các tác vụ khác nhau được đồng bộ hóa một cách chính xác và tránh những phức tạp đi kèm với luồng thực: khóa, tiền giả, mã tái nhập, v.v. Không có ý nghĩa về hiệu suất cho phương pháp này, bởi vì như chúng ta đã nói máy lõi đơn chỉ có thể thực sự thực thi mã tuyến tính.

Mọi thứ thay đổi khi có hệ thống đa lõi. Giờ đây, các tác vụ có thể chạy đồng thời và thực sự có lợi ích khi sử dụng luồng để xử lý các phần khác nhau của bản cập nhật thế giới trò chơi, miễn là chúng tôi có thể quản lý đồng bộ hóa kết quả để hiển thị các khung nhất quán. Do đó, chúng tôi hy vọng rằng, với sự ra đời của các hệ thống đa lõi, các nhà phát triển công cụ trò chơi sẽ làm việc về điều này. Và hóa ra là vậy. Valve, các nhà sản xuất của Half Life, gần đây đã giới thiệu hỗ trợ đa bộ xử lý vào Công cụ Nguồn của họ, và tôi tưởng tượng nhiều nhà phát triển động cơ khác đang theo dõi.

Vâng, điều đó hóa ra lâu hơn một chút so với dự kiến ​​của tôi. Tôi không phải là chuyên gia về luồng hoặc trò chơi, nhưng tôi hy vọng tôi đã không tạo ra bất kỳ lỗi nào đặc biệt rõ ràng.Nếu tôi chắc chắn mọi người sẽ sửa tôi :)

+2

Trên thực tế, ngay cả trên một chủ đề máy lõi đơn có thể có được hiệu suất. Một số máy chuyển đổi sẽ hoán đổi thread đang chạy do các bộ nhớ. Nếu tôi nhớ chính xác, HyperThreading của Intel thực hiện điều tương tự. –

+0

+1 cho câu trả lời chi tiết –

+0

Tôi cũng sẽ chỉ định rằng khi sử dụng các chủ đề bạn không thực sự theo dõi lịch biểu của chúng một cách chính xác. thuật toán lập kế hoạch được thiết kế bởi hệ điều hành, không phải là trò chơi developper. Vì vậy, nếu bạn phải xử lý các tác vụ theo một thứ tự khắt khe thì ít nhất nó cũng dễ dàng hơn trong một chuỗi đơn. –

1

Chủ đề đã chết, em bé.

Thực tế, trong quá trình phát triển trò chơi, chuỗi không vượt quá phạm vi tải các nhiệm vụ rất chuyên dụng như kết nối mạng và tải. Hệ thống công việc dường như là con đường duy nhất phía trước, cho 8 hệ thống CPU đang trở nên phổ biến hơn ngay cả trên PC. Và bạn hoàn toàn có thể đảm bảo rằng các hệ thống siêu đa lõi sắp tới như Intel Larrabee sẽ là hệ thống dựa trên công việc.

Điều này đã được thực hiện một chút đau đớn trên các dự án Playstation3 và XBOX360, và có vẻ như ngay cả Apple đã nhảy trên tàu với hệ thống "cách mạng" Grand Central Dispatch trong Snow Leopard.

Chủ đề có vị trí của họ, nhưng lời hứa ngây thơ về "đặt tất cả mọi thứ trong một chuỗi và tất cả sẽ chạy nhanh hơn" chỉ đơn giản là không hoạt động trong thực tế.

+0

... Chủ đề là một phần không thể thiếu trong những gì bạn đang nói đến. Nó chỉ dưới một lớp trừu tượng bổ sung. – colithium

Các vấn đề liên quan