Repository navigation
Pam Native 1.26.0
·
13 commits
to main
since this release
- Android images decode at the display size: a source larger than its view
is subsampled and then scaled in the sameBitmapFactorypass to the
smallest size that still covers the view (resizeMethodauto/resize),
instead of keeping up to twice the view's pixels per edge. A 1080x1350
photo in a 360 px grid cell now holds 360x450 pixels (was 540x675).
Tiled (repeat) images only subsample;scale/noneare unchanged. - Android photos decode to
Bitmap.Config.HARDWAREon API 28+ (GPU memory
only: no heap copy and no texture upload in the first frame that draws
them); opaque JPEGs useRGB_565on API 26-27. Inlinedata:glyphs and
images under 128x128 px stayARGB_8888. Software canvases (shared-element
snapshots, non-accelerated windows) draw a heap copy instead of failing;
blur already copied. MediaStore thumbnails follow the same storage. - Android decoded-image memory cache is sized from
ActivityManager.memoryClass(1/8, 1/16 on low-RAM devices, 8-64 MiB)
instead of a fixed 32 MiB. - Android releases the bitmap of an
Imagehidden by an ancestor (a covered
route, an inactive tab or page) or detached from the window, so the memory
cache bound really bounds decoded images. Showing it again restores it in
the same frame from the memory cache, or decodes it again without repeating
load events. Animated, inline and non-memory-cacheable images are kept. - Android mount: a new image drawable no longer requests a layout pass of the
engine-sizedImageView(one ancestor re-measure per arriving photo), each
ancestor is invalidated once per commit instead of once per laid-out
descendant, and the view prewarm pools refill on idle after a commit drains
them, so the next large subtree takes ready views. Commits emit
PamCommit.mutations,PamCommit.listsandPamCommit.layouttrace
sections. - iOS: network, media-cache, bundled
asset://,pam-file://andfile://
images decode through ImageIO at the size that covers the view (both
edges; a portrait photo in a square cell was decoded to the cell's longest
edge and upscaled), and small images are decoded off the main thread with
preparingForDisplay(). The encoded media memory cache (1/32 of RAM,
16-96 MB) and the inline glyph cache (2-8 MB) are sized from physical
memory. - No PHP API, protocol identifiers or dependency requirements changed.
Rebuild the Android and iOS hosts; see migration notes. - Measured on an API 35 emulator (SwiftShader, release-optimized benchmark
build, 4 runs each) with a synthetic profile (header + 3-column grid of 30
photos), a 20-row tab switch and a full-screen video page swap:- video page swap: worst frame p90 56.7 -> 34.1 ms (median 27.0 -> 16.2),
slow frames 21 -> 16, slow UI-thread frames 16 -> 3, worst UI-thread
frame 16.1 -> 5.7 ms; - tab switch: mount 9.1 -> 4.1 ms (median), worst UI-thread frame 11.7 ->
4.5 ms, slow frames 12 -> 9; - profile first open: mount 6.6 -> 4.4 ms, worst UI-thread frame 404.8 ->
262.3 ms (SwiftShader-bound first draw); - after a navigation tour: native heap 60-82 -> 32 MB, PSS 97-122 -> 72 MB
(the emulator does not attribute GPU buffers to the app's PSS).
- video page swap: worst frame p90 56.7 -> 34.1 ms (median 27.0 -> 16.2),