Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 13:03

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 100% CPU-Auslastun - wieso?
BeitragVerfasst: So Okt 28, 2007 16:04 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hallo,

ich habe mir ein kleines Grundgerüst geschrieben für Apps, wo ich mal schnell OpenGL drin haben möchte. Allerdings habe ich das Prob, dass das Proggi dann immer auf maximaler CPU-Auslastung läuft. Weiß einer von euch warum?

Code:
  1. unit SBComponents;
  2.  
  3. interface
  4.  
  5. uses
  6.   Messages, Windows, Controls, Classes, Math, dglOpenGL;
  7.  
  8. type
  9.   TSBBwInfControl = class(TWinControl)
  10.     private
  11.       //OpenGL-Vars
  12.       FDC    : HDC;
  13.       FRC    : HGLRC;
  14.       FGLInit: Boolean;
  15.       procedure CreateGL;
  16.       procedure DestroyGL;
  17.       //Messages
  18.       procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  19.       procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
  20.     protected
  21.       procedure SetParent(AParent: TWinControl); override;
  22.       procedure SetOpenGLSetting; virtual;
  23.       procedure Resize; override;
  24.  
  25.       procedure CreateWnd; override;
  26.       procedure DestroyWnd; override;
  27.  
  28.       procedure PaintControl; virtual; abstract;
  29.       procedure ResizeControl; virtual; abstract;
  30.     public
  31.       constructor Create(AOwner: TComponent); override;
  32.       destructor Destroy; override;
  33.   end;
  34.  
  35. implementation
  36.  
  37. {******************************************************************************}
  38. {* --public--                                                                 *}
  39. {******************************************************************************}
  40.  
  41. constructor TSBBwInfControl.Create(AOwner: TComponent);
  42. begin
  43.   inherited Create(AOwner);
  44.   FGLInit:=false;
  45. end;
  46.  
  47. {------------------------------------------------------------------------------}
  48.  
  49. destructor TSBBwInfControl.Destroy;
  50. begin
  51.   DestroyGL;
  52.   inherited Destroy;
  53. end;
  54.  
  55. {******************************************************************************}
  56. {* --protected--                                                              *}
  57. {******************************************************************************}
  58.  
  59. procedure TSBBwInfControl.SetParent(AParent: TWinControl);
  60. begin
  61.   inherited SetParent(AParent);
  62. end;
  63.  
  64. {------------------------------------------------------------------------------}
  65.  
  66. procedure TSBBwInfControl.SetOpenGLSetting;
  67. begin
  68.   if FGLInit then
  69.   begin
  70.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  71.     glDepthFunc(GL_LEQUAL);
  72.     glEnable(GL_DEPTH_TEST);
  73.     glDepthMask(True);
  74.     glClearDepth(1);
  75.     glDisable(GL_BLEND);
  76.     glDisable(GL_ALPHA_TEST);
  77.     glEnable(GL_COLOR_MATERIAL);
  78.  
  79.     glClearColor(1, 1, 1, 0);
  80.   end;
  81. end;
  82.  
  83. {------------------------------------------------------------------------------}
  84.  
  85. procedure TSBBwInfControl.Resize;
  86. begin
  87.   inherited Resize;
  88.   if FGLInit then
  89.   begin
  90.     ResizeControl;
  91.  
  92.     glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  93.     PaintControl;
  94.     SwapBuffers(FDC);
  95.   end;
  96. end;
  97.  
  98. {------------------------------------------------------------------------------}
  99.  
  100. procedure TSBBwInfControl.CreateWnd;
  101. begin
  102.   inherited CreateWnd;
  103.   if (not (csDestroying in ComponentState)) and (not FGLInit) then CreateGL;
  104. end;
  105.  
  106. {------------------------------------------------------------------------------}
  107.  
  108. procedure TSBBwInfControl.DestroyWnd;
  109. begin
  110.   DestroyGL;
  111.   inherited DestroyWnd;
  112. end;
  113.  
  114. {------------------------------------------------------------------------------}
  115.  
  116. procedure TSBBwInfControl.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
  117. begin
  118.   Msg.Result:=1;
  119. end;
  120.  
  121. {******************************************************************************}
  122. {* --private--                                                                *}
  123. {******************************************************************************}
  124.  
  125. procedure TSBBwInfControl.CreateGL;
  126. begin
  127.   FDC:=GetDC(Handle);
  128.  
  129.   InitOpenGL;
  130.   FRC:=CreateRenderingContext(FDC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  131.   ReadExtensions;
  132.   ReadImplementationProperties;
  133.  
  134.   wglMakeCurrent(FDC, FRC);
  135.  
  136.   FGLInit:=true;
  137.   SetOpenGLSetting;
  138.   Resize;
  139. end;
  140.  
  141. {------------------------------------------------------------------------------}
  142.  
  143. procedure TSBBwInfControl.DestroyGL;
  144. begin
  145.   if FGLInit then
  146.   begin
  147.     wglMakeCurrent(FDC, 0);
  148.     if FRC<>0 then wglDeleteContext(FRC);
  149.     ReleaseDC(Handle, FDC);
  150.     FDC:=0;
  151.   end;
  152. end;
  153.  
  154. {------------------------------------------------------------------------------}
  155.  
  156. procedure TSBBwInfControl.WMPaint(var Msg: TWMPaint);
  157. begin
  158.   if FGLInit then
  159.   begin
  160.     glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  161.     PaintControl;
  162.     SwapBuffers(FDC);
  163.   end;
  164. end;
  165.  
  166. end.


Grüße
SunBlack

//EDIT: Falls es bei der fehlersuche hilft: er zeichnet es dauernd, aber wenn ich WMPaint ausklammere, ändert das auch nichts an der CPU-Auslastung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 17:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie benutzt du die Komponente denn? Evtl solltest du mal schauen ob
- ob die Anwendung ansonsten noch reagiert
- was der Debugger zum WMPaint sagt (Callstack). Bzw solltest du generell mal schauen ob du was im debugger finden kannst.

Denn so direkt kann ich nichts offensichtliches finden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 18:10 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Das ist ja das problem, ich erkenne auch keinen Grund, denn ich mache ansonsten mit dem eigentlich nichts *schulterzuck*:

Code:
  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ExtCtrls, Math,
  8.  
  9.   SBComponents, dglOpenGL, StdCtrls, ComCtrls;
  10.  
  11. type
  12.   TGLDrawArea = class(TSBBwInfControl)
  13.   protected
  14.     procedure PaintControl; override;
  15.     procedure ResizeControl; override;
  16.   public
  17.  
  18.   end;
  19.  
  20.   TMainForm = class(TForm)
  21.     OptionsPanel: TPanel;
  22.     ZoomLabel: TLabel;
  23.     ZoomTrackBar: TTrackBar;
  24.     procedure FormCreate(Sender: TObject);
  25.     procedure FormDestroy(Sender: TObject);
  26.     procedure ZoomTrackBarChange(Sender: TObject);
  27.   private
  28.     { Private-Deklarationen }
  29.   public
  30.     { Public-Deklarationen }
  31.   end;
  32.  
  33. var
  34.   MainForm: TMainForm;
  35.  
  36.   //OpenGL-Variablen
  37.   GLDrawArea: TGLDrawArea;
  38.  
  39. const
  40.   //Kreisgeneauigkeit von OpenGL
  41.   CircleRes = 36;
  42.   //Radius des Sterns
  43.   rs = 0.05;
  44.  
  45. implementation
  46.  
  47. {$R *.dfm}
  48.  
  49. { TGLDrawArea }
  50.  
  51. {##############################################################################}
  52. {                                     OpenGL-Zeug                              }
  53. {##############################################################################}
  54.  
  55. procedure TGLDrawArea.PaintControl;
  56. var
  57.   i: integer;
  58. begin
  59.   glColor3ub(255, 0, 0);
  60.   glBegin(GL_TRIANGLE_FAN);
  61.     for i:=0 to CircleRes do
  62.       glVertex3f(Sin(2*Pi/CircleRes*i)*rs, Cos(2*Pi/CircleRes*i)*rs, 0);
  63.   glEnd;
  64.   MainForm.OptionsPanel.Repaint;
  65. end;
  66.  
  67. procedure TGLDrawArea.ResizeControl;
  68. var
  69.   CS: array[0..1] of Integer;
  70.   MaxWidth : Integer;
  71.   MaxHeight: Integer;
  72. begin
  73.   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, @CS);
  74.   MaxWidth := Max(Min(CS[0], Width ), 1);
  75.   MaxHeight:= Max(Min(CS[1], Height), 1);
  76.  
  77.   glViewport(0, 0, MaxWidth, MaxHeight);
  78.  
  79.   glMatrixMode(GL_PROJECTION);
  80.   glLoadIdentity();
  81.  
  82.   if MaxWidth>MaxHeight then
  83.     glOrtho(-MaxWidth/MaxHeight, MaxWidth/MaxHeight, -1, 1, 0, 100)
  84.   else
  85.     glOrtho(-1, 1, -MaxHeight/MaxWidth, MaxHeight/MaxWidth, 0, 100);
  86.  
  87.   glMatrixMode(GL_MODELVIEW);
  88.   glLoadIdentity();
  89. end;
  90.  
  91. {##############################################################################}
  92. {                                       MainForm                               }
  93. {##############################################################################}
  94.  
  95. procedure TMainForm.FormCreate(Sender: TObject);
  96. begin
  97.   GLDrawArea:=TGLDrawArea.Create(Self);
  98.   with GLDrawArea do
  99.   begin
  100.     Parent:=MainForm;
  101.     Align:=alClient;
  102.   end;
  103. end;
  104.  
  105. procedure TMainForm.FormDestroy(Sender: TObject);
  106. begin
  107.   GLDrawArea.Free;
  108. end;
  109.  
  110. //Zoom übernehmen
  111. procedure TMainForm.ZoomTrackBarChange(Sender: TObject);
  112. begin
  113.   glTranslatef(0, 0, ZoomTrackBar.Position); //funzt irgendwie nicht
  114. end;
  115.  
  116. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 19:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mach mal innerhalb des WMPaint als erstes noch ein inherited damit die Message auch sinnvoll abgearbeitet werden kann. Denn aktuell scheint es, als ob diese Message nicht aus der Messagequeue entfernt wird und dadurch wird es dauerhaft aufgerufen.

Wobei ich persönlich empfehlen würde, statt dessen lieber die Methode Paint zu überschreiben. Aber ich glaube die gibt es in dieser Klasse noch nicht. Sonderst erst später.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 19:36 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
thx, es funzt. Woran es liegt, versuche ich mal herauszufinden ;).

//EDIT: k, das WinControl hatte doch schon ne message darauf laufen...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]