Почему пустая программа OpenGL использует полное ядро? - PullRequest
0 голосов
/ 20 июня 2020

Я использую OpenGL библиотеку для C# под названием OpenTK. Я сделал новый GameWindow и запустил его на 60 кадров в секунду и 60 кадров в секунду. И ему нечего делать, и он использует полное ядро ​​процессора.

GameWindow window = new GameWindow();
window.Run(60, 60);

С этим кодом он использует постоянные 25% от 4 ядер. Processor using constant 25%

When I call SwapBuffers on every frame, the CPU usage stays around 25% as well.

GameWindow window = new GameWindow();
window.RenderFrame += (sender, e) =>
{
    window.SwapBuffers();
};
window.Run(60, 60);

ЦП остается около 25%

Я видел много игр OpenGL, но ни одна из них не использовала полное ядро, когда приложение простаивало. Насколько я понимаю, вся вычислительная мощность идет на лучшее и более точное время.

Что мне делать, чтобы использовать только необходимые ресурсы, а не больше?

1 Ответ

0 голосов
/ 27 июня 2020

Это похоже на причуду программирования OpenTK. Когда вы вызываете .Run (), он в основном запускает бесконечное количество l oop событий окна обработки плюс 60 раз в секунду, он вызывает ваш метод рендеринга кадра. Вы можете увидеть это l oop в их репозитории Github :

while (true)
{
    ProcessEvents();
    if (Exists && !IsExiting)
    {
        if (isSingleThreaded)
        {
            DispatchUpdateFrame(watchRender);
        }
        DispatchRenderFrame();
    }
    else
    {
        return;
    }
}

в DispatchRenderFrame (), он проверяет, прошло ли достаточно времени для вызова вашего метода рендеринга кадра.

Таким образом, вам необходимо включить VSyn c (window.VSync = OpenTK.VSyncMode.On) + SwapBuffers или реализовать свой собственный Thread.Sleep (), если вы не хотите, чтобы он занимал одно ядро.

По Кстати, у меня лично были странные проблемы с VSyn c, некорректно применяемым в 32-битных приложениях с картой geforce. Если это произойдет с вами, единственное, что я понял, - это переключиться на 64-битное приложение и / или создать профиль nvidia вручную или программно, используя SOP.CS

...