Basilcat |
03-08-2004 13:31 204451 |
Может кто подскажет решение проблемы по быстрому выводу графики под OPENGL на машинах типа 500Мгц с видеокартой 2МБ. Конечно на 1000 Селероне всё летает класс, а вот на старых дёргается и зависает. Проверил время цикла вывода, 40 милисекунд (25 кадров/сек), но реально идёт перерисовка на экране страшно медленно, что это инерция экрана ЖК или карточка и что делать?
Кусок кода вывода:
Код:
procedure TDrawPicture.WMPaint(var Msg: TWMPaint);
var
k,i : integer;
cadr:TCadr;
t: integer;
begin
if (fprogr<>nil)
then
begin
{*********}
t := GetTickCount;
{*********}
wglMakeCurrent(dc, hrc);
BeginPaint (handleGL, ps); // &#228;&#235;&#255; &#225;&#238;&#235;&#229;&#229; &#243;&#241;&#242;&#238;&#233;&#247;&#232;&#226;&#238;&#233; &#240;&#224;&#225;&#238;&#242;&#251;
glEnable(GL_SCISSOR_TEST); // &#226;&#234;&#235;&#254;&#247;&#224;&#229;&#236; &#240;&#229;&#230;&#232;&#236; &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#238;&#226;&#224;&#237;&#232;&#255; &#226;&#251;&#240;&#229;&#231;&#234;&#232;.
glScissor(0, 0, round(ClientWidth), ClientHeight); // &#238;&#225;&#235;&#224;&#241;&#242;&#252; &#226;&#251;&#240;&#229;&#231;&#234;&#232;
glClearColor (0.7, 0.7, 0.7, 1);
glClear (GL_COLOR_BUFFER_BIT);
if (isPoint) then
begin
glPointSize(5);
glEnable(GL_POINT_SMOOTH);
end;
lineWidth:=3;
lineWidthOld:=1;
glLineWidth(1);
glPushMatrix;
glTranslated(fposGl.x,fposGl.y,0);
glScalef(scale*mx, scale*my,0);
if (fprogr.isDrawSheet or fprogr.isDrawSheetContur) then
DrawBorder(false);
if (fprogr.IsCompile)and(fprogr.cadrsOut.Count>0) then
begin
if (fprogr.isDrawBorderProgr) then
DrawBorderProgr;
end;
if (fprogr.isDrawSheet or fprogr.isDrawSheetContur) then
DrawBorder(true);
if (fprogr.IsCompile)and(fprogr.cadrsOut.Count>0) then
begin
colorNew:=1;
glPushMatrix;
glTranslated(FXYStart.x,FXYStart.y,0);
colorRGBPlazmaOn.r:=0.7;
colorRGBPlazmaOn.g:=0;
colorRGBPlazmaOn.b:=0;
colorRGBFast.r:=0;
colorRGBFast.g:=1;
colorRGBFast.b:=0;
colorRGBPlazmaOff.r:=0;
colorRGBPlazmaOff.g:=0;
colorRGBPlazmaOff.b:=0;
colorRGB:=colorRGBPlazmaOff;
if fprogr.isDrawContur then
DrawCadrs(false, fprogr.cadrsOut);
colorRGBPlazmaOn.r:=1;
colorRGBPlazmaOn.g:=0;
colorRGBPlazmaOn.b:=0;
colorRGBFast.r:=0.2;
colorRGBFast.g:=1;
colorRGBFast.b:=0.5;
colorRGBPlazmaOff.r:=0.1;
colorRGBPlazmaOff.g:=0.3;
colorRGBPlazmaOff.b:=1;
colorRGB:=colorRGBPlazmaOff;
if ((fprogr.isEkivdOld<>0)or(not fprogr.isDrawContur))and fprogr.isDrawEkvid then
begin
DrawCadrs(true,fprogr.cadrsOutEkvid);
if fprogr.isDrawStartCadr then
with tcadr(fprogr.cadrsOutEkvid[fprogr.cadrsOutEkvid.FigureIndex]) do
begin
glLineWidth(2);
glEnable(GL_LINE_SMOOTH);
glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex2f(X0,Y0);
glVertex2f(X0-0.075/scale,Y0);
glVertex2f(X0,Y0);
glVertex2f(X0+0.075/scale,Y0);
glVertex2f(X0,Y0);
glVertex2f(X0,Y0+0.075/scale);
glVertex2f(X0,Y0);
glVertex2f(X0,Y0-0.075/scale);
glEnd;
glDisable(GL_LINE_SMOOTH);
glLineWidth(1);
end;
end;
glBegin(GL_LINE_STRIP);
glVertex2f(fprogr.Xbeg,fprogr.YBeg);
glVertex2f(fprogr.XEnd,fprogr.YEnd);
glEnd;
glPopMatrix;
end;
glLineWidth(2);
glColor3f(0,0,1);
if (isRezak ) then
begin
glTranslated(FPosRezak.X,FPosRezak.y,0);
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(0.1/(fscaleGl),0);
glVertex2f(0,0);
glVertex2f(0,0.1/(fscaleGl));
glVertex2f(0,0);
glVertex2f(-0.1/(fscaleGl),0);
glVertex2f(0,0);
glVertex2f(0,-0.1/(fscaleGl));
glEnd;
end;
glLineWidth(1);
glPopMatrix;
glFlush;
swapBuffers(dc);
wglMakeCurrent(0, 0);
glDisable(GL_POINT_SMOOTH);
glDisable(GL_SCISSOR_TEST); // &#226;&#234;&#235;&#254;&#247;&#224;&#229;&#236; &#240;&#229;&#230;&#232;&#236; &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#238;&#226;&#224;&#237;&#232;&#255; &#226;&#251;&#240;&#229;&#231;&#234;&#232;.
EndPaint (handleGL, ps);
{**************}
Form_Aplication.Label42.caption := IntToStr(GetTickCount - t)+'&#236;&#241;; &#204;&#224;&#245;:'+IntToStr(max(T_New,GetTickCount - t))+'&#236;&#241;; '+IntToStr(Round(1000/(GetTickCount - t)))+'&#234;/&#241;; '+IntToStr(Round(1000/max(T_New,GetTickCount - t)))+'&#234;/&#241;; ';
Inc(j_T_New);
if j_T_New>50 then
begin
j_T_New:=0;
T_New:=0;
end;
T_New:=max(T_New,GetTickCount - t);
{**************}
end
end;//---TDrawPicture.Paint;---
Прошу ответить на мыло_в@профиле
[s]Исправлено: hasherfrog, 13:36 3-08-2004[/s]
|