ÐадÑÑжÑе наÑиÑÐ½Ð°Ñ Ð±ÑÑона за маÑабиÑане в обикновен PDF визÑализаÑÐ¾Ñ Ð¸ наблÑдавайÑе гÑаÑикаÑа на пÑоÑеÑоÑа (CPU). ÐднокÑаÑноÑо наÑиÑкане на конÑÑола за авÑомаÑиÑно повÑаÑÑне на маÑаба задейÑÑва дÑзина или повеÑе ÑÑÑпки на маÑабиÑане в ÑекÑнда. Ðко вÑÑка ÑÑÑпка ÑÑаÑÑиÑа повÑоÑно ÑендиÑане Ñ Ð¿Ñлно каÑеÑÑво на видимаÑа ÑÑÑаниÑа, пÑоÑеÑиÑе на ÑендиÑане Ñе наÑÑÑÐ¿Ð²Ð°Ñ Ð¿Ð¾-бÑÑзо, оÑколкоÑо завÑÑÑваÑ. СÑÑаниÑаÑа Ñе ÑаÑÑеÑизиÑа добÑе Ñама по Ñебе Ñи, напÑÐ¸Ð¼ÐµÑ Ð·Ð° 180 ms за ÑканиÑан A4 лиÑÑ, но Ñега изпÑлнÑваÑе дÑзина ÑендиÑÐ°Ð½Ð¸Ñ Ð¾Ñ Ð¿Ð¾ 180 ms за задаÑи, коиÑо поÑÑебиÑелÑÑ Ð²ÐµÑе е подминал. ÐизÑализаÑоÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñа, едно ÑдÑо на пÑоÑеÑоÑа Ñе наÑоваÑва на 100% и докаÑо екÑанÑÑ Ð½Ð°Ð²Ð°ÐºÑа, поÑÑебиÑелÑÑ Ðµ ÑпÑÑл на ниво на маÑабиÑане оÑпÑеди ÑеÑиÑи ÑендиÑаниÑ. РеÑениеÑо не е по-бÑÑз ÑаÑÑеÑизаÑоÑ, а кеÑ, койÑо вÑÑÑа гоÑови ÑÑÑаниÑи незабавно, и ÑикÑл на ÑендиÑане, гоÑов да изоÑÑави ÑекÑÑаÑа ÑабоÑа в моменÑа, в койÑо ÑÑ Ð¾ÑÑаÑее.
PDFium Component ви пÑедоÑÑÐ°Ð²Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¸Ñе компоненÑи и за двеÑе и не Ñе намеÑва в полиÑикиÑе на изпÑлнение. ÐолÑÑаваÑе биÑмапи, ÑобÑÑвеноÑÑ Ð½Ð° извикваÑаÑа ÑÑÑана, пÑогÑеÑивен ÑендиÑÐ°Ñ Ð¼Ð¾Ð´Ñл, койÑо пÑиема Ñокен за анÑлиÑане, Ñежими за напаÑване, коиÑо пÑеизÑиÑлÑÐ²Ð°Ñ Ð¼Ð°Ñаба пÑи пÑомÑна на ÑазмеÑа, и извикване за ÑазделÑне на плоÑки (tiling) за ÑÑÑаниÑи, коиÑо Ñа ÑвÑÑде големи за ÑÑлоÑÑно ÑаÑÑеÑизиÑане. Това, коеÑо пÑодÑкÑÑÑ ÑмиÑлено не пÑедоÑÑавÑ, е ÑамиÑÑ ÐºÐµÑ, ÑÑй каÑо пÑавилнаÑа полиÑика за изÑиÑÑване (eviction policy) завиÑи Ð¾Ñ Ð²Ð°ÑÐ¸Ñ Ð¸Ð·Ð³Ð»ÐµÐ´ (viewport), лимиÑа на памеÑÑа на плаÑÑоÑмаÑа ви и наÑина, по койÑо поÑÑебиÑелиÑе пÑевÑÑÑаÑ. РеÑениеÑо за пÑавилнаÑа им наÑÑÑойка е ваÑе, а поÑледиÑиÑе Ð¾Ñ Ð³ÑеÑкаÑа Ñа замÑÑзване на инÑеÑÑейÑа и изÑиÑане на памеÑ.
ÐÑде оÑÐ¸Ð²Ð°Ñ Ð¼Ð¸Ð»Ð¸ÑекÑндиÑе и мегабайÑиÑе
ÐпÑеделеÑе ÑиÑÑово ÑÐ°Ð·Ñ Ð¾Ð´Ð¸Ñе, пÑеди да пÑоекÑиÑаÑе каквоÑо и да било. СÑÑаниÑа Ñ ÑÐ°Ð·Ð¼ÐµÑ A4 пÑи 96 DPI е пÑиблизиÑелно 794 на 1123 пикÑела, коеÑо е около 3.5 MB как 32-биÑов биÑмап. ÐаÑабиÑайÑе до 200% и ÑазмеÑÑÑ Ñе ÑÑеÑвоÑÑва. ÐÑи 400% на диÑплей Ñ Ð²Ð¸Ñока ÑазделиÑелна ÑпоÑобноÑÑ (high-DPI) заделÑÑе и запÑлваÑе един единÑÑвен биÑмап за ÑÑÑаниÑа Ð¾Ñ 50 до 60 MB, а визÑализаÑоÑÑÑ Ñ Ð½ÐµÐ¿ÑекÑÑнаÑо пÑевÑÑÑане поддÑÑжа нÑколко акÑивни ÑÑÑаниÑи едновÑеменно. Ð Ð°Ð·Ñ Ð¾Ð´Ð¸Ñе за ÑаÑÑеÑизаÑÐ¸Ñ ÑÐ»ÐµÐ´Ð²Ð°Ñ Ð¸Ð·Ñ Ð¾Ð´Ð½Ð¸Ñе пикÑели, Ñака Ñе вÑÑко ÑдвоÑване на маÑаба гÑÑбо ÑÑеÑвоÑÑва какÑо вÑемеÑо за ÑендиÑане, Ñака и конÑÑмаÑиÑÑа на памеÑ.
Ðве поÑледÑÑÐ²Ð¸Ñ Ð¿ÑоизÑиÑÐ°Ñ Ð´Ð¸ÑекÑно Ð¾Ñ Ñази аÑиÑмеÑика. ÐеÑ, ÑийÑо клÑÑ Ð¸Ð³Ð½Ð¾ÑиÑа нивоÑо на маÑабиÑане, е безполезен, заÑоÑо ÑамоÑо дейÑÑвие, коеÑо ÑÑÑбва да ÑÑкоÑи (маÑабиÑанеÑо), вÑеки пÑÑ Ð³ÐµÐ½ÐµÑиÑа нов биÑмап. ÐÑвен Ñова неогÑаниÑениÑÑ ÐºÐµÑ Ñе доведе до изÑеÑпване на адÑеÑноÑо пÑоÑÑÑанÑÑво на 32-биÑов пÑоÑÐµÑ ÑоÑно пÑи докÑменÑи, кÑдеÑо Ñ Ð¾ÑаÑа маÑабиÑÐ°Ñ Ð½Ð°Ð¹-инÑензивно: плÑÑни ÑканиÑÐ°Ð½Ð¸Ñ Ð½Ð° докÑменÑи за ÑобÑÑвеноÑÑ, инженеÑни ÑеÑÑежи, едÑоÑоÑмаÑни каÑÑи. ÐеÑÑÑ ÑÑÑбва да бÑде пÑавилно индекÑиÑан Ñ ÐºÐ»ÑÑове и ÑÑÑого огÑаниÑен, каÑо ниÑо едно Ð¾Ñ Ð´Ð²ÐµÑе не е опÑÐ¸Ñ Ð¿Ð¾ избоÑ.
Ðакво влиза в клÑÑа на кеÑа
ÐеÑиÑан биÑмап е безопаÑен за повÑоÑна ÑпоÑÑеба Ñамо когаÑо вÑиÑки паÑамеÑÑи, оÑоÑмили неговиÑе пикÑели, ÑÑвпадаÑ. Това ознаÑава номеÑа на ÑÑÑаниÑаÑа, еÑекÑивноÑо маÑабиÑане (или ÑÑоÑвеÑно изÑ
одниÑе ÑазмеÑи в пикÑели), ÑоÑаÑиÑÑа, DPI на мониÑоÑа и опÑииÑе за ÑендиÑане, коиÑо Ñа били в Ñила пÑи ÑÑздаванеÑо мÑ. СÑÑаниÑа, ÑендиÑана Ñ reAnnotations, е ÑазлиÑно изобÑажение Ð¾Ñ ÑÑÑаÑа ÑÑÑаниÑа без ÑÑÑ
, а ÑеÑно-бÑлоÑо ÑендиÑане ÑÑез reGrayscale е ÑÑвÑем ÑазлиÑно. ÐзпÑÑнеÑе нÑкой Ð¾Ñ Ñези паÑамеÑÑи Ð¾Ñ ÐºÐ»ÑÑа и гÑеÑкиÑе Ñа пÑедвидими: наÑлагване на аноÑаÑиÑ, коеÑо оÑÑава Ñлед каÑо пÑеглеждаÑиÑÑ Ðµ изÑÑил коменÑаÑа, или ÑÑÑаниÑа, коÑÑо ÑÑава Ñазмазана в моменÑа, в койÑо поÑÑебиÑелÑÑ Ð¿ÑемеÑÑи пÑозоÑеÑа Ð¾Ñ ÐµÐºÑана на лапÑопа кÑм вÑнÑен 4K мониÑÐ¾Ñ Ð¸ DPI Ñе пÑомени под оÑÑаÑÐµÐ»Ð¸Ñ Ð±Ð¸Ñмап.
function TPageCache.Acquire(Pdf: TPdf; PageNo: Integer; ZoomPct: Single;
Rotation: TRotation; Opts: TRenderOptions): TBitmap;
var
Key: string;
begin
Key := Format('%d|%.0f|%d|%d|%d',
[PageNo, ZoomPct, Ord(Rotation), Screen.PixelsPerInch, OptionsMask(Opts)]);
if FBitmaps.TryGetValue(Key, Result) then
Exit;
Pdf.PageNumber := PageNo;
Result := Pdf.RenderPage(0, 0, OutputWidth(PageNo, ZoomPct),
OutputHeight(PageNo, ZoomPct), Rotation, Opts);
FBitmaps.Add(Key, Result); // the cache now owns this bitmap
end;
ÐÑи попадение в кеÑа ÑезÑлÑаÑÑÑ Ñе вÑÑÑа за микÑоÑекÑнди, коеÑо е и ÑелÑа. Ðо-ÑÑÑдниÑÑ Ð²ÑпÑÐ¾Ñ Ðµ какво Ñе ÑлÑÑва Ñ Ð±Ð¸ÑмапиÑе, коиÑо оÑÐ¿Ð°Ð´Ð°Ñ Ð¾Ñ ÐºÐµÑа, и Ñова Ñе оказва вÑпÑÐ¾Ñ Ð·Ð° ÑÑÑ Ð½Ð°Ñа ÑобÑÑвеноÑÑ.
Ðой оÑвобождава биÑмапа
ФÑнкÑионалнаÑа ÑоÑма на RenderPage вÑÑÑа TBitmap, койÑо е ÑобÑÑвеноÑÑ Ð½Ð° извикваÑÐ¸Ñ ÐºÐ¾Ð´. ÐÑи еднокÑаÑен екÑпоÑÑ Ñази ÑобÑÑвеноÑÑ Ðµ оÑевидна и леÑна за ÑпÑавление. ÐÑÑÑе в кеÑа обаÑе Ñова Ñе пÑевÑÑÑа в най-ÑеÑÑаÑа пÑиÑина за изÑиÑане на Ð¿Ð°Ð¼ÐµÑ Ð² Delphi PDF визÑализаÑоÑиÑе, ÑÑй каÑо ÑеÑникÑÑ ÑÑдÑÑжа единÑÑвенаÑа пÑепÑаÑка кÑм вÑеки биÑмап, а ÑÑандаÑÑниÑÑ TDictionary оÑвобождава клÑÑове и ÑÑойноÑÑи авÑомаÑиÑно Ñамо ако Ñе Ñа ÑпÑавлÑвани Ñипове. TBitmap не е ÑакÑв Ñип. ÐзвадеÑе Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ ÐºÐµÑа, без да извикаÑе Free, и пикÑелиÑе оÑÑÐ°Ð²Ð°Ñ Ð·Ð°Ð´ÐµÐ»ÐµÐ½Ð¸ в памеÑÑа, без ниÑо да ÑоÑи кÑм ÑÑÑ
.
ÐÑиÑинаÑа Ñова да Ñе пÑопÑÑка е вÑемеÑо. ÐеÑеÑминÑÑен бÑÑз ÑеÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не маÑабиÑа доÑÑаÑÑÑно ÑазлиÑни ÑÑÑаниÑи, за да Ñе забележи пÑоблемÑÑ. ÐзÑиÑанеÑо Ñе пÑоÑвÑва едва Ñлед каÑо нÑкой е пÑевÑÑÑал и маÑабиÑал дÑлÑг докÑÐ¼ÐµÐ½Ñ Ð² пÑодÑлжение на два ÑаÑа, пÑи коеÑо пÑоÑеÑÑÑ Ð·Ð°Ð´ÑÑжа ÑÑоÑиÑи оÑиÑоÑели биÑмапи на ÑÑÑаниÑи и маÑинаÑа запоÑва да използва виÑÑÑална памеÑ. ÐÑо заÑо меÑ
анизмÑÑ Ð·Ð° изÑиÑÑване на памеÑÑа ÑÑÑбва да бÑде ÑаÑÑ Ð¾Ñ Ð¿ÑÑваÑа веÑÑÐ¸Ñ Ð½Ð° кеÑа, а не Ð¾Ñ Ð½ÑÐºÐ¾Ñ Ð¿Ð¾-кÑÑна. ÐгÑаниÑеÑе кеÑа по пÑогнозни байÑове (изÑиÑлени каÑо ÑиÑина по виÑоÑина по ÑеÑиÑи), пÑемаÑ
неÑе най-ÑÑдко използваниÑе ÑÑÑаниÑи (LRU), коиÑо Ñе намиÑÐ°Ñ Ð¸Ð·Ð²Ñн видимаÑа зона и пÑозоÑеÑа за пÑедваÑиÑелно заÑеждане, и оÑвобождавайÑе вÑеки биÑмап пÑи пÑемаÑ
ванеÑо мÑ. Ðа изÑеÑÑаваниÑ, коиÑо Ñа наиÑÑина вÑеменни, пÑеÑоваÑваниÑÑа, коиÑо ÑендиÑÐ°Ñ Ð² пÑедоÑÑавен Ð¾Ñ Ð¿Ð¾ÑÑебиÑÐµÐ»Ñ TBitmap или диÑекÑно вÑÑÑ
Ñ HDC, ви позволÑÐ²Ð°Ñ Ð½Ð°Ð¿Ñлно да избегнеÑе ÑложнаÑа ÑÑ
ема ÑÑÑ ÑобÑÑвеноÑÑÑа вÑÑÑ
Ñ Ð¾Ð±ÐµÐºÑиÑе. ÐÑедваÑиÑелниÑÑ Ð¿Ñеглед пÑеди пеÑÐ°Ñ Ðµ оÑевиден пÑимеÑ, ÑÑй каÑо ÑендиÑаÑе вÑеки лиÑÑ Ñамо веднÑж и кеÑиÑанеÑо Ð¼Ñ Ð½Ðµ ноÑи никакви ползи.
ÐÑогÑеÑивно ÑендиÑане и коÑекÑно анÑлиÑане
СÑандаÑÑниÑе пÑеÑоваÑÐ²Ð°Ð½Ð¸Ñ Ð½Ð° RenderPage блокиÑÐ°Ñ Ð¸Ð·Ð¿ÑлнениеÑо до завÑÑÑване на ÑÑÑаниÑаÑа, коеÑо е ÑоÑно поведениеÑо, коеÑо иÑкаÑе да избегнеÑе, докаÑо поÑÑебиÑелÑÑ Ð²Ñе оÑе движи конÑÑола за маÑабиÑане. Ðа Ñази Ñел Ñе използва RenderPageProgressive. ÐеÑодÑÑ Ð¿Ñиема IPdfCancellationToken и вÑÑÑа една Ð¾Ñ ÑÑойноÑÑиÑе prsDone, prsCancelled или prsFailed. ÐоведенÑеÑкиÑÑ Ð´ÐµÑайл, койÑо ÑеÑÑо изненадва ÑазÑабоÑÑиÑиÑе, е Ñе анÑлиÑанеÑо не е мигновено. ТокенÑÑ Ñе пÑовеÑÑва на гÑаниÑиÑе Ð¼ÐµÐ¶Ð´Ñ Ð¾ÑделниÑе блокове в пÑоÑеÑа на ÑендиÑане, Ñака Ñе Ñокен, койÑо подадеÑе в ÑÑедаÑа на блок, влиза в Ñила едва Ñлед каÑо Ñози блок пÑиклÑÑи. ÐÑи Ñложна ÑÑÑаниÑа вÑемеÑо Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°ÑвкаÑа за ÑпиÑане и ÑеалноÑо пÑекÑаÑÑване може да доÑÑигне деÑеÑки милиÑекÑнди. ÐÑоекÑиÑайÑе логикаÑа около Ñози пÑомеждÑÑÑк, вмеÑÑо да Ñе надÑваÑе Ñой да не ÑÑÑеÑÑвÑва: анÑлиÑайÑе пÑедÑ
Ð¾Ð´Ð½Ð¸Ñ Ñокен в моменÑа, в койÑо пÑиÑÑигне нова ÑÑойноÑÑ Ð·Ð° маÑаб, но не пÑиемайÑе, Ñе ÑÑаÑоÑо ÑендиÑане ÑпиÑа на ÑекÑндаÑа.
procedure TViewerForm.RequestRender(TargetZoom: Single);
var
Status: TPdfProgressiveStatus;
begin
if FTokenSource <> nil then
FTokenSource.Cancel; // abandon the previous in-flight render
FTokenSource := TPdfCancellationTokenSource.New; // FPdfAsync unit
Status := Pdf.RenderPageProgressive(FBackBuffer, 0, 0,
FBackBuffer.Width, FBackBuffer.Height, FTokenSource.Token,
ro0, [reAnnotations]);
case Status of
prsDone: PresentBackBuffer;
prsCancelled: ; // superseded by a newer request: drop silently
prsFailed: ShowRenderFailure;
end;
end;
Ðо вÑеме на инÑеÑакÑивно маÑабиÑане prsCancelled е ноÑмалниÑÑ ÑезÑлÑаÑ, а не изклÑÑение. ÐовеÑеÑо ÑендиÑаниÑ, ÑÑаÑÑиÑани Ð¾Ñ Ð¶ÐµÑÑ Ð·Ð° маÑабиÑане, Ñе бÑÐ´Ð°Ñ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ð¸ пÑеди да завÑÑÑаÑ, Ñака Ñе ÑÑеÑиÑайÑе анÑлиÑанеÑо каÑо ÑÑÑинно ÑÑбиÑие и пÑенебÑегвайÑе ÑезÑлÑаÑа ÑиÑ
о. ÐпаÑка Ð¾Ñ ÑендиÑаниÑ, коÑÑо запиÑва вÑÑко анÑлиÑане каÑо пÑедÑпÑеждение, Ñе погÑебе единÑÑвенаÑа наиÑÑина важна гÑеÑка под Ñ
илÑди Ñедове излиÑен ÑÑм. Ðа да пÑедоÑвÑаÑиÑе екÑана да изглежда замÑÑзнал, докаÑо ÑеÑе ÑеалноÑо ÑендиÑане, комбиниÑайÑе пÑогÑеÑÐ¸Ð²Ð½Ð¸Ñ Ð¿ÑÑ Ñ Ð²Ñеменен замеÑÑиÑел: маÑабиÑайÑе пÑедÑ
Ð¾Ð´Ð½Ð¸Ñ ÐºÐµÑиÑан биÑмап до Ð½Ð¾Ð²Ð¸Ñ ÑÐ°Ð·Ð¼ÐµÑ Ð¸ го покажеÑе веднага. Той Ñе изглежда леко Ñазмазан за ÑÑо или двеÑÑа милиÑекÑнди, но Ñе Ñе ÑÑеÑа каÑо мигновен оÑÐ³Ð¾Ð²Ð¾Ñ Ð¸ Ñе оÑигÑÑи на виÑококаÑеÑÑвеноÑо ÑендиÑане необÑ
одимоÑо вÑеме да завÑÑÑи или да бÑде анÑлиÑано Ð¾Ñ ÑледваÑоÑо дейÑÑвие.
РежимÑÑ Ð½Ð° напаÑване, койÑо маÑабиÑанеÑо ÑÐ¸Ñ Ð¾ изклÑÑва
СвойÑÑвоÑо FitMode на визÑализаÑоÑа, наÑÑÑоено на pfmFitPage или pfmFitWidth, пÑеизÑиÑлÑва маÑаба пÑи вÑÑка пÑомÑна на ÑазмеÑа, Ñака Ñе ÑÑÑаниÑаÑа да пÑодÑлжи да ÑÑоÑвеÑÑÑва на пÑозоÑеÑа. УловкаÑа е, Ñе задаванеÑо на Zoom диÑекÑно нÑлиÑа FitMode обÑаÑно на pfmNone. Ðо подÑазбиÑане Ñова е пÑавилно: поÑÑебиÑел, койÑо изÑиÑно е задал 150%, не иÑка ÑледваÑаÑа пÑомÑна на ÑазмеÑа на пÑозоÑеÑа да пÑемаÑ
не Ñази наÑÑÑойка. Това обаÑе изненадва вÑеки, койÑо ÑвÑÑже бÑÑон за пÑиближаване как Zoom := Zoom * 1.25 и Ñлед Ñова не може да ÑазбеÑе заÑо напаÑванеÑо по ÑиÑина е ÑпÑÑло да ÑеагиÑа Ñлед пÑÑвоÑо кликване. Ðко ваÑаÑа ленÑа Ñ Ð¸Ð½ÑÑÑÑменÑи пÑедлага какÑо изÑиÑно маÑабиÑане, Ñака и Ñежими на напаÑване, ÑÑÑбва Ñами да запомниÑе поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¸Ð·Ð±Ð¾Ñ Ð½Ð° поÑÑебиÑÐµÐ»Ñ Ð·Ð° напаÑване и да го пÑиÑвоиÑе оÑново, когаÑо Ñой наÑиÑне ÑÑоÑвеÑÐ½Ð¸Ñ Ð±ÑÑон. ÐомпоненÑÑÑ Ð½Ñма да вÑзÑÑанови Ñежим, койÑо пÑиÑвоÑванеÑо на маÑаб ÑокÑ-Ñо е изÑиÑÑило, и не Ñе пÑедполага да го пÑави.
ÐÑÐ´Ð¶ÐµÑ Ð½Ð° памеÑÑа, койÑо можеÑе да заÑиÑиÑе
ÐÑджеÑ, койÑо можеÑе да ÑазпиÑеÑе ÑеÑно на бÑло, е бÑджеÑ, койÑо можеÑе да заÑиÑиÑе пÑи пÑеглед на кода, Ñака Ñе запоÑнеÑе Ñ ÐºÐ¾Ð½ÐºÑеÑен ÑÑенаÑий. Ðа кажем, Ñе непÑекÑÑнаÑоÑо пÑевÑÑÑане поддÑÑжа видимаÑа ÑÑÑаниÑа плÑÑ Ð¾Ð´Ð½Ð° пÑедваÑиÑелно заÑедена ÑÑÑаниÑа оÑгоÑе и оÑдолÑ, заедно Ñ Ð»ÐµÐ½Ñа Ñ Ð¼Ð¸Ð½Ð¸Ð°ÑÑÑи (thumbnails). ÐÑи 100% на 96-DPI диÑплей Ñези ÑÑи биÑмапа в пÑлен ÑÐ°Ð·Ð¼ÐµÑ Ñа по около 3.5 MB вÑеки, коеÑо е пÑенебÑежимо малко. ÐÑи 300% на 4K диÑплей ÑÑÑиÑе ÑÑи биÑмапа Ñа по около 30 MB вÑеки, и Ñова е пÑеди кеÑÑÑ Ð´Ð° е запазил доÑи една пÑедиÑна ÑÑÑаниÑа. ÐаÑаÑÑванеÑо е в ÑамоÑо дейÑÑвие на поÑÑебиÑелÑ, а не в докÑменÑа.
РазÑмна наÑÑÑойка по подÑазбиÑане за 32-биÑов Delphi пÑоÑÐµÑ Ðµ Ð»Ð¸Ð¼Ð¸Ñ Ð¾Ñ 256 MB за биÑмапи пÑи LRU изÑиÑÑване. ÐÑи 64-биÑови пÑоÑеÑи можеÑе да маÑабиÑаÑе ÑпоÑед ÑизиÑеÑкаÑа RAM памеÑ, но вÑпÑеки Ñова запазеÑе ÑвÑÑд Ñаван, заÑоÑо ÑÑивÑÑ, Ð¾Ñ ÐºÐ¾Ð¹Ñо Ñе пÑедпазваÑе, не е пÑоÑÑо заÑваÑÑне на ваÑÐ¸Ñ Ð¿ÑоÑеÑ. СÑава вÑпÑÐ¾Ñ Ð·Ð° Ñова ÑÑлаÑа маÑина да запоÑне инÑензивно да запиÑва вÑв виÑÑÑалнаÑа Ð¿Ð°Ð¼ÐµÑ Ð½Ð° диÑка, докаÑо ваÑиÑÑ Ð²Ð¸Ð·ÑализаÑÐ¾Ñ ÑÐµÑ Ð½Ð¸ÑеÑки пÑодÑлжава да ÑабоÑи, а поÑÑебиÑелÑÑ Ñе ÑÑди заÑо вÑиÑко оÑÑанало е ÑÑанало изклÑÑиÑелно бавно. ТвÑÑдиÑÑ Ð»Ð¸Ð¼Ð¸Ñ ÑпиÑа ÑабоÑаÑа пÑедвидимо, докаÑо неогÑаниÑениÑÑ ÐºÐµÑ Ñе ÑÑива, блокиÑайки ÑÑлаÑа опеÑаÑионна ÑиÑÑема. ÐиниаÑÑÑиÑе заÑлÑÐ¶Ð°Ð²Ð°Ñ Ð¾Ñделно оÑноÑение: ÑендиÑайÑе вÑÑка Ð¾Ñ ÑÑÑ Ð²ÐµÐ´Ð½Ñж в Ð½ÐµÐ¹Ð½Ð¸Ñ Ð¼Ð°Ð»Ñк Ñелеви ÑÐ°Ð·Ð¼ÐµÑ Ð¸ Ñ Ð¿Ð°Ð·ÐµÑе в оÑделен пÑл, койÑо LRU логикаÑа не докоÑва. ÐовÑоÑноÑо генеÑиÑане на 120-пикÑелова миниаÑÑÑа ÑÑез намалÑване на маÑаба на 60 MB биÑмап за ÑÑла ÑÑÑаниÑа е най-нееÑекÑивниÑÑ Ð²Ñзможен наÑин за ÑÑздаване на Ñакова изобÑажение.
ÐÑкои оÑделни ÑÑÑаниÑи Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° надÑ
вÑÑлÑÑ Ð²Ñеки бÑджеÑ. ÐнженеÑен ÑеÑÑеж Ñ ÑÐ°Ð·Ð¼ÐµÑ E или голÑма каÑÑа, ÑендиÑани изÑÑло пÑи 400%, пÑедÑÑавлÑÐ²Ð°Ñ Ð·Ð°Ð´ÐµÐ»Ñне на ÑÑоÑиÑи мегабайÑи и никаква полиÑика за оÑвобождаване на Ð¿Ð°Ð¼ÐµÑ Ð½Ðµ пÑави Ñова пÑиемливо. РеÑениеÑо в Ñози ÑлÑÑай е да ÑпÑеÑе ÑендиÑанеÑо на Ñели ÑÑÑаниÑи. RenderTile ÑаÑÑеÑизиÑа Ñамо облаÑÑÑа Ñ Ð¿Ð¸ÐºÑелно оÑмеÑÑване (Left, Top) в ÑамкиÑе на ÑÑÑаниÑа, маÑабиÑана по подÑазбиÑане до PageWidth на PageHeight. Така ÑендиÑаÑе Ñамо Ð²Ð¸Ð´Ð¸Ð¼Ð¸Ñ Ð¿ÑавоÑгÑлник плÑÑ Ð¿Ð¾Ð»Ðµ Ð¾Ñ ÐµÐ´Ð½Ð° плоÑка около него за плавно паноÑамиÑане и добавÑÑе оÑмеÑÑваниÑÑа на плоÑкиÑе в клÑÑа на кеÑа заедно Ñ Ð¼Ð°Ñаба. ÐоддÑÑжайÑе ÑазмеÑиÑе на плоÑкиÑе ÑикÑиÑани в ÑÐµÐ»Ð¸Ñ Ð´Ð¾ÐºÑменÑ. ФикÑиÑаниÑе плоÑки ознаÑаваÑ, Ñе пÑомÑнаÑа на DPI изÑиÑÑва ÑиÑÑо ÑÑлаÑа мÑежа, докаÑо пÑоменливиÑе плоÑки Ñе ви накаÑÐ°Ñ Ð´Ð° Ñе ÑпÑавÑÑе Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¸ Ñевове Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±Ð»Ð°ÑÑи, ÑендиÑани в леко ÑазлиÑни маÑаби.
Ðве допÑлниÑелни ÑÑнкÑии ÑÐ¸Ñ Ð¾ ÑÑложнÑÐ²Ð°Ñ Ñози пÑоÑеÑ. ФилÑÑиÑе за ÑвеÑове, каÑо ÑеÑно-бÑло изобÑажение или инвеÑÑиÑ, Ñе изпÑлнÑÐ²Ð°Ñ Ñлед ÑендиÑане и вÑеки пÑÑ ÑÑÐ·Ð´Ð°Ð²Ð°Ñ Ð²ÑоÑи биÑмап в пÑлен ÑазмеÑ, ÑдвоÑвайки конÑÑмаÑиÑÑа на Ð¿Ð°Ð¼ÐµÑ Ð½Ð° ÑÑÑаниÑа за вÑеки изглед, койÑо ги използва. Тези аÑпекÑи Ñа Ñазгледани в маÑеÑиала за ÑилÑÑиÑане на ÑвеÑовеÑе за поÑÑебиÑели Ñ Ð¾ÑÑлабено зÑение в Delphi PDF визÑализаÑоÑи. ÐÑвен Ñова визÑализаÑоÑ, койÑо оÑвеÑÑва дÑмиÑе по вÑеме на пÑеобÑазÑване на ÑекÑÑ Ð² ÑÐµÑ (TTS), инвалидиÑа ÑендиÑÐ°Ð½Ð¸Ñ Ð¸Ð·Ð³Ð»ÐµÐ´ пÑи вÑÑка пÑоизнеÑена дÑма, Ñака Ñе взаимодейÑÑвиеÑо Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑенаÑеÑÑаванеÑо на маÑкиÑовкаÑа и ÑемпоÑо на ÑеÑÑа е по-важно, оÑколкоÑо изглежда на пÑÑв поглед, какÑо е опиÑано в ÑÑаÑиÑÑа за маÑкиÑане на дÑми пÑи TTS в Delphi.
ÐÑеÑоваÑениÑе меÑоди за ÑендиÑане, ÑÑаÑÑÑ ÐºÐ¾Ð´Ð¾Ð²ÐµÑе за пÑогÑеÑивно изпÑлнение и ÑамиÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð·Ð° визÑализаÑÐ¸Ñ Ñа докÑменÑиÑани на пÑодÑкÑоваÑа ÑÑÑаниÑа на PDFium Component.