У меня есть программа на C ++, которая должна запускаться в Windows.
У меня есть игра, в которой основной l oop есть в функции WinMain
, которая вызывает функции Update
в каждой итерации , Я хочу применить многопоточность ко всем oop функциям обновления.
int __stdcall WinMain()
{
// Windows initializations
// Main loop
{
Game game = new Game();
bool bExit = false;
while (!bExit)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT) bExit = true;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
game->Update();
}
delete game;
game = nullptr;
}
// Windows destructions
return 0;
}
// Game.cpp
void Game::Update() {
// Loop that I want to be parallelized but I don't want to create the thread pool here because it's called on every frame
for (size_t i = 0; i < entities.size(); i++) {
entities[i]->Update();
}
}
Я пытался использовать OpenMP, но не мог поместить #pragma omp parallel
в функцию WinMain
(приложение будет cra sh) и если я помещу #pragma omp parallel for
внутри Game::Update
непосредственно перед l oop, это фактически снижает производительность, потому что создает поток l oop в каждом кадре.
I'm ищу основанное на библиотеке или, предпочтительно, собственное решение, которое позволяет мне легко распараллелить это l oop.
Единственное требование - это то, что оно работает в Windows, я бы предпочел не использовать библиотеку (например, буст, хотя OpenMP в порядке).
РЕДАКТИРОВАТЬ: Я получил его работать с PPL concurrency::parallel_for
. Это не ухудшает производительность, но и не увеличивает ее ... Мой вопрос относительно этого: создает ли эта функция и уничтожает ли ее пул потоков при каждом вызове?