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