Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Делфи и OPENGL! Как быть? Размер проги растет! (http://forum.oszone.net/showthread.php?t=220449)

Greshnick 14-11-2011 13:27 1794768

Делфи и OPENGL! Как быть? Размер проги растет!
 
Делаю окно о программе на основе 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 1794769

а может проще сделать ту же gif-ку и не париться? Или флеш анимацию?

Greshnick 14-11-2011 13:52 1794774

Можно было бы и проще.Но все равно я хочу узнать почему растет размер программы и что я делаю не так.И как нужно сделать?Где нужно подправить код? Ведь программа то может расти и до гигабайта и выше...

Greshnick 14-11-2011 14:10 1794786

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

Delirium 14-11-2011 16:08 1794883

Greshnick, а тебе не кажется, что "о программе" не стОит того, чтобы программа росла "до гигабайта" ? странный способ изучать графику...

Greshnick 14-11-2011 16:14 1794886

Программа росла из за ошибке в коде каждый раз как только наступал новый такт в таймере по новой загружалась картинка. От этого росла программа.Щас она вообще не вырастает только размер окна)))

opel431 15-11-2011 19:21 1795839

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

Код
Код:

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

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 1796169

opel431, Спасибо!Я так понимаю этот код можно применять даже когда закрываешь окно вызванное из DLL?

opel431 16-11-2011 15:11 1796368

Цитата:

Цитата Greshnick
Я так понимаю этот код можно применять даже когда закрываешь окно вызванное из DLL? »

Именно так!

Greshnick 19-11-2011 12:37 1798640

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


Время: 13:50.

Время: 13:50.
© OSzone.net 2001-