Использование графического процессора возрастает до 100% при закрытии программы после отрисовки большого количества кадрC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Использование графического процессора возрастает до 100% при закрытии программы после отрисовки большого количества кадр

Сообщение Anonymous »

Итак, я наткнулся на нечто весьма необычное (после работы над проектом и устранения утечек памяти, которые вызывали 100%-ные скачки загрузки ЦП после закрытия программы), что, по-видимому, вызывает невероятно короткий 100%-ный всплеск использования графического процессора. также, как только вы закроете программу.
Изображение

Вот минимальный код, который я запустил, чтобы получить это:

Код: Выделить всё

#undef UNICODE
#include 

#define GLEW_STATIC
#include "include/GL/glew.h"

#include 
#include 
#include 

//
// window
//

HWND window_hwnd = { };
WNDCLASS window_wndclass = { };

std::string wndclass_name = "class";
std::string window_name = "class";

LRESULT CALLBACK WindowProc(
_In_ HWND hWnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (
uMsg
)
{
default:
return DefWindowProc(
hWnd,
uMsg,
wParam,
lParam
);
}

return 0;
}

void window_create_class()
{
window_wndclass = { };
window_wndclass.lpfnWndProc = WindowProc;

window_wndclass.lpszClassName = wndclass_name.c_str();

window_wndclass.cbClsExtra = 0;
window_wndclass.cbWndExtra = 0;
window_wndclass.hInstance = 0;

RegisterClass(
&window_wndclass
);
}

void window_create()
{
window_create_class();

window_hwnd = CreateWindow(
wndclass_name.c_str(),
window_name.c_str(),

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,

CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,

0,
0,
0,
0
);
}

int window_loop()
{
MSG msg;
BOOL get_message;
while (
(
get_message = GetMessage(
&msg,
window_hwnd,
0,
0
) > 0
) != 0
)
{
if (
get_message == -1
)
{
// error handling

break;
}
else
{
TranslateMessage(
&msg
);
DispatchMessage(
&msg
);
}
}

return get_message;
}

//
// opengl
//

HDC gl_hdc = { };
HGLRC gl_hglrc = { };

PIXELFORMATDESCRIPTOR gl_pixel_format_descriptor = {
sizeof(
PIXELFORMATDESCRIPTOR
),
1,
// Flags
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
// The kind of framebuffer.  RGBA or palette.
PFD_TYPE_RGBA,
// Colordepth of the framebuffer.
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
// Number of bits for the depthbuffer
24,
// Number of bits for the stencilbuffer
8,
// Number of Aux buffers in the framebuffer.
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};

int gl_pixel_format = -1;

void gl_pixel_format_configure()
{
gl_pixel_format = ChoosePixelFormat(
gl_hdc,
&gl_pixel_format_descriptor
);
SetPixelFormat(
gl_hdc,
gl_pixel_format,
&gl_pixel_format_descriptor
);
}

void gl_create()
{
gl_pixel_format_configure();

gl_hglrc = wglCreateContext(
gl_hdc
);

wglMakeCurrent(
gl_hdc,
gl_hglrc
);

GLenum state = glewInit();
if (
state != GLEW_OK
)
{
throw;
}
}

void gl_draw()
{
RECT client_rect = { };
GetClientRect(
window_hwnd,
&client_rect
);

int window_width = client_rect.right - client_rect.left;
int window_height = client_rect.bottom - client_rect.top;

glViewport(
0,
0,
window_width,
window_height
);
glClearColor(
0.0f,
0.0f,
0.0f,
1.0f
);
glClear(
GL_COLOR_BUFFER_BIT
);

wglSwapLayerBuffers(
gl_hdc,
WGL_SWAP_MAIN_PLANE
);
}

int main()
{
window_create();

gl_hdc = GetDC(
window_hwnd
);

gl_create();

ShowWindow(
window_hwnd,
SW_SHOW
);

// simulate drawing frames

auto now = std::chrono::steady_clock::now();
auto interval = std::chrono::duration<
double,
std::chrono::seconds::period
>(
1.0 / 60.0
);
auto next = now + interval;

for (
int i = 0;
i < 400;
i++
)
{
gl_draw();

std::this_thread::sleep_until(
next
);
next += interval;
}

return window_loop();
}
в Windows с использованием библиотеки GLEW. Скомпилировано с помощью компилятора Visual Studio с оптимизацией выпуска. Я также тестировал это на своем ноутбуке, у которого совершенно другой графический процессор (на самом деле встроенная графика Intel) с тем же эффектом.
Этого не происходит, когда wglSwapLayerBuffers не вызывается. .
Обратите внимание, что он даже ничего не рисует, даже не создает никаких объектов OpenGL и нигде не использует указатели. Это заставляет меня задуматься, неправильно ли я использую контекст OpenGL Windows? Или это какая-то особенность GLEW? (Кстати, я предполагаю, что эффект от 400 отрисованных кадров (это не то количество, которое может вызвать это, я не удосужился попытаться точно его определить, но, например, с 300 такого не происходит) может отличаться от графического процессора к графическому процессору. Хотя установка значения примерно 1000+ определенно сработает, в этом отношении это даже не нереальная сумма).
Честно говоря, это не совсем так; (в конце концов, это происходит после возврата main), но это все равно странно, и я бы хотел этого избежать. Так почему же это происходит или, по крайней мере, как я могу это исправить?

РЕДАКТИРОВАНИЕ №1:
Я баловался OpenGL создание контекста еще немного, создание правильного контекста, как описано в официальной OpenGL Wiki, вместо простого, как в примере, который я привел, но безуспешно.
Любопытство также взяло верх из меня, что заставило меня просмотреть свою библиотеку Steam и просто запустить около дюжины игр, подождать несколько секунд в главном меню, позволяя им отрисовать несколько сотен, если не несколько тысяч кадров.
В большинстве игр наблюдался одинаковый 100%-ный скачок производительности графического процессора после выхода из игры. Примечательно, однако, что некоторые игры ААА-класса (а именно DOOM Eternal и GTA V) не продемонстрировали такого поведения.
Думаю, во-первых, это еще раз доказывает, что на самом деле это не так. есть о чем беспокоиться. Тем не менее, это также доказывает, что этого можно избежать, хотя, как именно этого добиться, я до сих пор не знаю.
Я думаю, что движки, на которых работают эти AAA-игры, имеют свои собственные оболочки OpenGL и, возможно, даже свои собственные интерфейсы OpenGL-OS нижнего уровня, избегая WGL, из-за которого, похоже, и возникает проблема.
Но это всего лишь предположение, я определенно не нашел конкретного ответа.

Подробнее здесь: https://stackoverflow.com/questions/669 ... rames-with
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»