<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Canberk Pitirli — Blog</title>
    <link>https://canberkpitirli.com/blog</link>
    <description>Graphics programming, game development, C++, Rust, and systems design.</description>
    <language>en-us</language>
    <atom:link href="https://canberkpitirli.com/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The 16.6 Millisecond Religion</title>
      <link>https://canberkpitirli.com/blog/the-16-millisecond-religion</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/the-16-millisecond-religion</guid>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>Game developers live under a law most of the software industry has never felt: 16.6 milliseconds, every frame, forever. Here's what that discipline looks like from inside, and what happened to the software that never had it.</description>
    </item>
    <item>
      <title>The Magic Behind loss.backward() Is 1,451 Lines</title>
      <link>https://canberkpitirli.com/blog/backpropagation-is-1451-lines</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/backpropagation-is-1451-lines</guid>
      <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>Most people using deep learning treat backpropagation as a sealed black box. I implemented it from scratch for FastNN and counted: the entire autograd engine is 1,451 lines. Here is what's actually inside, math included.</description>
    </item>
    <item>
      <title>I Implemented Raft From Scratch. Here's What the Paper Doesn't Tell You.</title>
      <link>https://canberkpitirli.com/blog/what-the-raft-paper-doesnt-tell-you</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/what-the-raft-paper-doesnt-tell-you</guid>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>Raft is famous for being the understandable consensus algorithm. Then you implement it, and you discover where the understanding was hiding. Notes from building raft-kv, a distributed key-value store in Rust with a core so pure it can be tested without a network.</description>
    </item>
    <item>
      <title>I Built a 3D Renderer Where Every Pixel Is a Character</title>
      <link>https://canberkpitirli.com/blog/renderer-where-pixels-are-characters</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/renderer-where-pixels-are-characters</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>ASCIIRenderer is a full 3D pipeline, perspective projection, z-buffer, Blinn-Phong lighting, that refuses to output pixels. It outputs characters, in color, to your browser, at 30 frames per second. Building it taught me more about GPUs than the GPU ever did.</description>
    </item>
    <item>
      <title>Procedural Terrain Generation in UE5 with C++</title>
      <link>https://canberkpitirli.com/blog/procedural-terrain-ue5-cpp</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/procedural-terrain-ue5-cpp</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <category>Tutorials</category>
      <description>Slap some noise on a heightmap and you have terrain, right? Then you try to make it deterministic, seamless, fast, and editable by people who don't read C++, and the textbook chapter ends right where your problems begin.</description>
    </item>
    <item>
      <title>I Shipped a Steam Game at 14. Here's What the Code Looked Like.</title>
      <link>https://canberkpitirli.com/blog/steam-game-at-14</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/steam-game-at-14</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <category>Career</category>
      <description>Endless Combat is still on Steam. The store page says co-op zombie survival. What it doesn't say is that the gameplay code was written by a teenager who thought header files were a suggestion.</description>
    </item>
    <item>
      <title>The Rendering Equation, From Scary Integral to HLSL</title>
      <link>https://canberkpitirli.com/blog/rendering-equation-to-hlsl</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/rendering-equation-to-hlsl</guid>
      <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>Every PBR shader you've ever written is one integral wearing a trench coat. Here's the rendering equation term by term, the Cook-Torrance BRDF that lives inside it, and the exact HLSL each symbol turns into.</description>
    </item>
    <item>
      <title>ViewCam Devlog: Chasing Milliseconds from Phone Camera to Zoom</title>
      <link>https://canberkpitirli.com/blog/viewcam-devlog-chasing-milliseconds</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/viewcam-devlog-chasing-milliseconds</guid>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>A virtual webcam that lags is worse than no webcam at all. Here's the latency budget of ViewCam's pipeline, where the milliseconds actually hide, and the embarrassingly analog way I measure them.</description>
    </item>
    <item>
      <title>Writing a Virtual Camera: DirectShow vs v4l2loopback</title>
      <link>https://canberkpitirli.com/blog/virtual-camera-directshow-vs-v4l2loopback</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/virtual-camera-directshow-vs-v4l2loopback</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>To make Zoom believe your app is a webcam, you have to convince two very different operating systems. One asks for a COM object registered in the registry. The other asks you to politely write frames into a file. Guess which one took a week.</description>
    </item>
    <item>
      <title>Why I Was Inactive for a While</title>
      <link>https://canberkpitirli.com/blog/why-i-was-inactive-for-a-while</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/why-i-was-inactive-for-a-while</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <category>Career</category>
      <description>The blog went quiet for three months and a few people actually checked if I was okay. I was okay. I was just buried under two jobs, a product launch, a Play Store approval, and a suitcase I need to pack for Japan. Let me explain.</description>
    </item>
    <item>
      <title>Why I Hate Electron</title>
      <link>https://canberkpitirli.com/blog/why-i-hate-electron</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/why-i-hate-electron</guid>
      <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>Electron ships 120MB of Chromium so your app can render a button. I've had enough of pretending this is acceptable.</description>
    </item>
    <item>
      <title>Why C++ Is Still Irreplaceable in Game Development</title>
      <link>https://canberkpitirli.com/blog/why-cpp-is-still-king</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/why-cpp-is-still-king</guid>
      <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>Every few years someone declares C++ dead and points to Rust, Zig, or some managed language as its replacement. They're wrong, and here's why it matters for game development specifically.</description>
    </item>
    <item>
      <title>Hand-Written CUDA vs PyTorch: Honest Benchmarks from Building FastNN</title>
      <link>https://canberkpitirli.com/blog/handwritten-cuda-vs-pytorch</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/handwritten-cuda-vs-pytorch</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>I wrote a deep learning framework from scratch in Rust with hand-tuned CUDA kernels, benchmarked it against PyTorch, and I'm publishing the numbers including the ones that don't flatter me.</description>
    </item>
    <item>
      <title>Shadow Mapping from Scratch in DirectX 11</title>
      <link>https://canberkpitirli.com/blog/shadow-mapping-dx11</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/shadow-mapping-dx11</guid>
      <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>Shadow mapping is one of those techniques that looks simple on paper and punishes you the moment you go off-script. Here's the full picture: depth bias, PCF, and the math that actually makes it work.</description>
    </item>
    <item>
      <title>What Shipping Two Steam Games Taught Me</title>
      <link>https://canberkpitirli.com/blog/lessons-from-shipping-on-steam</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/lessons-from-shipping-on-steam</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>Career</category>
      <description>I shipped my first Steam title at 16. By the time the second one launched, I had a completely different understanding of what 'done' means and what players actually care about.</description>
    </item>
    <item>
      <title>Building an Unreal Engine Plugin in C++, From Empty Folder to Distributable</title>
      <link>https://canberkpitirli.com/blog/unreal-plugin-from-empty-folder</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/unreal-plugin-from-empty-folder</guid>
      <pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate>
      <category>Tutorials</category>
      <description>Everything reusable I write for Unreal now starts life as a plugin, not a project. Here's the anatomy of one: modules, Build.cs, export macros, editor-only code, and the packaging step everyone gets wrong first.</description>
    </item>
    <item>
      <title>Deferred vs Forward Rendering: When Each One Actually Wins</title>
      <link>https://canberkpitirli.com/blog/deferred-vs-forward-rendering</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/deferred-vs-forward-rendering</guid>
      <pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>Students ask me this every month, so here's the answer I actually give: the whole debate is one question about where you pay for lights, and your content answers it for you.</description>
    </item>
    <item>
      <title>CMake for Game Developers Who Hate CMake</title>
      <link>https://canberkpitirli.com/blog/cmake-for-game-developers</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/cmake-for-game-developers</guid>
      <pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>You don't need to like CMake. You need the 20% of it that makes C++ builds boring and reliable, and permission to ignore the rest. This is that 20%, learned from building an engine with it.</description>
    </item>
    <item>
      <title>Go Is the Right Tool for API Backends</title>
      <link>https://canberkpitirli.com/blog/go-for-api-development</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/go-for-api-development</guid>
      <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>I've written backends in Node.js, Express, and FastAPI. They all work. But when I need something that will hold up under real load without babysitting it, I write Go.</description>
    </item>
    <item>
      <title>One Engine, Four Graphics Backends: What I'd Do Differently</title>
      <link>https://canberkpitirli.com/blog/one-engine-four-graphics-backends</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/one-engine-four-graphics-backends</guid>
      <pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>SleakEngine runs DirectX 11, DirectX 12, Vulkan, and OpenGL behind one abstraction layer. Building that taught me exactly why nobody should build that. A postmortem in advance.</description>
    </item>
    <item>
      <title>Why I Started Writing Rust</title>
      <link>https://canberkpitirli.com/blog/why-i-started-writing-rust</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/why-i-started-writing-rust</guid>
      <pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>I spent two years telling people Rust was solving a problem I didn't have. Then I used it on a real project and changed my mind faster than I expected.</description>
    </item>
    <item>
      <title>What Makes Vulkan Different from Every Other Graphics API</title>
      <link>https://canberkpitirli.com/blog/vulkan-vs-other-graphics-apis</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/vulkan-vs-other-graphics-apis</guid>
      <pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>The first Vulkan hello triangle example I read was 700 lines. OpenGL's is 50. That gap isn't bloat. It's everything the driver was hiding from you.</description>
    </item>
    <item>
      <title>Behavior Trees in UE5: C++ Tasks, Decorators, and the Observer Abort Nobody Understands</title>
      <link>https://canberkpitirli.com/blog/ue5-behavior-trees-observer-aborts</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/ue5-behavior-trees-observer-aborts</guid>
      <pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate>
      <category>Game Dev</category>
      <description>Every UE5 AI tutorial stops right before the part that makes enemies feel alive: observer aborts. I shipped behavior tree AI in a commercial VR game, and this is the explanation I wish someone had given me.</description>
    </item>
    <item>
      <title>Occlusion Culling: How I Got 20% of the Frame Back in a Shipped VR Game</title>
      <link>https://canberkpitirli.com/blog/occlusion-culling-20-percent-vr</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/occlusion-culling-20-percent-vr</guid>
      <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>The fastest draw call is the one you never make. On The Stranger, a VR horror game, culling what the player provably couldn't see bought us back a fifth of the frame. Here's how that works and why VR makes it hard.</description>
    </item>
    <item>
      <title>Custom Memory Allocators in C++: Pool, Arena, and When to Use Each</title>
      <link>https://canberkpitirli.com/blog/custom-memory-allocators-cpp</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/custom-memory-allocators-cpp</guid>
      <pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>malloc isn't the bottleneck people think it is, until it is. Here's when you actually need to write your own allocator and which pattern fits which problem.</description>
    </item>
    <item>
      <title>How I Optimized a VR Frame Rate from 72fps to Stable 90</title>
      <link>https://canberkpitirli.com/blog/vr-frame-rate-72-to-90</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/vr-frame-rate-72-to-90</guid>
      <pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate>
      <category>Graphics</category>
      <description>In a flat game, dropping from 90fps to 70fps for a few frames is a minor visual hiccup. In VR, the same drop will make someone reach for a trash can. Here's how we closed that gap on The Stranger.</description>
    </item>
    <item>
      <title>HLSL From First Principles: What Shaders Actually Do</title>
      <link>https://canberkpitirli.com/blog/hlsl-from-first-principles</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/hlsl-from-first-principles</guid>
      <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
      <category>Tutorials</category>
      <description>Most HLSL tutorials hand you a working triangle and call it done. You get a result. You don't get an understanding. This is the explanation I wish I'd had before I learned shaders.</description>
    </item>
    <item>
      <title>Why I Write Tools Before I Write Games</title>
      <link>https://canberkpitirli.com/blog/tools-before-games</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/tools-before-games</guid>
      <pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate>
      <category>Engineering</category>
      <description>The first thing I do on any new game project is not build the game. It's build the tools I'll use to build the game. Three shipped titles later, I'm more convinced this is correct than when I started.</description>
    </item>
    <item>
      <title>What Winning a Game Dev Contest Actually Looks Like From the Inside</title>
      <link>https://canberkpitirli.com/blog/winning-best-game-contest</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/winning-best-game-contest</guid>
      <pubDate>Sat, 10 Aug 2024 00:00:00 GMT</pubDate>
      <category>Career</category>
      <description>The press release is the part you see. Clean headline, photo of the team, link to the trailer. Here's what the actual experience looked like from inside the studio.</description>
    </item>
    <item>
      <title>How I Shipped My First Udemy Course and What the First Month Looked Like</title>
      <link>https://canberkpitirli.com/blog/shipping-first-udemy-course</link>
      <guid isPermaLink="true">https://canberkpitirli.com/blog/shipping-first-udemy-course</guid>
      <pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate>
      <category>Career</category>
      <description>Plenty of guides will tell you how to make a Udemy course. None of them tell you what the first month actually feels like after you publish. Here's mine.</description>
    </item>
  </channel>
</rss>
