<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Native Droid Games</title>
    <link>https://android-native-gaming.lol/</link>
    <description>Independent notes on native Android game development: NDK, Vulkan, audio latency, profiling, thermals, memory and packaging.</description>
    <language>en</language>
    <lastBuildDate>Fri, 16 Oct 2026 09:00:00 +0000</lastBuildDate>
    <generator>hand-written XML</generator>
  <item>
    <title>Android 17 preview raises the memory limits for games</title>
    <link>https://android-native-gaming.lol/news/2026-10-13-android-17-memory-limits.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-10-13-android-17-memory-limits.html</guid>
    <pubDate>Tue, 13 Oct 2026 09:00:00 +0000</pubDate>
    <category>memory</category>
    <description>The per-app limit on low-memory devices moves from 512 MB to 768 MB. The OOM killer still ignores your intent, and that is the part that matters. The Android 17 developer preview raises the per-app memory ceiling on devices with 4 GB of RAM from 512 MB to 768 MB, and makes the value readable through the activity manager. For a game with a large texture set this is real headroom, but it arrives with a condition: the limit is a ceiling, not a reservation.</description>
  </item>
  <item>
    <title>NDK r29 preview: what changes for game builds</title>
    <link>https://android-native-gaming.lol/news/2026-09-22-ndk-r29-preview.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-09-22-ndk-r29-preview.html</guid>
    <pubDate>Tue, 22 Sep 2026 09:00:00 +0000</pubDate>
    <category>ndk</category>
    <description>The preview drops the legacy toolchain files, moves to LLVM 19 and finally makes the C++ standard library choice explicit. The r29 preview removes the legacy &lt;code&gt;android.toolchain.cmake&lt;/code&gt; path. Projects still setting &lt;code&gt;ANDROID_NDK_TOOLCHAIN_VERSION&lt;/code&gt; will fail at configure time with a message that names the removed variable, which is better than the silent fallback older releases used.</description>
  </item>
  <item>
    <title>The average frame is fine and the game still stutters</title>
    <link>https://android-native-gaming.lol/news/2026-08-18-frame-pacing-percentiles.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-08-18-frame-pacing-percentiles.html</guid>
    <pubDate>Tue, 18 Aug 2026 09:00:00 +0000</pubDate>
    <category>profiling</category>
    <description>Report the 95th and 99th percentile, not the mean. A 16.6 ms average with a 40 ms tail is a game that hitches twice a second. A frame time average hides exactly the frames players notice. We logged a session with a mean of 16.4 ms and a 99th percentile of 48 ms: at 60 fps that is one visible hitch every 50 frames, which reads as “not smooth” even though every benchmark summary says otherwise.</description>
  </item>
  <item>
    <title>The asset half of APK size</title>
    <link>https://android-native-gaming.lol/news/2026-07-21-asset-size.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-07-21-asset-size.html</guid>
    <pubDate>Tue, 21 Jul 2026 09:00:00 +0000</pubDate>
    <category>packaging</category>
    <description>Compression settings saved 12 MB. Wrong texture formats saved 180 MB. The order matters. We took a 410 MB game build and looked at where the bytes were: textures 268 MB, audio 74 MB, meshes 31 MB, code 22 MB, everything else 15 MB. Changing compression on the APK moved the download by 12 MB. Changing the texture format moved it by 180 MB.</description>
  </item>
  <item>
    <title>Gamepad to photon: measuring input latency end to end</title>
    <link>https://android-native-gaming.lol/news/2026-06-09-input-latency.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-06-09-input-latency.html</guid>
    <pubDate>Tue, 09 Jun 2026 09:00:00 +0000</pubDate>
    <category>audio</category>
    <description>A high-speed camera and a Bluetooth controller with a known LED give a number you can act on, without special hardware. We measured input latency by filming the controller&#x27;s LED and the phone screen at 240 fps, then counting frames between the LED changing and the first pixel of the response. The method is crude but repeatable, and it separates transport latency from render latency.</description>
  </item>
  <item>
    <title>The memory type you pick is a promise about the next frame</title>
    <link>https://android-native-gaming.lol/news/2026-04-28-vulkan-memory-types.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-04-28-vulkan-memory-types.html</guid>
    <pubDate>Tue, 28 Apr 2026 09:00:00 +0000</pubDate>
    <category>vulkan</category>
    <description>DEVICE_LOCAL is not automatically faster, and HOST_VISIBLE is not automatically slow. The difference shows up two frames later. A common pattern is to allocate every buffer as device-local and every staging buffer as host-visible, which is correct on desktop and leaves performance on the table on mobile. Mobile GPUs often share physical memory with the CPU, and a host-visible buffer that is also device-local avoids a copy at no cost.</description>
  </item>
  <item>
    <title>Baseline profiles do not help native code, but their siblings do</title>
    <link>https://android-native-gaming.lol/news/2026-03-17-baseline-profiles.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-03-17-baseline-profiles.html</guid>
    <pubDate>Tue, 17 Mar 2026 09:00:00 +0000</pubDate>
    <category>profiling</category>
    <description>A baseline profile speeds up the Java and Kotlin startup path. For a native game, the equivalent work happens in your own loader. Baseline profiles tell the Android runtime which classes to compile ahead of time. A game whose Java layer is a thin wrapper around &lt;code&gt;NativeActivity&lt;/code&gt; will see almost no benefit, because there is almost nothing to compile.</description>
  </item>
  <item>
    <title>The 16 KB page checklist, one year later</title>
    <link>https://android-native-gaming.lol/news/2026-02-24-16kb-page-checklist.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-02-24-16kb-page-checklist.html</guid>
    <pubDate>Tue, 24 Feb 2026 09:00:00 +0000</pubDate>
    <category>memory</category>
    <description>Most games are aligned now. The failures we still see are assets, not code: uncompressed files that get mapped directly. A year after the NDK default changed, the shared libraries in most reports are correctly aligned. The remaining failures are asset files: an uncompressed texture atlas or a custom pack file mapped with &lt;code&gt;mmap&lt;/code&gt; must start at a 16 KB boundary, or the mapping silently falls back to a copy.</description>
  </item>
  <item>
    <title>Three ways to compile shaders at load time, and what each costs</title>
    <link>https://android-native-gaming.lol/news/2026-01-14-shader-compilation.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2026-01-14-shader-compilation.html</guid>
    <pubDate>Wed, 14 Jan 2026 09:00:00 +0000</pubDate>
    <category>vulkan</category>
    <description>Offline, at install, or on first use. The trade-off is start-up time against a stutter you cannot hide. Vulkan requires pipeline state to be created before the first draw. A game can precompile everything offline into a pipeline cache, compile lazily on first use, or compile a small set during the loading screen.</description>
  </item>
  <item>
    <title>Android 16 game mode: what the API actually reports</title>
    <link>https://android-native-gaming.lol/news/2025-11-12-android-16-game-mode.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-11-12-android-16-game-mode.html</guid>
    <pubDate>Wed, 12 Nov 2025 09:00:00 +0000</pubDate>
    <category>news</category>
    <description>The mode is a request, not a guarantee. Here is what a game can read back, and which parts vary by device. Android 16 exposes a game mode through &lt;code&gt;GameManager&lt;/code&gt;. A game can declare a preferred mode, read the current one, and register a callback for changes. The useful part for performance work is the callback: it fires when the system changes the mode because of thermals, battery saver or a user setting.</description>
  </item>
  <item>
    <title>Thermal throttling on 2025 flagships: the first ten minutes</title>
    <link>https://android-native-gaming.lol/news/2025-09-30-thermal-curve.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-09-30-thermal-curve.html</guid>
    <pubDate>Tue, 30 Sep 2025 09:00:00 +0000</pubDate>
    <category>power</category>
    <description>We ran the same scene for 40 minutes on six phones. Every one of them lost at least 20 percent of its frame rate, and two lost more than 40. The test scene is deliberately boring: a fixed camera, one directional light, one shadow cascade, and enough geometry to keep the GPU busy at 60 fps. We capped the frame rate at 60 and logged frame time, GPU frequency and battery temperature once per second.</description>
  </item>
  <item>
    <title>Rust on Android: a toolchain that survives an NDK upgrade</title>
    <link>https://android-native-gaming.lol/news/2025-08-27-rust-android-toolchain.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-08-27-rust-android-toolchain.html</guid>
    <pubDate>Wed, 27 Aug 2025 09:00:00 +0000</pubDate>
    <category>ndk</category>
    <description>Pin the target, the linker and the NDK version in one place, or spend a morning reading undefined symbol errors after every update. Rust support for Android targets is good enough for game code in 2025, but the setup is still three moving parts: the target triple, the linker that matches the NDK, and the C++ standard library that the linker pulls in for Vulkan and OpenSL wrappers.</description>
  </item>
  <item>
    <title>Capturing a GPU frame on a retail phone without root</title>
    <link>https://android-native-gaming.lol/news/2025-07-15-gpu-capture-without-root.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-07-15-gpu-capture-without-root.html</guid>
    <pubDate>Tue, 15 Jul 2025 09:00:00 +0000</pubDate>
    <category>profiling</category>
    <description>Debug layers plus a layer-enabled build are enough for most engines. The trick is getting the layer into the process before the first frame. A retail phone will not let you attach a GPU debugger to an arbitrary app, but it will load a Vulkan layer from your own APK if you package it and enable it from the app&#x27;s own manifest. The layer writes a capture file that you copy off the device and open on a desktop.</description>
  </item>
  <item>
    <title>NDK r28 makes 16 KB page alignment the default</title>
    <link>https://android-native-gaming.lol/news/2025-06-05-ndk-r28-page-size.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-06-05-ndk-r28-page-size.html</guid>
    <pubDate>Thu, 05 Jun 2025 09:00:00 +0000</pubDate>
    <category>ndk</category>
    <description>Newer devices ship with 16 KB memory pages. Native libraries linked for 4 KB still load, but the gap is closing and the fix is one linker flag. NDK r28 links native libraries with 16 KB maximum page size by default. If you build with an older toolchain, add &lt;code&gt;-Wl,-z,max-page-size=16384&lt;/code&gt; to the linker flags and rebuild every shared object, including third-party &lt;code&gt;.so&lt;/code&gt; files you did not compile yourself.</description>
  </item>
  <item>
    <title>Oboe 1.9 cuts callback jitter on three of five test phones</title>
    <link>https://android-native-gaming.lol/news/2025-04-22-oboe-19-jitter.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-04-22-oboe-19-jitter.html</guid>
    <pubDate>Tue, 22 Apr 2025 09:00:00 +0000</pubDate>
    <category>audio</category>
    <description>The new version moves the resampler off the audio thread when the device runs at a non-native rate. The improvement is real but not universal. Oboe 1.9 changed how it handles a requested sample rate that differs from the device&#x27;s native rate: the resampler now runs on a separate thread for streams opened in low-latency mode. We measured callback intervals on five phones with a 256-frame buffer at 48 kHz and a requested 44.1 kHz stream.</description>
  </item>
  <item>
    <title>A missing image barrier that survived three releases</title>
    <link>https://android-native-gaming.lol/news/2025-03-18-vulkan-validation-descriptor.html</link>
    <guid isPermaLink="true">https://android-native-gaming.lol/news/2025-03-18-vulkan-validation-descriptor.html</guid>
    <pubDate>Tue, 18 Mar 2025 09:00:00 +0000</pubDate>
    <category>vulkan</category>
    <description>Sync validation found in four seconds what a month of playtesting could not: a writer and a reader touching the same image in the same submission. A small studio sent us a frame capture with a symptom we recognised: textures flickered for one frame after a level load, only on one GPU vendor, only when the frame rate was above 50. Nothing crashed, nothing logged, and the bug report had been open since November.</description>
  </item>
  </channel>
</rss>
