Diagnostyka renderowania i telemetria operacji
HotPDF rozróżnia wpisy pamięci podręcznej wyrenderowanych stron po każdym stanie widocznym dla wywołującego, który może zmienić piksele strony, i wystawia ograniczoną diagnostykę, gdy treści strony nie da się wyrenderować w całości
Warianty pamięci podręcznej świadome stanu
THotPDF.RenderLoadedPageToBitmapCached buduje klucz wpisów pamięci na podstawie strony, DPI, efektywnej widoczności zawartości opcjonalnej, THotPDF.RenderColourIntent i THotPDF.RenderFallbackPolicy
Pamięć podręczna trwała używa tego samego digestu stanu, a tryby fallback produkujące diagnostykę pozostają wyłącznie w pamięci, więc trafienie z dysku nie może zgubić raportów o pominiętych obiektach
Zmiana grupy zawartości opcjonalnej wybiera inny wariant zamiast usuwać poprzednią bitmapę, więc przełączenie warstwy lub intentu koloru z powrotem może ponownie użyć wcześniejszej pracy
Intent koloru
PDF.RenderColourIntent := rciRelativeColorimetric;
Bitmap := PDF.RenderLoadedPageToBitmapCached(0, 144);
rciDocument honoruje każdy operator ri strumienia treści i pozostaje domyślny
Cztery jawne wartości nadpisują wybór intentu ze strumienia treści i są stosowane do kolejnych konwersji fill i stroke ICCBased
Polityka fallbacku
PDF.RenderFallbackPolicy := rfpReport;
PDF.RenderFallbackDiagnosticLimit := 256;
Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);
Diagnostics := PDF.GetLastRenderFallbackDiagnostics;
rfpIgnorezachowuje dawne pobłażliwe zachowanierfpReportrejestruje nieobsługiwane operatory, brakujące zasoby, nieprawidłowe obiekty, porażki dekodowania, limity rekurencji i nieobsługiwane typy obiektówrfpStrictpodnosi błąd przy pierwszym fallbacku poza sekcją kompatybilnościBXiEXTHotPDF.RenderFallbackDiagnosticLimitogranicza zachowaną diagnostykęTHotPDF.LastRenderFallbackDroppedCountraportuje diagnostykę pominiętą po skonfigurowanym ograniczonym limicie
THotPDF.GetLastRenderFallbackDiagnostics zwraca zachowany zbiór, a THotPDF.ClearLastRenderFallbackDiagnostics go czyści; wpisy w pamięci podręcznej w trybie raportowania zachowują swój zbiór diagnostyczny, więc trafienie w pamięci podręcznej zwraca te same informacje o kompletności renderowania co pierwotny render
Zunifikowana telemetria operacji
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 zwraca rekord THPDFOperationTelemetry z czasem zegarowym, czasem CPU bieżącego wątku, pamięcią, alokacją, I/O procesu, dekodowaniem filtrów, cache, liczbą obiektów oraz metrykami sukcesu i anulowania
Ładowanie dokumentu, renderowanie stron synchroniczne i z pamięci podręcznej, plasterki renderowania progresywnego, selektywna optymalizacja strumieni i równoległa optymalizacja obrazów publikują ten sam kształt rekordu
PeakMemoryBytes to przenośna estymata operacji dokumentowej, a nie working set procesu systemu operacyjnego, więc pozostaje stabilny między maszynami i obejmuje bajty załadowanego źródła, wpisy wyrenderowanych bitmap, wagę pamięci podręcznej zdekodowanych obrazów i szczytowy magazyn łańcucha filtrów
PeakProcessMemoryBytes to największy próbkowany working set procesu, a AllocationCount to największy próbkowany przyrost jednocześnie żywych bloków menedżera pamięci Delphi względem startu operacji, a nie suma alokacji z całego życia
CPUTimeMicroseconds mierzy wątek wywołujący, a ReadIOBytes, WriteIOBytes i OtherIOBytes to delty liczników całego procesu, więc mogą obejmować współbieżną pracę w tym samym procesie
DecodeInputBytes to wejście skompresowane, DecodeOutputBytes to końcowe wyjście łańcucha filtrów, a DecodedBytes to łączna praca po każdym etapie filtrów; DecodeExpansionPermille dzieli wyjście końcowe przez wejście, gdzie 1000 oznacza 1x
ScheduledMemoryBytes to estymata wstępu operacji, MemorySchedulerWaitMilliseconds zapisuje czas w kolejce, a MemorySchedulerDelayed rozróżnia wstęp przez kolejkę od szybkiej ścieżki bez alokacji
Szczyty pamięci i alokacji są próbkowane na granicach operacji, ukończeniach łańcucha filtrów, plasterkach progresywnych i punktach kontrolnych anulowania, więc to niskonakładowe sygnały operacyjne, a nie ślady profilera na poziomie instrukcji