Шардированный кэш декодирования загруженных изображений
HotPDF сочетает независимо блокируемые метаданные кэша с точной координацией singleflight по каждому ключу
Параллельная работа
Шестнадцать шартов метаданных ограничивают конкуренцию за блокировки при поиске, добавлении и вытеснении, тогда как дорогостоящее декодирование изображений выполняется вне блокировок кэша
Запросы к разным ключам могут декодироваться параллельно, а среди запросов к одному ключу выбирается единственный владелец, чей готовый результат разделяется между всеми ожидающими вызывающими
Глобальные ограничения
ImageCacheMaxBytes, максимальное число записей и максимальный размер одной записи применяются к суммарному содержимому всех шартов
Обрезка между шардами сохраняет точные настроенные лимиты и не выбирает только что заполненный шард, если запрос на вытеснение может удовлетворить другой шард
Владение и время жизни
AcquireLoadedImageStream и AcquireLoadedImageRegionAtResolution возвращают неизменяемые handle с подсчётом ссылок, поэтому попадания в тёплый кэш и ожидающие singleflight делят декодированные данные без копирования пикселей
Handle остаётся действительным после вытеснения из кэша, инвалидации и уничтожения документа, а CreateBitmapCopy даёт изолированный bitmap во владении вызывающего, когда нужны изменяемые пиксели
Устаревшие методы кэшированного декодирования сохраняют свой контракт с TBitmap во владении вызывающего, материализуя одну копию из handle
Телеметрия
GetImageDecodeConcurrencyInfo раскрывает текущие и накопленные счётчики параллелизма
Счётчики учитывают получения handle, копии compatibility bitmap и скопированные байты, а также активность параллельных владельцев и singleflight
Связанные API
IHPDFDecodedBitmapHandle · AcquireLoadedImageStream · AcquireLoadedImageRegionAtResolution · THPDFImageDecodeConcurrencyInfo