I tinkered with the sketch a little bit, and couldn't pinpoint a single place that drastically impacted performance. A couple ideas though: there canvas looks more or less equally dense, so the quadtree resembles just a plain grid. Also, the quadtree needs to jump through the Node to get to the particle, while collision check without quadtree just looks at a single array with particles, which is good for the cpu cache. quadtree with a cap of 2 spams a lot of sub arraylists which have to be garbage collected every frame. Number of comparisons for plain loop check (10 mil) is much more than through the quadtree (depends on cap) but quadtree instanciation each frame and querying are so much more expensive