<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Orlalalala</title>
    <description>The latest articles on DEV Community by Orlalalala (@orlalalala_0d2542b48051ed).</description>
    <link>https://dev.to/orlalalala_0d2542b48051ed</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4138416%2F034da299-e008-42bd-9bb4-9da05defe602.png</url>
      <title>DEV Community: Orlalalala</title>
      <link>https://dev.to/orlalalala_0d2542b48051ed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orlalalala_0d2542b48051ed"/>
    <language>en</language>
    <item>
      <title>Garlictos 1.9: new characters, Danger levels, and the retention number I keep failing</title>
      <dc:creator>Orlalalala</dc:creator>
      <pubDate>Tue, 06 Oct 2026 07:53:55 +0000</pubDate>
      <link>https://dev.to/orlalalala_0d2542b48051ed/garlictos-19-new-characters-danger-levels-and-the-retention-number-i-keep-failing-dpg</link>
      <guid>https://dev.to/orlalalala_0d2542b48051ed/garlictos-19-new-characters-danger-levels-and-the-retention-number-i-keep-failing-dpg</guid>
      <description>&lt;p&gt;Garlictos 1.9 is out on Google Play. It's the garlic wave survival thing I've been making alone in Godot 4, and this update is mostly about giving people a reason to come back, because that's the number I keep failing at.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxdrqglb9qbrmvm6ssxkv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxdrqglb9qbrmvm6ssxkv.jpg" alt="Garlictos character select with Danger levels" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in 1.9
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;3 new characters: fighter, speed demon and ranger. You upgrade them with diamonds in a temple screen.&lt;/li&gt;
&lt;li&gt;Danger levels, for when the normal run gets too easy&lt;/li&gt;
&lt;li&gt;daily login rewards&lt;/li&gt;
&lt;li&gt;quests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ao229jcftr8jqy626bf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ao229jcftr8jqy626bf.jpg" alt="Character upgrade temple" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The number I keep failing at
&lt;/h2&gt;

&lt;p&gt;Day-1 retention has been sitting around 8% for two weeks, and day 7 is closer to 1%. When I split it by country it gets uglier. Players from Iraq, India and Bangladesh come back about 3-4% of the time on day 1. Iran, Turkey, the Philippines and Germany are somewhere between 15% and 20%.&lt;/p&gt;

&lt;p&gt;Most of my ad traffic came from the first group, so I paused the paid campaign on Oct 5. I'd rather look at the organic players for a week and see what 1.9 actually does to them.&lt;/p&gt;

&lt;p&gt;The other thing the data showed: after the Oct 1 update the share of new players reaching wave 5 went from about a third to somewhere between 43% and 58% depending on the day. Wave 10 roughly doubled. So people play longer now, they just don't come back the next day yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8bd2if8cbo7kqcvdl5qy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8bd2if8cbo7kqcvdl5qy.png" alt="Wave 12 gameplay" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ads, same as before
&lt;/h2&gt;

&lt;p&gt;Two short interstitials (after wave 8 and when you go back to the menu after dying), an optional rewarded ad to revive, no banners. AdMob pays me a few cents a day, so this is not a business yet. Free and works offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;The graphics are AI generated, I can't draw. The code is mine, I used AI afterwards to clean it up because it had turned into spaghetti.&lt;/p&gt;

&lt;p&gt;If you try it, tell me how the Danger levels feel. That's the part I tested the least.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.garlictos.omer" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.garlictos.omer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>android</category>
      <category>indiedev</category>
      <category>godot</category>
    </item>
    <item>
      <title>My first Google Ads app campaign as a solo dev: $46, 133 installs, and most players quit by wave 3</title>
      <dc:creator>Orlalalala</dc:creator>
      <pubDate>Thu, 24 Sep 2026 08:01:46 +0000</pubDate>
      <link>https://dev.to/orlalalala_0d2542b48051ed/my-first-google-ads-app-campaign-as-a-solo-dev-46-133-installs-and-most-players-quit-by-wave-3-3ab3</link>
      <guid>https://dev.to/orlalalala_0d2542b48051ed/my-first-google-ads-app-campaign-as-a-solo-dev-46-133-installs-and-most-players-quit-by-wave-3-3ab3</guid>
      <description>&lt;p&gt;so I'm a student, I made my first game (Garlictos, a small survivor roguelike for Android, Godot 4) and for the first 3 weeks it got like 4-5 new players a day from forum posts. I finally got a Google App campaign running this week and wanted to write down what actually happened, with real numbers, because when I was searching for this stuff I mostly found agency blogs.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 weeks of 0 impressions
&lt;/h2&gt;

&lt;p&gt;the campaign was "eligible" from day one and got &lt;strong&gt;zero impressions for about 3 weeks&lt;/strong&gt;. the diagnosis just said it didn't run last week, very helpful.&lt;/p&gt;

&lt;p&gt;the real problem was in conversions: the Google Play install conversion said &lt;strong&gt;"Misconfigured - Conversion data source is not linked"&lt;/strong&gt;. but in Data manager the Play link said "Linked". I unlinked and relinked from Play Console something like 5 times, same error every time.&lt;/p&gt;

&lt;p&gt;what finally worked (as far as I can tell): unlink in Play Console, send the link request again, and then &lt;strong&gt;go to Google Ads &amp;gt; Data manager &amp;gt; Google Play and actually approve the pending request there&lt;/strong&gt;. I think some of my earlier relinks were never approved on the Ads side. honestly I can't prove which step fixed it, but after that approval the campaign started spending the same day.&lt;/p&gt;

&lt;p&gt;also: the "create new conversion &amp;gt; choose data source" list stayed empty for me the whole time. if that happens to you, don't waste hours on it like I did.&lt;/p&gt;

&lt;h2&gt;
  
  
  the numbers (first ~2 days of real delivery)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;impressions: 28,588&lt;/li&gt;
&lt;li&gt;clicks: 2,716 (9.5% CTR, the video + screenshots seem to do ok)&lt;/li&gt;
&lt;li&gt;installs: 133&lt;/li&gt;
&lt;li&gt;spend: about &lt;strong&gt;$46.5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;cost per install: about &lt;strong&gt;$0.35&lt;/strong&gt; (my target was ~$0.41)&lt;/li&gt;
&lt;li&gt;cost per click: about $0.017&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;countries were mostly India, Iraq, Bangladesh, Algeria, Spain, plus a long tail of ~45 others. basically Google went where installs are cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  the thing I misunderstood about "Target CPA"
&lt;/h2&gt;

&lt;p&gt;I set a target cost per install and genuinely thought I only pay when someone installs. &lt;strong&gt;no.&lt;/strong&gt; in App campaigns you pay for clicks. the target is just what the bidding algorithm aims for on average. Google product experts say this pretty clearly in the community forum, and 30+ people had the exact same confusion in that thread lol.&lt;/p&gt;

&lt;p&gt;two more things I learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the daily budget is an &lt;em&gt;average&lt;/em&gt;. Google can spend up to 2x on a single day. once mine started, it burned through money way faster than I expected.&lt;/li&gt;
&lt;li&gt;monthly max is about 30.4x the daily budget. so a daily budget is really a monthly budget in disguise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;if you're broke like me, keep the daily budget small and lower the target in small steps, not one big jump. big jumps basically stop delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  what the players actually did
&lt;/h2&gt;

&lt;p&gt;this was the painful part. from GameAnalytics progression events, day one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;wave started&lt;/th&gt;
&lt;th&gt;players&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;67 new users opened the game, 51 started a run (~76%)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;half are gone before wave 3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;very few "fail" events, so most people don't die, they just close the app&lt;/li&gt;
&lt;li&gt;best run was wave 12 out of 20. nobody saw the boss.&lt;/li&gt;
&lt;li&gt;install count in Ads (133) is higher than new users in GameAnalytics, so some people install and never even open it. normal apparently, still hurts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;so paid traffic didn't fix anything, it just made my first-minute problem very visible, very fast. that's what I'm working on next.&lt;/p&gt;

&lt;h2&gt;
  
  
  would I do it again?
&lt;/h2&gt;

&lt;p&gt;yes, but slower. ~$0.35 per install is fine, but only if those players stay, and right now half of them leave in the first 2 minutes. fixing the start of the game is probably worth more than any ad setting.&lt;/p&gt;

&lt;p&gt;if you want to see what they're quitting on, the game is free: &lt;a href="https://play.google.com/store/apps/details?id=com.garlictos.omer" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.garlictos.omer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(heads up: 2 short interstitials per run, revive ad is optional. graphics were made with AI tools, the code I wrote myself and later cleaned up with AI because it was spaghetti.)&lt;/p&gt;

&lt;p&gt;happy to answer questions about the setup if anyone's about to try this.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>android</category>
      <category>marketing</category>
      <category>godot</category>
    </item>
    <item>
      <title>Shipping a Godot 4 game to cheap Android phones: what actually fixed my performance</title>
      <dc:creator>Orlalalala</dc:creator>
      <pubDate>Wed, 23 Sep 2026 00:08:53 +0000</pubDate>
      <link>https://dev.to/orlalalala_0d2542b48051ed/shipping-a-godot-4-game-to-cheap-android-phones-what-actually-fixed-my-performance-2ofd</link>
      <guid>https://dev.to/orlalalala_0d2542b48051ed/shipping-a-godot-4-game-to-cheap-android-phones-what-actually-fixed-my-performance-2ofd</guid>
      <description>&lt;p&gt;Everything ran fine in the editor. Smooth, 60fps, no complaints. Then I installed the APK on a cheap Android phone and it basically fell apart.&lt;/p&gt;

&lt;p&gt;That was probably the worst month of the whole year I spent on this game. I'm a student, I built it alone in Godot 4 in the evenings, and I honestly thought the hard part was done. It wasn't.&lt;/p&gt;

&lt;p&gt;The game is Garlictos, a wave survival roguelike (yes, Brotato-like, I'm not hiding it). Lots of enemies on screen, lots of projectiles, damage numbers everywhere. Basically the worst case for a low end GPU.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk7phyusxo5tbp987pb8i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk7phyusxo5tbp987pb8i.jpg" alt="Wave 12, a lot of stuff on screen" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the stuff that actually moved the needle, in the order I found it. Not a tutorial, just what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Draw calls: 204 down to 67
&lt;/h2&gt;

&lt;p&gt;First thing I did was open the monitors and look at draw calls. 204 on a busy wave. On desktop you don't care. On a cheap phone GPU you really care.&lt;/p&gt;

&lt;p&gt;The dumbest culprit was shadows. Every enemy had a little shadow sprite using &lt;code&gt;show_behind_parent&lt;/code&gt;. Looks nice, but it breaks 2D batching, because now the renderer has to go enemy, shadow, enemy, shadow... instead of drawing all shadows then all enemies. I moved the shadows to their own layer with a very low z_index (-50) and the count dropped a lot just from that.&lt;/p&gt;

&lt;p&gt;Label outlines were the other surprise. I had outline size 8 on the damage numbers because it looked chunky and readable. Dropped it to 2. Nobody noticed visually, the GPU definitely did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flickering enemies thing
&lt;/h2&gt;

&lt;p&gt;This one took me way too long. Pooled enemies would randomly flash or show the wrong color on some phones. Only on some phones, which is the worst kind of bug.&lt;/p&gt;

&lt;p&gt;Turned out I was using shader instance uniforms for the hit flash, and there's a limit of 4096 on those. With pooling, instances get reused and on some drivers it just goes weird once you're near the limit. The fix was boring: one shared material for all enemies, and when an enemy gets hit I swap to a flash material for a few frames and swap back. Less clever, works everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ghosting with physics interpolation
&lt;/h2&gt;

&lt;p&gt;I run physics at 30 Hz to save CPU and turned on physics interpolation so it still looks smooth. Mostly works great. But anything I moved in &lt;code&gt;_process&lt;/code&gt; instead of &lt;code&gt;_physics_process&lt;/code&gt; started to ghost, like a smeared double image, especially stuff that teleports (pooled bullets respawning).&lt;/p&gt;

&lt;p&gt;For those nodes I turned interpolation off and call &lt;code&gt;reset_physics_interpolation()&lt;/code&gt; when I teleport them. That's it. Annoying to track down, tiny fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The freezes I missed before release
&lt;/h2&gt;

&lt;p&gt;This is the embarrassing one. After launch people on older phones (2-3 GB RAM) told me the game froze for a second when big waves spawned. I didn't see it on my test phone so I shipped it.&lt;/p&gt;

&lt;p&gt;The reason: I was creating and destroying Timer nodes on the fly for all kinds of small things. Hundreds per wave. Moved everything to pooled timers / a simple tick counter in 1.7 and the freezes went down by around 90% in my testing. Lesson learned, pool everything that spawns during gameplay, not just the enemies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hoz59my0emu2rrgwpo1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hoz59my0emu2rrgwpo1.jpg" alt="Final boss fight" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;Version 1.7.1 is out, free on Android. 20 waves plus endless, 157 items, weapons merge when you collect two of the same one. There are two short ads in a run (after wave 8 and when you go back to the menu after dying), revive ads are optional.&lt;/p&gt;

&lt;p&gt;Trailer: &lt;a href="https://www.youtube.com/watch?v=3GNlJ_Z0nb4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=3GNlJ_Z0nb4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google Play: &lt;a href="https://play.google.com/store/apps/details?id=com.garlictos.omer" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.garlictos.omer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're doing Godot on mobile and hit something similar, ask in the comments, happy to go deeper on any of this. And if you try the game I'd love to know which wave killed you first, and an honest review on the store really helps a solo dev.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>android</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
