Компьютерный форум 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=29538)

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);        // äëÿ áîëåå óñòîé÷èâîé ðàáîòû
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;---

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

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

hasherfrog 03-08-2004 17:32 204452

Цитата:

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

hasherfrog 04-08-2004 15:50 204453

Часть диалога велась по mail-переписке.
Мы договорились, что драйвера нормальные. Значит, дело в программе.


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

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

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


JCooper 07-08-2004 12:40 204454

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


Время: 22:26.

Время: 22:26.
© OSzone.net 2001-