Đa nền tảng đa luồng: Những thách thức thực sự là gì?


21

Mặc dù một thư viện như SDL cung cấp API trình bao bọc đa nền tảng để phân luồng, tôi nghĩ sẽ thật ngây thơ khi cho rằng điều này dẫn trực tiếp đến việc phát triển trò chơi dễ dàng trên các nền tảng khác nhau (máy tính để bàn / thiết bị di động).

Cách tốt nhất để giải quyết việc phát triển theo cách này (được cung cấp bất kỳ API luồng đa nền tảng nào) là xem xét như sau:

  • số lượng lõi khác nhau
  • khả năng xử lý khác nhau trên mỗi lõi
  • Một kiến ​​trúc hệ thống nói chung khác nhau với ví dụ. độ trễ khác nhau cho truy cập bộ nhớ cache, RAM và I / O

Tôi có cảm giác rằng cách duy nhất để làm điều này là đánh giá có bao nhiêu luồng có thể được chạy trên mỗi thiết bị bạn định hỗ trợ và tìm ra mẫu số chung thấp nhất là gì. Tuy nhiên, điều này vẫn khiến tôi chìm trong bóng tối vì tổng lượng thông lượng xử lý có sẵn. Tôi có đúng không khi cho rằng cách duy nhất để thực hiện điều này một cách hiệu quả là tích cực phát triển cho thiết bị di động thông số kỹ thuật thấp nhất mà tôi dự định hỗ trợ, trong suốt quá trình phát triển? - tức là mẫu số chung thấp nhất? Nên này đại khái là đủ? Hoặc có nhiều hơn nó?

EDIT: Xin vui lòng những người khác có thể cung cấp thêm kinh nghiệm về điều này vì tôi không cảm thấy câu hỏi của tôi đã được trả lời đầy đủ.


Vì câu trả lời của tôi không trả lời đầy đủ câu hỏi của bạn, bạn có thể nói chi tiết những gì còn thiếu / những gì bạn muốn biết không? Tôi có thể không phải là một nhà văn tuyệt vời nhưng tôi đã xử lý loại vấn đề này hơn một lần.
Valmond

Bạn thực sự chưa trả lời được câu hỏi, đó là về những khó khăn đa luồng và cách khắc phục chúng khi phát triển cho các nền tảng có khả năng phân luồng khác nhau . Xem đoạn của tôi dưới các gạch đầu dòng. Bạn nói về kích thước và độ phân giải màn hình - những điều đó không liên quan gì đến câu hỏi của tôi - đọc tiêu đề.
Kỹ sư

1
Tôi đoán sự khó khăn đến từ những gì bạn muốn sử dụng các chủ đề cho. Đó là một điều để có một luồng trợ giúp làm một việc gì đó ở bên cạnh, và hoàn toàn khác để cố gắng nén các bit hiệu suất cuối cùng từ máy 8 lõi .. Cách tôi nhìn thấy, các luồng SDL chủ yếu dành cho người đầu tiên, không phải cái sau
Jari Komppa

Câu trả lời:


11

Bạn nói về "những khó khăn đa luồng" nhưng thực sự bạn đang nói về những khó khăn gì? Theo cách bạn đang trích dẫn một vấn đề ảo thậm chí có thể không tồn tại. Thách thức thực sự là một thử thách mà bạn tự tạo ra - nếu bạn hoàn toàn quyết tâm lấy từng giọt năng lượng cuối cùng ra khỏi một phần cứng, điều đó liên quan đến việc sử dụng phần cứng để có hiệu quả tốt nhất, nhưng điều đó cũng mở rộng khoảng cách giữa cỗ máy mạnh nhất và ít mạnh nhất. Hàm ý của điều này là nếu bạn có một trò chơi thực sự tận dụng tối đa PS3 (chẳng hạn), bạn không thể thực sự chạy nó trên điện thoại di động giá rẻ, vì vậy vấn đề của bạn không còn là "làm thế nào tôi có thể nhận được 1 chương trình để làm việc trên các phần cứng rất khác nhau "nhưng trở thành" làm thế nào tôi có thể thực hiện 1 ý tưởng trò chơi theo nhiều cách khác nhau để nó hoạt động trên phần cứng được cung cấp năng lượng khác nhau ".

Mặc dù một thư viện như SDL cung cấp API trình bao bọc đa nền tảng để phân luồng, tôi nghĩ sẽ thật ngây thơ khi cho rằng điều này dẫn trực tiếp đến việc phát triển trò chơi dễ dàng trên các nền tảng khác nhau (máy tính để bàn / thiết bị di động).

Dễ dàng phát triển trò chơi - chắc chắn. Đa luồng tối ưu, không. Nhưng bạn không cần đa luồng để tạo trò chơi. Để làm cho những người hiệu suất cao, nó chắc chắn giúp. Nhưng nhiều trò chơi tuyệt vời chạy trong một chủ đề duy nhất.

Cách tốt nhất để giải quyết việc phát triển theo cách này (được cung cấp bất kỳ API luồng đa nền tảng nào) là xem xét như sau:

  • số lượng lõi khác nhau
  • khả năng xử lý khác nhau trên mỗi lõi
  • Một kiến ​​trúc hệ thống nói chung khác nhau với ví dụ. độ trễ khác nhau cho truy cập bộ nhớ cache, RAM và I / O

Thay vì cố gắng gán hệ thống cho các luồng, hãy gán các tác vụ cho các luồng. Cung cấp cho mỗi tác vụ dữ liệu cần thiết để chạy và sắp xếp các tác vụ cho bất kỳ phần cứng nào có sẵn. Thông thường, bạn sẽ có một số nhóm luồng để trừu tượng hóa các lõi hoặc bộ xử lý khác nhau và trình quản lý tác vụ có một chuỗi các tác vụ và đưa chúng lên các luồng khác nhau khi luồng báo hiệu rằng nó đã hoàn thành nhiệm vụ trước đó và được sẵn sàng cho một cái mới Phần cứng có nhiều lõi rõ ràng sẽ hoàn thành các tác vụ nhanh hơn và có thể kết xuất nhanh hơn. Chuyên môn hóa hệ thống này để hoạt động tối ưu trên các hệ thống có các đặc điểm khác nhau trở thành một vấn đề tối ưu hóa nâng cao, nhưng có thể dựa trên các phương pháp phỏng đoán nhất định (ví dụ: một nhiệm vụ không '

Tuy nhiên, việc phân tách các tính năng trò chơi thành các nhiệm vụ riêng biệt là một vấn đề khá phức tạp và thường không đáng để bỏ công sức trừ khi bạn rất chắc chắn rằng bạn cần hiệu suất, vì vậy hầu hết sẽ không thử.

Một số đọc thêm:

http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - xem phần 'dữ liệu song song'. Với mô hình này, dữ liệu được chia thành nhiều nhiệm vụ giống hệt nhau và được đưa vào các luồng riêng lẻ.

http://software.intel.com/en-us/articles/designing-the-framework-of-a-abul-game-engine/ - khá dày đặc, mô tả mọi thứ ở cấp độ HĐH thay vì cấp độ trò chơi.

http://drdobbs.com/high-performance-computing/216500409 - không cụ thể về trò chơi, nhưng hoàn toàn phù hợp về mặt cho bạn biết bạn cần phân chia nhiệm vụ như thế nào.

http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - nửa chừng cuộc phỏng vấn này là một giai thoại về cách họ di chuyển đến một hệ thống dựa trên nhiệm vụ .


Điểm rất tốt. Và đúng, tôi đã sử dụng từ "khó khăn" khi "thử thách" sẽ chính xác hơn. Bạn nói, "Phân tách các tính năng trò chơi thành các nhiệm vụ riêng biệt là một vấn đề khá phức tạp và thường không đáng để bỏ công sức trừ khi bạn rất chắc chắn rằng bạn cần hiệu suất, vì vậy hầu hết sẽ không thử." bạn có thể xây dựng trên này? Cung cấp nguồn nào? Hơi mơ hồ một chút nhưng tôi muốn nói rằng bạn đang đi vào trọng tâm của vấn đề ở đó.
Kỹ sư

Xin lỗi, tôi nghĩ cách tiếp cận này đã được biết đến. Tôi sẽ giải thích trong câu trả lời.
Kylotan

4

Khi tôi chơi trò chơi trên thiết bị di động, lần đầu tiên chúng tôi đã phát triển phiên bản 'vàng' (nghĩa là trò chơi đầy đủ chức năng) và sau đó chúng tôi chia thành 3 phiên bản chính (màn hình lớn, màn hình trung bình và màn hình nhỏ). Những phiên bản này đã được chuyển đổi thành 11 phiên bản: đồ họa đòi hỏi (đọc chiếm nhiều bộ nhớ / cpu) so với cấu hình thấp, v.v. (cũng có một số phiên bản nền tảng đặc biệt của một vài).

Vấn đề lớn nhất là (đó là công việc của tôi trong số những người khác) để cô lập các nền tảng cần thiết và xác định các phiên bản đó và cách tạo chúng (ví dụ: màn hình lớn nhưng cấu hình thấp phải là phiên bản hạ cấp của cấu hình / màn hình lớn hoặc nên là màn hình cỡ trung / lo hồ sơ làm màn hình lớn?).

Tất nhiên chúng tôi đã mã hóa điều này trong tâm trí vì vậy các trò chơi được gắn rất lỏng lẻo vào kích thước màn hình.

HTH

[sửa] Điều tôi muốn nói là bạn cần phân chia các nền tảng mục tiêu của mình theo các phẩm chất khác nhau (ví dụ: 1 lõi, 2 lõi, 1 lõi nhưng nhanh gấp đôi ...) Sau đó, quyết định số lượng mục tiêu ảo bạn muốn (ví dụ: " chỉ một "hoặc" Thấp, Trung bình, Hi ") Sau đó đặt tất cả các nền tảng theo 'chất lượng' tương ứng và với mỗi chất lượng, hãy lấy mẫu số thấp nhất và 'cổng' mã để nó tuân thủ các yêu cầu đó (nghĩa là hoạt động và nhanh đủ).

Có vẻ như bạn phải làm điều này với khá nhiều phỏng đoán nhưng bạn đã có thể tìm thấy chất lượng tồi tệ nhất với nền tảng tồi tệ nhất. Tôi sẽ chọn mọi chất lượng tiếp theo ít nhất là "tốt gấp đôi" so với trước đây, điều này có thể sẽ không tạo ra nhiều hơn 3-4 "phẩm chất". Nếu mã được chuyển từ phiên bản vàng, bất kỳ nền tảng nào hoạt động không đủ tốt chỉ có thể được nâng cấp về 'chất lượng' thấp hơn để tăng tốc. Bất kỳ nền tảng mới nào cũng có thể dễ dàng được đặt đúng chất lượng.


Ngoài đỉnh đầu, bạn sẽ nói dự án đó có bao nhiêu thời gian trên cả hai giai đoạn thiết kế và phát triển, để phù hợp với phiên bản đa nền tảng như thế này? Chỉ cần một mức trung bình thô sẽ giúp.
Kỹ sư

1
Vâng, như chúng tôi đã làm đa ngôn ngữ (tiếng Anh, tiếng Pháp, tiếng Tây Ban Nha, tiếng Bồ Đào Nha, tiếng Đức và tiếng Ý trong một gói + bất kỳ ngôn ngữ nào cần thiết trong ngày, tiếng Đài Loan, tiếng Thổ Nhĩ Kỳ, tiếng Nga ...) và chúng tôi đã có những nền tảng mới mà chúng tôi cần để "cổng" tất cả các trò chơi của chúng tôi cứ sau vài tháng (đọc một lớp điện thoại di động mới) chúng tôi thực sự sẽ mất rất nhiều thời gian nếu không đi theo cách này, thực sự sẽ không thể thực sự nếu không có một ngôi đền thực sự lớn. Thiết kế của "khung" đã được thực hiện khi tôi tìm hiểu về các điện thoại di động khác nhau và đã hoàn thiện sau khoảng 3-4 năm. Một đầu tư cũng có giá trị.
Valmond

1

Tôi có cảm giác rằng cách duy nhất để làm điều này là đánh giá có bao nhiêu luồng có thể được chạy trên mỗi thiết bị bạn định hỗ trợ và tìm ra mẫu số chung thấp nhất là gì.

Không nhất thiết - có thể có hy vọng cho một giải pháp năng động hơn, nhưng điều này phụ thuộc vào vấn đề thực tế mà bạn đang cố gắng giải quyết (nếu có). Bạn hơi mơ hồ trong câu hỏi của bạn, vì vậy câu trả lời của tôi cũng phải mơ hồ.

Nếu nhóm các nền tảng bạn định chạy có khả năng liệt kê phần cứng thông qua API, bạn có thể sử dụng giao diện đó để phát hiện số lượng luồng tối đa mà hệ thống có thể xử lý và sử dụng làm cơ sở cho số lượng luồng ứng dụng của bạn nên tạo. Thách thức duy nhất ở đây là tìm kiếm các API đó; bạn có đi đến cấp độ HĐH hay tìm kiếm thư viện của bên thứ ba hay SDK / API đa nền tảng tùy thuộc vào bạn hay không và tùy thuộc vào nền tảng bạn đang cố gắng hỗ trợ.

Cách tốt nhất để giải quyết việc phát triển theo cách này (được cung cấp bất kỳ API luồng đa nền tảng nào) là xem xét các vấn đề sau:

different numbers of cores
vastly different processing capabilities per core
A generally different systems architecture with eg. different

độ trễ cho truy cập bộ nhớ cache, RAM và I / O

Theo tôi, không ai trong số những điều đó nên là mối quan tâm của bạn. Mối quan tâm của bạn nên được xây dựng trò chơi của bạn. Nếu bạn gặp một nút cổ chai và quyết định rằng sẽ tốt hơn khi sinh ra một luồng riêng cho một tác vụ chuyên sâu của bộ xử lý, sau đó sinh ra luồng và để HĐH và phần mềm cấp thấp khác quyết định cách thao tác phần cứng để xử lý luồng.

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.