<?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>How I Made a Brotato Clone on a 2013 Laptop using AI and Zero Coding Skills</title>
      <dc:creator>Orlalalala</dc:creator>
      <pubDate>Tue, 20 Oct 2026 21:53:13 +0000</pubDate>
      <link>https://dev.to/orlalalala_0d2542b48051ed/how-i-made-a-brotato-clone-on-a-2013-laptop-using-ai-and-zero-coding-skills-1o96</link>
      <guid>https://dev.to/orlalalala_0d2542b48051ed/how-i-made-a-brotato-clone-on-a-2013-laptop-using-ai-and-zero-coding-skills-1o96</guid>
      <description>&lt;p&gt;It all started 8 months ago. I was 35 years old, staring blankly at my greasy Xbox controller with my Doritos-dusted hands. I thought to myself, "Dude, I've been playing games for 30 years (starting all the way back with bootleg NES clones)—why on earth am I not making one?" So I told myself: get up and finally jump into game development, something you've been procrastinating on for 10 years.&lt;/p&gt;

&lt;p&gt;After all, we live in the tech age. You don't need to be Hideo Kojima to make a game nowadays. That "one-in-a-million super-nerd genius" trope felt totally unnecessary in this era. I immediately got up from the couch, wiped my greasy Xbox controller on the cushions, and sat in front of my 2013 laptop—an old machine with an NVIDIA GTX 660M GPU, a half-open chassis, a slightly cracked screen, and an air filter probably more clogged than a 1980 Volkswagen Golf.&lt;/p&gt;

&lt;p&gt;Since I was obviously going to make GTA 6, I immediately downloaded Unity and Unreal Engine. But my veteran laptop took one look at those programs, fired up its fans at max speed, and basically treated me like a poor, ugly, unsmart guy trying to hit on a 10/10 girl—it straight-up looked down on me and gave zero response.&lt;/p&gt;

&lt;p&gt;So I did a little research. My requirements were simple: the software had to run on a toaster, and it had to be free. But mark my words: FREE. Free as in $0.&lt;/p&gt;

&lt;p&gt;That's how I met Godot. Plus, Brotato—a game I played for free on Game Pass—was built on Godot, and those guys made $17 million. A lightbulb went off in my head. Brotato! It looks simple enough, and it shouldn't take long to build. How hard could it be, right? Hahaha... looking back now, it took a whole 8 months.&lt;/p&gt;

&lt;p&gt;I immediately started binge-watching tutorials. Everything related to Godot: Udemy, YouTube, Spotify podcasts, Brazilian soap operas, morning health shows on TV—whatever I could find. Slowly, something resembling a game started taking shape. But since I'm not one of those multi-billionaire coding nerds, I had zero knowledge on the programming side.&lt;/p&gt;

&lt;p&gt;Then my friend came up with a "brilliant" idea: "Bro, there's this AI called Gemini, it'll help you out."&lt;/p&gt;

&lt;p&gt;And that's when the torture began! Gemini... It only had one small flaw: being the absolute dumbest AI on the planet. But it had one incredible feature: it was practically free. We immediately started bonding over Google Antigravity like new lovers.&lt;/p&gt;

&lt;p&gt;I'd say: "Do this," and it would reply: "Done, bro!"&lt;br&gt;
I'd ask: "Did you do it?" and it'd say: "I handled it before you even asked, babe!"&lt;br&gt;
I'd check: "What about that bug?" and it'd go: "Don't you worry your pretty little head, I fixed that too!"&lt;/p&gt;

&lt;p&gt;Turns out... it was all pure hallucinations.&lt;/p&gt;

&lt;p&gt;When I hit 1,431 debug errors, I started having my doubts. But what truly convinced me was when it gave me a dinner recipe while we were fixing code on my project. Turns out that was its actual superpower.&lt;/p&gt;

&lt;p&gt;Anyway, I thought, "I guess this is how game dev is done." A little AI, a little bit of me, and a whole lot of luck. I kept at it. The AI broke things, I fixed them. It broke them again, I fixed them again. I learned by fixing. It explained, I learned.&lt;/p&gt;

&lt;p&gt;Finally, a game like Brotato came out. Well... not "like" Brotato, it was an outright clone. I accidentally made the exact same game. Knowing that level of similarity would land me in court—and since I'm not a multi-billionaire divorcing his 50-year-old wife for a 20-year-old—I realized I needed to change things up. After all, I'm just a guy with an Xbox Series S and a 2013 laptop.&lt;/p&gt;

&lt;p&gt;So I added my own spin. I remembered active skills from my old Dota days. I thought, "If I give my characters active abilities, the game will be way more fun." Plus, permanent upgrades. The cherry on top!&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%2Ftdct50fdj32vye0v1eln.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%2Ftdct50fdj32vye0v1eln.jpg" alt="5 danger levels" width="800" height="450"&gt;&lt;/a&gt;&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%2F8vrvaln6aw7qjmijst2z.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%2F8vrvaln6aw7qjmijst2z.jpg" alt="Merge your weapons" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Boom. The game was ready and live on the Play Store.&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%2Fo5z2fmgg6mt6sx92o1py.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%2Fo5z2fmgg6mt6sx92o1py.jpg" alt="Defeat mighty bosses" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then came the curse of game development: marketing. It's not enough to make a game; you actually have to sell it. So I jumped into Google Ads.&lt;/p&gt;

&lt;p&gt;The plan: A massive 15-day campaign. Daily budget: $2. Target Cost-Per-Install: $0.003.&lt;/p&gt;

&lt;p&gt;I launched this gigantic budget. And I got an insane number of downloads! The AI went crazy over the results. It was like: "I cannot believe this! As an AI with billions of parameters, these results are mind-blowing!"&lt;/p&gt;

&lt;p&gt;The result? Exactly 5,000 downloads. Yes, you heard that right—5,000!&lt;/p&gt;

&lt;p&gt;...Except it was a totally useless crowd. Bangladesh, Afghanistan, Syria, Iran, Libya... None of them actually played the game. Their phones couldn't even run it! My crash rate went through the roof. So I lost my massive ad budget and ended up with a sky-high crash rate. Left totally empty-handed.&lt;/p&gt;

&lt;p&gt;Right now, the game is making me a solid passive income: an average of $0.003 per day. I made $5 in 2 months! My total production cost was $20 for AI subscriptions and $50 for ads. At this rate, the game will break even in about 2 years.&lt;/p&gt;

&lt;p&gt;So here is my request: Please watch the video, and if you like the genre, give my game a chance and leave a short review or comment! I have 5,000 downloads and only 4 reviews.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/JDvCtBR4Sxs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Love you all! If you read this far, stay safe and take care!&lt;/p&gt;

&lt;p&gt;Free on Google Play: &lt;a href="https://play.google.com/store/apps/details?id=com.garlictos.omer&amp;amp;referrer=utm_source%3Ddevto21" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.garlictos.omer&amp;amp;referrer=utm_source%3Ddevto21&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. It has ads (full screen after wave 8/14, rewarded ones are optional). Graphics are AI assisted.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>android</category>
      <category>ai</category>
    </item>
    <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>
