Говорячи в контексті гри, заснованої на рендері openGL:
Припустимо, є дві нитки:
Оновлення логіки гри і фізики тощо для ігрових об'єктів
Робить openGL виклики для малювання кожного ігрового об’єкта на основі даних в ігрових об'єктах (цей потік 1 постійно оновлюється)
Якщо у вас є дві копії кожного ігрового об'єкта в поточному стані гри, вам доведеться призупинити Thread 1, в той час як Thread 2 робить виклики нічиї, інакше ігрові об’єкти оновлюються в середині розіграшу для цього об’єкта, який небажано!
Але зупинка потоку 1 для безпечного здійснення дзвінків з нитки 2 вбиває всю мету багатопотокової / одночасності
Чи є кращий підхід для цього, крім використання сотень чи тисяч чи синхронізації об'єктів / парканів, щоб багатоядерну архітектуру можна було використовувати для продуктивності?
Я знаю, що я все ще можу використовувати багатопотоковість для завантаження текстури та компіляції шейдерів для об'єктів, які ще є частиною поточного стану гри, але як це зробити для активних / видимих об'єктів, не викликаючи конфлікту з малюванням та оновленням?
Що робити, якщо я використовую окремий блокування синхронізації в кожному з ігрових об'єктів? Таким чином, будь-яка нитка блокується лише на одному об'єкті (ідеальний випадок), а не на весь цикл оновлення / малювання! Але наскільки затратним є зняття замків на кожному об’єкті (у грі може бути тисяча предметів)?