Войти

Показать полную графическую версию : Делфи и OPENGL! Как быть? Размер проги растет!


Greshnick
14-11-2011, 13:27
Делаю окно о программе на основе OPENGL в котором вращается сфера с названием программы ввиде текстуры сделанной в фотошопе. Но странное дело когда я открываю программу и смотрю в диспетчер задач, то размер в опративке растет как будто на дрожжах. Как быть где я неправильно поступаю. Вот исходный код некоторых частей:

procedure TForm1.FormCreate(Sender: TObject);
begin
DC:=GetDC(Panel1.Handle);
PixelFormat(DC);
hrc:=wglCreateContext(DC);
wglMakeCurrent(DC,hrc);
end;

procedure TForm1.Draw;
var
ps : TPaintStruct;
Diffuse : ARRAY[0..3] of GLFloat;
pos : ARRAY[0..3] of GLFloat;
begin
Diffuse[0]:=0;
Diffuse[1]:=0;
Diffuse[2]:=1;
Diffuse[3]:=1;

POS[0]:=5;
POS[1]:=10;
POS[2]:=-10;
POS[3]:=1;

LoadTexture(ExtractFileDir(Application.ExeName)+'\Dll\Çîëîòî.jpg',MyTexture,False);

BeginPaint(Panel1.Handle,ps);

glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0,GL_POSITION,@POS);

glPUSHMatrix;
glOrtho(-10, 10, -10,10, -10, 10);
glRotate(90,1,0,0);
glRotate(Y,0,0,1);

glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, @DIFFUSE);

glEnable(GL_NORMALIZE);
GLEnable(GL_TEXTURE_2D);
QUADObj:=GLUnewQUADRIC();
gluQuadricTexture(QUADobj,GL_TRUE);
gluQUADRICdrawStyle(QUADobj,GLU_FILL);
//glColor3f(0,1,0);
gluSphere (quadObj, 9, 20, 20);
gluDeleteQuadric(QUADObj);

glDisable(GL_TEXTURE_2D);
glDisable(GL_NORMALIZE);
glPOPMatrix;

glDisable(GL_FOG);
glDisable(GL_DEPTH_TEST);
glFlush();
swapBuffers(DC);
EndPaint(Panel1.Handle,ps);
end;

procedure TForm1.PixelFormat(HDC : HDC);
Var
pfd : TPIXELFORMATDESCRIPTOR;
nPixelFormat : Integer;
begin
FillChar(pfd, SizeOf(pfd), 0);
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
wglDeleteContext(hrc);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Draw();
Y:=Y+2;
end;

Delirium
14-11-2011, 13:35
а может проще сделать ту же gif-ку и не париться? Или флеш анимацию?

Greshnick
14-11-2011, 13:52
Можно было бы и проще.Но все равно я хочу узнать почему растет размер программы и что я делаю не так.И как нужно сделать?Где нужно подправить код? Ведь программа то может расти и до гигабайта и выше...

Greshnick
14-11-2011, 14:10
Я нашел в чем была моя проблема. Вот строка LoadTexture(ExtractFileDir(Application.ExeName)+'\Dll\Золото.jpg',MyTexture,False); очень сильная нагрузка шла на процессор и оперативу из за того что я постоянно подгружал переменную новыми данными. Верней в Textures.pas не предусмотрели повторного загруза инфы в переменную поэтому размер рос да и строка без грамотно повторяется кучу раз.

Delirium
14-11-2011, 16:08
Greshnick, а тебе не кажется, что "о программе" не стОит того, чтобы программа росла "до гигабайта" ? странный способ изучать графику...

Greshnick
14-11-2011, 16:14
Программа росла из за ошибке в коде каждый раз как только наступал новый такт в таймере по новой загружалась картинка. От этого росла программа.Щас она вообще не вырастает только размер окна)))

opel431
15-11-2011, 19:21
Можно освобождать занимаемую память по таймеру - имеется ввиду, в обычном случае, т.е. не связанные с выше названной ошибкой.

//---------------------- Освобождаем занимаемую память -----------------------

procedure TFreeMemSet;
var
MainHandle: THandle;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
CloseHandle(MainHandle);
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
TFreeMemSet;
end;

Greshnick
16-11-2011, 10:56
opel431, Спасибо!Я так понимаю этот код можно применять даже когда закрываешь окно вызванное из DLL?

opel431
16-11-2011, 15:11
Я так понимаю этот код можно применять даже когда закрываешь окно вызванное из DLL? »
Именно так!

Greshnick
19-11-2011, 12:37
opel431, Это просто супер!Ваш код творить чудеса.Размер программы составляет на диске 883кб в оперативной памяти диспетчер при запуске показывает 305 или 443кб если вырастает, то моментом освобождается супер!Спасибо Вам Огромное!




© OSzone.net 2001-2012