Two hot-path optimizations for the device's Cortex-M7 (and debug simulator
builds):
- The ten sub-API pointers are cached once in Playdate.initialize(with:);
wrapper accessors now return UnsafePointer and call sites read a single
field through it, instead of unwrapping the optional API struct and
copying a whole sub-API struct of function pointers on every call.
Nested sub-APIs (sound classes, effects, video, tilemap, http/tcp)
derive from the cached pointers with one field load.
- String -> C conversions (withPlaydateCString, and a new withPlaydateUTF8
used by the text drawing/measuring APIs) use withUnsafeTemporaryAllocation
instead of building a ContiguousArray, so logging and drawText in the
update loop no longer heap-allocate per call. Verified within the
Embedded Swift subset by the device cross-compile.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>