Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.47 MB
Время: 0.084 c
15-1142247265
Сатир
2006-03-13 13:54
2006.04.02
Обработка события дочернего компонента


2-1142829818
kami
2006-03-20 07:43
2006.04.02
Ошибка TService в D5


3-1139178894
GL00m
2006-02-06 01:34
2006.04.02
Подключить бы БД Access в рантайме в User DSN...


2-1142619841
CAHEK
2006-03-17 21:24
2006.04.02
Как можно визуально изобразить динамический список?


15-1141752066
Layner
2006-03-07 20:21
2006.04.02
Можно ли в метро/по городу спокойно ходить с ноутбучной сумкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский