[perf] RT shader binding table is HOST_VISIBLE, GPU-read every traceRays
[perf][LOW] Compressed-asset Update re-Resizes both staging buffers every call
[perf][LOW] Per-mip layout transitions issued one-at-a-time
[perf][LOW] No VkPipelineCache passed to vkCreateComputePipelines
[perf][LOW] Refit re-uploads immutable index buffer on UPDATE
[perf] compressedStaging reallocated and kept per compressed Build
[perf] Per-mesh dedicated scratch buffer (VRAM waste)
[perf][MEDIUM] TLAS instance buffer is HOST_VISIBLE, read directly as AS build input
[perf] TLAS instance/metadata buffers reallocated on instance-count change
[perf] VulkanBuffer::Resize always destroys+reallocates
[perf] Per-allocation vkAllocateMemory, no suballocator
[perf][LOW] Per-descriptor write flushes all numFrames heap copies whole-size
[perf][LOW] FlushDevice always flushes even on coherent memory
[perf][LOW] GetMemoryType returns first match, no preferred/fallback distinction
[perf][MEDIUM] Descriptor heaps force HOST_VISIBLE|DEVICE_LOCAL with no fallback
[perf][LOW] GetLineWidth/ScaleForSize recompute scale + per-glyph HMetrics uncached
[perf][LOW] InputField hit-test is O(n^2): re-measures whole prefix per char
[robustness] Font atlas has no eviction/repack; ShelfPlace fails permanently once full
[perf][MEDIUM] TransitionImageLayout hardcodes RAY_TRACING stage for all shader reads
[perf][LOW] Ensure()+Lookup() do two hash-map probes per glyph