Форум: "WinAPI";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
ВнизПамять, WinAPI, OpenGL API Найти похожие ветки
← →
Старик (2006-01-14 10:49) [0]Хотелось бы выяснить причину возникновения такой ситуации:
Есть приложение, написанное на WinAPI - создание формы (CreateWindowEX), инициализация OGL системы, рендеринг отекстуренной сферы. Больше ничего это приложение не делает. Однако при запуске диспетчер задач показывает, что приложение съедает 20 МБ памяти. Согласитесь, это несколько многовато... Но стоит свернуть окно, а затем его развернуть, диспетчер станет стабильно показывать 2.2 МБ.
В связи с чем у меня возникли такие вопросы:
1. Когда врет диспетчер задач - при 20МБ или при 2.2МБ?
2. Почему диспетчер показывает разные результаты? Это дело в программе или он сам такой?
3. Есть ли какие-нибудь программы, которые могут достоверно выдавать информацию о приложениях (сколько памяти едят, на сколько процессор грузят и т.д.) ?
← →
XProger © (2006-01-14 14:07) [1]Старик, утечка памяти. Надо всегда убирать за собой... :)
← →
Старик (2006-01-16 10:06) [2]Насчет убирать за собой - эт я в курсе - все классы убиваю, когда они не нужны, все листы очищаю, выделенную память под типы освобождаю (FreeMem) ну и т.д. Но дело в том, что в это проге нечего чистить! Никаких классов для текстур и сфер нет - все делается только процедурами API, а память выделяется только под сферу (gluQuadric, 16X16) и текстуру. Текстура весит меньше 70 кб.
Кстати, в WinXP диспетчер показывает уже не 20МБ а 11МБ.
Я весь в вопросах...
Попробую, конечно, еще поискать... Но если не получится, тогда,
может, код выложить - хоть носом в ошибку ткнете, XProger, ОК?
← →
Starik (2006-01-16 11:06) [3]Я отследил весь процесс создания окна и инициализации OpenGL и, вроде бы, нашел место, где резко увеличивается потребление памяти.
Оно происходит в момент вызова функции wglMakeCurrent(HDC, HRC);
А вообще порядок такой:
RenderMainAction := @CheckMessages;
h_Inst := GetModuleHandle(nil);
ZeroMemory(@RenderPort, SizeOf(RenderPort));
with RenderPort do begin
Style := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
lpfnWndProc := RenderMainAction;
hInstance := h_Inst;
hCursor := LoadCursor(0, IDC_ARROW);
lpszClassName := ApplicationName;
end;
if (RegisterClass(RenderPort)=0) then begin
MessageBox(DC, "Failed to register render port.", "Fatal error", MB_OK or MB_ICONERROR);
CheckSystem.AddEvent("Render port", saRegisterWindow, ssFailed, CurrentDataTime.AsString);
exit;
end;
CheckSystem.AddEvent("Render port", saRegisterWindow, ssSuccess, CurrentDataTime.AsString);
if FullScreen then begin
ChangeDisplayMode(pWidth, pHeight, pBPP);
end;
if FullScreen then begin
dwstyle := WS_POPUP or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
dwexstyle := WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;
ShowCursor(false);
end else begin
dwstyle := WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
dwexstyle := WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;
ShowCursor(true);
end;
CheckSystem.AddEvent("Render port", saChangeDisplayMode, ssSuccess, CurrentDataTime.AsString);
h_Wnd := CreateWindowEx(dwexstyle, ApplicationName, ApplicationName, dwstyle, 0, 0, Width, Height, 0, 0, h_Inst, nil);
if h_Wnd = 0 then begin
MessageBox(h_Wnd, "Failed to get a render port context.", "Fatal error", MB_OK or MB_ICONERROR);
DestroyRenderPort(FullScreen);
CheckSystem.AddEvent("Render port", saCreateWindow, ssFailed, CurrentDataTime.AsString);
exit;
end;
CheckSystem.AddEvent("Render port", saCreateWindow, ssSuccess, CurrentDataTime.AsString);
DC := GetDC(h_Wnd);
if DC = 0 then begin
MessageBox(DC, "Failed to get device context.", "Fatal error", MB_OK or MB_ICONERROR);
DestroyRenderPort(FullScreen);
CheckSystem.AddEvent("Render port", saGetDeviceContext, ssFailed, CurrentDataTime.AsString);
exit;
end;
CheckSystem.AddEvent("Render port", saGetDeviceContext, ssSuccess, CurrentDataTime.AsString);
PreparePort(FullScreen, ColorDepth);
HRC := wglCreateContext(DC);
if (HRC = 0) then
begin
MessageBox(0, "Failed to create an OpenGL rendering context.", "Fatal error", MB_OK or MB_ICONERROR);
DestroyRenderPort(Fullscreen);
CheckSystem.AddEvent("Render port", saCreateRenderContext, ssFailed, CurrentDataTime.AsString);
Exit;
end;
CheckSystem.AddEvent("Render port", saCreateRenderContext, ssSuccess, CurrentDataTime.AsString);
if (not wglMakeCurrent(DC, HRC)) then ////Здесь происходит резкое увеличение потребления памяти////
begin
MessageBox(0, "Failed to activate OpenGL rendering context.", "Fatal error", MB_OK or MB_ICONERROR);
DestroyFBRenderPort(Fullscreen);
CheckSystem.AddEvent("Render port", saSetCurrentRenderContext, ssFailed, CurrentDataTime.AsString);
Exit;
end;
CheckSystem.AddEvent("Render port", saSetCurrentRenderContext, ssSuccess, CurrentDataTime.AsString);
ShowWindow(h_Wnd, SW_SHOW);
SetForegroundWindow(h_Wnd);
SetFocus(h_Wnd);
GraphicInit();
ResizePort(Width, Height);
← →
Старик (2006-01-16 11:10) [4]XProger, может, теперь подскажете, где в моем коде фатал еррор?
← →
Игорь Шевченко © (2006-01-16 11:34) [5]
> Согласитесь, это несколько многовато... Но стоит свернуть
> окно, а затем его развернуть, диспетчер станет стабильно
> показывать 2.2 МБ.
Так и должно быть.
Утечки памяти определяются по другой графе Task Manager"а, а именно вирутальная память.
← →
Старик (2006-01-16 11:53) [6]По аналогии - затраты виртуальной памяти возрастают до 20МБ при вызове wglMakeCurrent, но при любых манипуляциях с окном этот показатель остается неизменным. Это тоже нормально?
← →
Игорь Шевченко © (2006-01-16 11:59) [7]
> Это тоже нормально?
Нормально. А что, собственно, беспокоит ? В память, занимаемую программой входят кроме ее собственных запросов к памяти, запросы стандартных библиотек.
← →
Старик (2006-01-16 12:46) [8]Беспокоит соотношение ПолезнаяРабота/ЗатратыРесурсов. Мне показалось, что 20МБ слишком много для такой проги.
Однако я так понял, что эти 20МБ поедаются самой системой OpenGL, и в дальнейшем ей используются. Просто не думал, что это может быть так много.
Спасибо за помощь :) Сняли камень с души :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c