Rendering-Diagnostik und Operationstelemetrie

HotPDF unterscheidet Einträge im Cache gerenderter Seiten nach jedem aufrufersichtbaren Zustand, der Seitenpixel ändern kann, und macht begrenzte Diagnostik zugänglich, wenn Seiteninhalt nicht vollständig gerendert werden kann

Zustandsbewusste Cache-Varianten

THotPDF.RenderLoadedPageToBitmapCached schlüsselt Speichereinträge nach Seite, DPI, effektiver Sichtbarkeit optionaler Inhalte, THotPDF.RenderColourIntent und THotPDF.RenderFallbackPolicy auf

Der persistente Cache verwendet denselben Zustandsdigitalwert, während diagnostik-erzeugende Fallback-Modi speicherresident bleiben, sodass ein Disktreffer keine Berichte übersprungener Objekte verlieren kann

Das Ändern einer Gruppe optionaler Inhalte wählt eine andere Variante, statt die vorherige Bitmap zu löschen, sodass das Zurückschalten einer Ebene oder eines Farbintents frühere Arbeit wiederverwenden kann

Farbintent

PDF.RenderColourIntent := rciRelativeColorimetric;
Bitmap := PDF.RenderLoadedPageToBitmapCached(0, 144);

rciDocument ehrt jeden ri-Operator des Content-Streams und bleibt der Standard

Die vier expliziten Werte überschreiben die Intent-Auswahl des Content-Streams und werden auf anschließende ICCBased-Füll- und Stroke-Konvertierungen angewendet

Fallback-Richtlinie

PDF.RenderFallbackPolicy := rfpReport;
PDF.RenderFallbackDiagnosticLimit := 256;
Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);
Diagnostics := PDF.GetLastRenderFallbackDiagnostics;

THotPDF.GetLastRenderFallbackDiagnostics liefert die aufbewahrte Menge zurück, während THotPDF.ClearLastRenderFallbackDiagnostics sie löscht; Einträge im Berichtsmodus behalten ihren Diagnosesatz, sodass ein Speicher-Cache-Treffer dieselben Informationen zur Vollständigkeit der Darstellung wie das ursprüngliche Rendern zurückgibt

Einheitliche Operationstelemetrie

if PDF.GetLastOperationTelemetry(Info) then
begin
  WriteLn(Info.OperationName);
  WriteLn(Info.ElapsedMilliseconds);
  WriteLn(Info.CPUTimeMicroseconds);
  WriteLn(Info.PeakProcessMemoryBytes);
  WriteLn(Info.MemorySchedulerWaitMilliseconds);
  WriteLn(Info.DecodeExpansionPermille);
end;

THotPDF.GetLastOperationTelemetry liefert einen THPDFOperationTelemetry-Datensatz mit Metriken für Wandzeit, CPU-Zeit des aktuellen Threads, Speicher, Allokation, Prozess-E/A, Filter-Dekodierung, Cache, Objektzahl, Erfolg und Abbruch

Dokumentladen, synchrones und gecachtes Seitenrendering, progressive Render-Slices, selektive Stream-Optimierung und parallele Bildoptimierung veröffentlichen dieselbe Datensatzform

PeakMemoryBytes ist eine portable Schätzung der Dokumentoperation und nicht der Arbeitssatz des Betriebssystemprozesses, sodass sie über Hosts hinweg stabil bleibt und geladene Quellbytes, gerenderte Bitmap-Einträge, das Gewicht des dekodierten Bild-Caches und den Spitzen-Filterketten-Speicher einschließt

PeakProcessMemoryBytes ist der größte abgetastete Prozess-Arbeitssatz, während AllocationCount der größte abgetastete Anstieg gleichzeitig lebender Delphi-Speichermanagerblöcke relativ zum Operationsstart ist und keine Allokationssumme über die Lebensdauer

CPUTimeMicroseconds misst den aufrufenden Thread, während ReadIOBytes, WriteIOBytes und OtherIOBytes prozessweite Zählerdeltas sind und daher parallele Arbeit im selben Prozess einschließen können

DecodeInputBytes ist die komprimierte Eingabe, DecodeOutputBytes die endgültige Ausgabe der Filterkette und DecodedBytes die aggregierte Arbeit über jede Filterstufe; DecodeExpansionPermille teilt die endgültige Ausgabe durch die Eingabe, wobei 1000 für 1x steht

ScheduledMemoryBytes ist die Operationszulassungsschätzung, MemorySchedulerWaitMilliseconds erfasst die Warteschlangenzeit und MemorySchedulerDelayed unterscheidet die eingereihte Zulassung von dem allokationsfreien schnellen Pfad

Speicher- und Allokationsspitzen werden an Operationsgrenzen, beim Abschluss der Filterkette, bei progressiven Slices und an Abbruchkontrollpunkten abgetastet, sodass sie Signale mit geringem Overhead und keine profiler-Traces auf Befehlsebene sind

Zugehörige APIs