Войти

Показать полную графическую версию : OpenGl


Basilcat
03-08-2004, 13:31
Может кто подскажет решение проблемы по быстрому выводу графики под 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);        // äëÿ áîëåå óñòîé÷èâîé ðàáîòû
glEnable(GL_SCISSOR_TEST); // âêëþ÷àåì ðåæèì èñïîëüçîâàíèÿ âûðåçêè.
glScissor(0, 0, round(ClientWidth), ClientHeight); // îáëàñòü âûðåçêè

 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); // âêëþ÷àåì ðåæèì èñïîëüçîâàíèÿ âûðåçêè.

EndPaint (handleGL, ps);
{**************}
 Form_Aplication.Label42.caption := IntToStr(GetTickCount - t)+'ìñ; Ìàõ:'+IntToStr(max(T_New,GetTickCount - t))+'ìñ;  '+IntToStr(Round(1000/(GetTickCount - t)))+'ê/ñ; '+IntToStr(Round(1000/max(T_New,GetTickCount - t)))+'ê/ñ;  ';
 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;---

Прошу ответить на мыло_в@профиле

Исправлено: hasherfrog, 13:36 3-08-2004

hasherfrog
03-08-2004, 17:32
что это инерция экрана ЖК или карточкаИнерция - вряд ли. Карточка сама по себе тоже. Я бы всё-таки в первую очередь подумал о правильности настроек драйверов видеокарты, наличии DrectX и т.д.

hasherfrog
04-08-2004, 15:50
Часть диалога велась по mail-переписке.
Мы договорились, что драйвера нормальные. Значит, дело в программе.

Для меня всё усложняется тем. что Вы используете Delphi. На мой взгляд,
это тяжкое испытание. Я благополучно всё делал в чистом Win32,
ну MFC, в крайнем случае.

Хочу предложить Вам пролистать:
http://www.opengl.org/resources/faq/technical/mswindows.htm
http://www.opengl.org/resources/faq/technical/mslinks.htm

По дельфи + openGl информации в сети значительно меньше.

JCooper
07-08-2004, 12:40
Хехе 25 фпс на openGL :) Криво пишите видать, мой движок на директе 85 выдает как с куста. Хотя 2 мега видео маловато...ни одна ноормальная современная игра не пойдет на таком железе.




© OSzone.net 2001-2012