/ / Как е възможно да се използва двойно ядро ​​в игра на игра на opengl? - android, opengl-es, ядро-графика, game-loop

Как е възможно да се използва двойно ядро ​​в отворена игра? - Android, opengl-es, core-graphics, game-loop

Въпросът ми е за дизайн на линия за игра в opengl.

Вярвам, че игралната верига може да бъде разбита в 3 основни стъпки

  1. приемете входа - той може да дойде от потребителите, кликвайки върху екрана или системната сигнализация, или нещо друго.
  2. направете логика
  3. актуализация

За да го направим просто нека се съсредоточим само върху стъпки 2 и 3.

Мисля, че ще бъде погрешно да ги управлявате паралелно или да ги смесвате с една стъпка. Давам ви пример.

Латите казват, че създавате война и виетрябва да изготви 100 войници борбата на екрана, логиката ще бъде да се актуализира позицията си, да се актуализира фона област, а след това трябва да се направи резултат. Не можете да започнете да рисувате един войник, преди да актуализирате позицията на друг войник.

Така, съгласно тези прости стъпки, е ясно, че стъпки 2 и 3 трябва да бъдат синхронизирани по някакъв начин, а стъпка 2 трябва да се направи преди стъпка 3.

Сега ми кажи как е възможно да се изпълнява игра цикъл на повече от една нишка, и повече от един процес? Дали opnegl използва multiCore? Как?

Редактиране: Един от начините за използване на многопоточността е да се прекалира логиката на играта, или с други думи, като се използват вектори. Но има два големи недостатъка във векторите, които ги правят почти непредназначени за употреба.

  1. Понякога можеш да промениш своя вектор, така че имаше много изчисления, които направи и ти няма да ги използваш
  2. в повечето случаи се опитвате да достигнете до 60+FPS вещица означава 16 милисекунди за игра-цикъл, превключване теми изисква някакъв вид синхронизация, всяка синхронизация е лошо за изпълнение, от това, което видях, дори и просто Handler.post () в андроид (просто добавяне на задача, за да го стартирате на друга нишка) може да отнеме до 3 милисекунди (18% от времето на кадъра), така че ако изчислението не отнеме повече време, не го прави! Засега не намерих нищо, което да отнема толкова много време.

Отговори:

3 за отговор № 1

Сега ми кажете как е възможно да стартирате игралната линия на повече от една нишка

Идеята за многоядрен компютър еразделяне на изчислителни интензивни задачи на независими работни набори, които могат да се обработват паралелно. Игрите имат изненадващо малко място за паралелизация, както сами открихте.

Обичайният начин за използване на множество ядра в игрите еда парализирате I / O с логически операции. Т.е. прави всички мрежови и потребителски взаимодействия в една нишка, AI и управление на сцени в друга. Обикновено звукът се разделя паралелно.

Използва ли OpenGL multiCore? Как?

Спецификацията на OpenGL не уточнява това. Но някои изпълнения могат да изберат да използват множество ядра. Защо? Защото създава ненужни разходи за управление на кеша.


2 за отговор № 2

Ще се опитам да обясня графично, защо 2 нишки, един за рендиране и един за логиката са много по-добри и няма да доведе до несъответствия:

Предложеният от вас единствен резбован дизайн ще се изпълнява по следния начин:

logic    |-----|     |-----|
graphics       |-----|     |-----| and so forth.

но тъй като имате много CPU, трябва да го използватетях. Това означава, че след първото завършване на логиката графиката може да направи това състояние на играта. междувременно може да се изчисли следващата логическа стъпка:

logic    |-----||-----||-----|
graphics       |-----||-----|    and so forth.

Както виждате, можете почти да удвоите производителността си по този начин: разбира се, има някои режийни разходи, но все пак това ще бъде по-бързо от единичната.

Също така, можете да приемете, че логиката на играта ще бъдеотнема по-малко време за изчисляване на тогава рендър нишката: Това прави резбите доста лесно, защото можете да изчакате в логическата нишка за обратно извикване от рендертъда, за да дадете нови инструкции на нишката и след това да изчислите следващата логическа стъпка.