Einzelnen Beitrag anzeigen

Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.492 Beiträge
 
Delphi 2010 Architect
 
#1

Hohe CPU Auslastung bei 64Bit Anwendungen

  Alt 27. Aug 2018, 17:01
Ich versuche es noch einmal ohne über den Compiler zu schimpfen.
Die Ausgangssituation ist diese das die gleiche Anwendung gleicher Quelltext unter 32Bit 0% und mit 64Bit 25% Cpu Auslastung produziert.
Bei 32Bit könnt ihr die Geschwindigkeit auf Maximum stellen und es bleibt bei fast 0% Auslastung wenn die Durchsichtigkeit ausgeschaltet ist.

Was ich versucht habe.
Zitat:
Dort habe ich jetzt schon versucht MMTimer (Hochauflösender Timer vom MMSystem inkl. QueryPerformanceFrequency Callback usw.
Ein Sleep(0) oder Sleep(1) bringt auch nichts.
Den Timer auf 25ms zu setzen bremst das gesamte zeichnen aus.
Mein Problem ist zu ergründen warum das so ist.
Die Anwendung zum testen das es so ist kann man sich hier anschauen.

Es tritt nur dann auf wenn diese Funktion aufgerufen wird.

Delphi-Quellcode:
      if (ObjItem.angle <> 0) then
       begin
         GdipSetInterpolationMode(graphics, ObjItem.quality);

         GdipRotateWorldTransform(graphics, ObjItem.angle + 180, MatrixOrderAppend); //<<<< hier
         GdipTranslateWorldTransform(graphics, xD + (wD div 2), yD + (hD div 2), MatrixOrderAppend); //<<<<< und hier

         GdipDrawImageRectRectI(graphics, img, wD div 2, hD div 2, -wD, -hD, xS, yS, wS, hS, 2, imgAttr,
           ImgAbort, nil);
       end else
       begin
         GdipSetInterpolationMode(graphics, ObjItem.quality);
         GdipDrawImageRectRectI(graphics, img, PosX, PosY, wD, hD, xS, yS, wS, hS, 2, imgAttr, ImgAbort, nil);
       end;
Das kann man leicht testen indem man einfach die "eigene Rotation und die 3D tiefe ausschaltet" beide Eigenschaften verwenden im etwas abgeänderte form die gleiche Funktion.

Meine Vermutung ist das dieses Problem von der GDIPlus 64Bit selbst verursacht wird oder aber wie zuvor schon öfters eine der Typen nicht korrekt für 64Bit definiert ist.

Vielleicht hat ja doch noch jemand eine Idee falls es an der Anwendung selbst liegt.
Bei der DLL werde ich es dann wohl selbst finden müssen obwohl ich nicht erkennen kann das es hier ein Type Problem geben könnte. (Etwas fehlt mir auch die Erfahrung )

Hier noch dir Funktionen
Delphi-Quellcode:
GdipTranslateWorldTransform: function(Graphics: LONG_PTR; dx: Single; dy: Single; order: GpMatrixOrder): GPSTATUS; stdcall;
GdipRotateWorldTransform: function(Graphics: LONG_PTR; angle: Single; order: GpMatrixOrder): GPSTATUS; stdcall;
Die übergebenen Typen sind alle identisch..
Habe es auch schon mit Pointer versucht bringt keine Verbesserung.

gruss

Geändert von EWeiss (27. Aug 2018 um 17:27 Uhr)
  Mit Zitat antworten Zitat