home page

Welcome to my blog.


In one of my previous articles, I discussed the design and implementation of the batching system in my fork of SFML.

That system works well, but it requires users to manually create a batch, add drawables to it, and then draw the batch onto a render target. While effective, this manual approach begs the question:

Wouldn’t it be nice if drawables were automatically batched, whenever possible?

... read more


I recently released BubbleByte on Steam, my second commercial game built with my fork of SFML.

It’s an incremental/clicker/idle game where – eventually – the player will see thousands upon thousands of particles on screen simultaneously.

Even with a basic AoS (Array of Structures) layout, the game’s performance is great thanks to the draw batching system. However, I began wondering how much performance I might be leaving on the table by not adopting a SoA (Structure of Arrays) layout. Let’s figure that out in this article!

... read more


Welcome back, SFML enthusiasts! This article is a follow-up to my previous deep dive into my fork of SFML.

If you want to know how I managed to draw 500k sf::Sprite objects at over ~60FPS compared to upstream’s ~3FPS, keep on reading!

Here, we’ll explore two new significant features in my fork:

... read more


In November 2021, motivated by a desire to contribute to the growth and modernization of a library close to my heart1, I joined the SFML team2 after volunteering to lead modernization efforts3.

Over the past few years, significant time and resources have been invested in the 3.x branch, targeting C++17 and modernizing both SFML’s implementation and API.

I greatly appreciate the contributions of everyone involved in the project. However, I felt that a different approach would better align with my vision, which is why I decided to create my own fork: VRSFML.

... read more


By now, it should (hopefully) be common knowledge that the term “zero cost abstraction” is a lie. To be fair, it’s more of a misnomer – had the term been “abstraction likely to result in zero runtime overhead after optimizations” then it would have been much more honest, but I can see why that didn’t fly…

Most C++ developers tend to accept the fact that “zero cost abstractions” provide zero runtime overhead only with optimizations enabled, and that they have a negative impact on compilation speed. The same developers tend to believe that the benefits of such abstractions are so valuable that having your program perform poorly in debug mode (i.e. without optimizations enabled) and compile more slowly is worth it.

I used to be one of them.

... read more


It felt wrong to not participate in the Wordle craze, and what better way of doing so than by creating a purely compile-time version of the game in C++20? I proudly present to you… Wordlexpr!

(You can play Wordlexpr on Compiler Explorer.)

Carry on reading to understand the magic behind it!

... read more


A few months ago, I finished implementing the replay and secure leaderboard system for my game Open Hexagon, and it has worked very well so far. I’ve used a few interesting techniques and tricks to (1) achieve deterministic gameplay, (2) prevent cheating by slowing down time, and (3) prevent cheating by modifying game files which I am going to talk about in this post.

If you want to know more information about the replay system and the server/client implementation, check out the two previous devlogs here and here.

At the end of the article, I’ll also share some major milestones I’ve reached this year.

... read more


RSS Feed