Ви говорите про "багатопотокові труднощі", але про які труднощі ви насправді говорите? Таким чином, ви посилаєтесь на фантомну проблему, яка може навіть не існувати. Справжнє завдання - це те, що ви робите для себе - якщо ви абсолютно налаштовані отримувати кожну останню краплю енергії з обладнання, це вимагає використання обладнання для найкращого ефекту, але це також розширює розрив між найпотужнішою машиною і найменш потужний. Наслідком цього є те, що якщо у вас є гра, яка справді найбільше використовує PS3 (наприклад), ви все одно не можете її запустити на дешевому мобільному телефоні, тому ваша проблема вже не "як я можу отримати 1 програму працювати над різним обладнанням ", але стає" як я можу реалізувати одну ідею гри декількома різними способами, щоб вона працювала на апаратному забезпеченні з різним харчуванням ".
Хоча бібліотека на зразок SDL надає міжплатформову програму для обгортання ниток, я думаю, що було б наївно вважати, що це призводить безпосередньо до простого розвитку ігор на абсолютно різних платформах (настільних / мобільних).
Легкий розвиток ігор - точно. Оптимальна багатопотокова, ні. Але для створення ігор вам не потрібно багатопотокове читання. Щоб зробити якісні продуктивні, це безумовно допомагає. Але багато чудових ігор працює в одну нитку.
Який найкращий спосіб вирішити цей спосіб (враховуючи будь-який міжпластовий інтерфейс API), враховуючи наступне:
- різна кількість ядер
- дуже різні можливості обробки на ядро
- Взагалі інша архітектура систем з напр. різні затримки для кешу, оперативної пам’яті та доступу вводу / виводу
Замість того, щоб намагатися призначити системи потокам, призначте завдання потокам. Надайте кожному завданню необхідні йому дані для виконання та обробку завдань, залежно від необхідного обладнання. Зазвичай у вас буде якийсь пул потоків, щоб абстрагувати різні ядра чи процесори, і диспетчер завдань, який має чергу завдань і підводить їх до різних потоків, коли потік сигналізує про те, що завершено попереднє завдання і є готовий до нового. Обладнання з більшою кількістю ядер, очевидно, швидше виконає завдання та зможе швидше рендерувати. Спеціалізація цієї системи для оптимальної роботи на системах з різними характеристиками стає вдосконаленою проблемою оптимізації, але може ґрунтуватися на певній евристиці (наприклад, завдання, яке не відповідає "
Однак, розкладання ігрових особливостей на дискретні завдання є досить складною справою і часто не варто докладати зусиль, якщо ви не впевнені, що вам потрібна продуктивність, тому більшість навіть не намагатиметься цього зробити.
Деякі подальші читання:
http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - див. розділ "Паралель даних". З цією моделлю дані поділяються на кілька однакових завдань і обробляються окремими потоками.
http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/ - досить щільний, описує речі на рівні ОС, а не на рівні гри.
http://drdobbs.com/high-performance-computing/216500409 - не конкретна гра, але цілком доречна з точки зору того, як розповісти, як потрібно розділити завдання.
http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - на півдорозі інтерв'ю - це анекдот про те, як вони перейшли на систему, засновану на завданнях .