<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: exDM69</title><link>https://news.ycombinator.com/user?id=exDM69</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 22 May 2026 01:11:53 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=exDM69" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by exDM69 in "How I leared what a decoupling capacitor is for, the hard way"]]></title><description><![CDATA[
<p>Slightly related note, the pictures in the articles show a handheld digital oscillscope. It's an Owon HDS200 series oscilloscope with signal generator and they are amazing and the lower frequency models are quite inexpensive.<p>I got myself one earlier this year and it does what it says on the tin. It can also be controlled from a computer via USB serial connection using a text based protocol (albeit poorly documented and a bit buggy). I used some python scripts to program the signal generator and then capture some measurements from the scope to check the frequency responses of some analog electronics circuits for guitar.<p>There is a small community around, there are a few repos on GitHub for using them and also this very long eevblog thred.<p><a href="https://www.eevblog.com/forum/testgear/owon-hds-200-handheld-oscilloscope-w-builtin-dmmawg/" rel="nofollow">https://www.eevblog.com/forum/testgear/owon-hds-200-handheld...</a></p>
]]></description><pubDate>Tue, 28 Apr 2026 13:05:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=47934019</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47934019</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47934019</guid></item><item><title><![CDATA[New comment by exDM69 in "Ask HN: Any interesting niche hobbies?"]]></title><description><![CDATA[
<p>> You can play with sensors (acidity, humidity etc)<p>Can you share some useful sensors? Any good pH sensor that can work for some period of time without manual maintenance (cleaning the probes etc)?</p>
]]></description><pubDate>Thu, 09 Apr 2026 09:09:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=47701078</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47701078</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47701078</guid></item><item><title><![CDATA[New comment by exDM69 in "Ask HN: Any interesting niche hobbies?"]]></title><description><![CDATA[
<p>Great looking instruments.<p>I've built half a dozen similar box guitars, it's such a fun little thing to build.<p>Do I see a piezo disk under the bridge in the 3rd instrument? Do you use some kind of preamp with it?<p>I have been recently experimenting with different kinds of piezo pickups [0] and  preamp electronics for them. I've figured out a pretty nice JFET based circuit for the preamp and ordered tiny 13x13mm PCBs with tiny SMT components assembled and it works pretty well (but needs a second revision). They mount directly on the volume potentiometer and fit in a small space.<p>The one thing I haven't figured out yet is grounding the electronics. In a typical electric guitar you ground the electronics by touching the (grounded) strings, but that doesn't work very well (at all) with slide guitar when your left hand has got a bottle neck slide on it (made of glass or ceramic which is an insulator).<p>Drop a message below if you want to geek out more about home made guitars and/or related electronics. Depending on your location I could also send some preamp PCBs your way.<p>[0] <a href="https://hazeguitars.com/blog/piezo-pickups-evolve" rel="nofollow">https://hazeguitars.com/blog/piezo-pickups-evolve</a>  (not my site)</p>
]]></description><pubDate>Thu, 09 Apr 2026 08:26:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47700771</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47700771</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47700771</guid></item><item><title><![CDATA[New comment by exDM69 in "Bubble Sorted Amen Break"]]></title><description><![CDATA[
<p>That's a fun two minutes for any computer scientist drum and bass fan.</p>
]]></description><pubDate>Thu, 12 Mar 2026 17:32:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=47354374</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47354374</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47354374</guid></item><item><title><![CDATA[New comment by exDM69 in "An interactive intro to quadtrees"]]></title><description><![CDATA[
<p>I have shared the trick in this thread above.</p>
]]></description><pubDate>Sat, 28 Feb 2026 10:31:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=47193376</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47193376</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47193376</guid></item><item><title><![CDATA[New comment by exDM69 in "An interactive intro to quadtrees"]]></title><description><![CDATA[
<p>Good attempt, but it's simpler than that.<p>For each AABB, you take the morton code of the minimum and maximum and store them in the array.<p>But for sorting and searching, construct a sort key from the pair of morton codes so that the most significant bits are the common prefix of the two morton codes and the least significant bits are the "level" (length of common prefix in bits).<p>E.g. for a 3d octree with 64 bit keys, you'd have 1 unused bit, 57 = 19 * 3 bits of morton code prefix and 6 bits of level. A 2d quadtree with 32b keys would have 1 unused bit, 26 = 2 * 13 bits of prefix and 5 bits of level.<p>You could also store just the sort key, but I've stored both AABB morton codes so that I can reconstruct the quantized AABBs for culling.<p>When you sort by this key, you'll get a linear octree where the beginning of the array is all the AABBs that overlap the subdivision plane, then everything on the left side of the plane and the rest is right side of the plane. When traversing the tree, you need two searches per node to find the entries belonging to this node and to find the split point between the left and the right side.<p>Having the "level" in the least significant bits works as a tiebreaker in the sorting to ensure that entries closer to the root of the tree are in the beginning of the array.</p>
]]></description><pubDate>Sat, 28 Feb 2026 10:30:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=47193365</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47193365</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47193365</guid></item><item><title><![CDATA[New comment by exDM69 in "An interactive intro to quadtrees"]]></title><description><![CDATA[
<p>Nice and concise description of quadtrees implemented with classical pointer chasing data structures.<p>A faster and (arguably) simpler way to construct quad/octrees is using morton codes, sorting and searching with flat arrays [0]. It's also probably easier to implement.<p>The gist of it is that you quantize the coordinates, do bit interleaving to construct morton code and then sort. The sorting is using numerical keys so you can use a radix sort for O(n) complexity which is much faster on a GPU (but on single CPU core a comparison based sort will probably win if the array isn't huge).<p>Now everything on the top half of the space is in the beginning of the array and the bottom half is in the end of the array (assuming yxyxyxyx morton code bits). Each of those halves is then split left/right and then each level below that alternates between vertical and horizontal splits.<p>To find the split point in the array, look at the first and last entry of the (sub)array you're looking at, and look for the first differing bit with (first ^ last).leading_zeros(). Then binary search for the first entry where that bit is high.<p>To traverse the quad/octree, repeat this process with the two halves you found. This can be done without recursion in O(1) memory using a fixed size stack because you know the depth of the "recursion" is at most half the number of bits in the morton code.<p>If you used radix sorting for building the array, you can avoid the binary search if you store the histograms from the counting phase of the sorting. Storing the whole histogram may be too much, but just a few highest order bits can already help.<p>Although I've found experimentally that for small (less that 10000 objects) just  sorting and searching is faster if the whole array fits in L2 cache. On my 2015 laptop a single core can sort 10k objects with 64 bit keys in 1 millisecond. Traversing the tree for frustum culling is about 5x faster than just going through the entire array because a lot of geometry can be discarded very quickly.<p>With a good comparison based sort rebuilding the array after some changes is mighty fast because modern sorting algorithms are much faster for "almost sorted" inputs.<p>For range queries ("Find everything in the region" in the article), you can probably get better performance by using the BIGMIN/LITMAX method [1].<p>Now here's a brain teaser to delight your Friday: the article and the method I describe above is for storing points/centroids, but often you need to store axis aligned boxes instead (AABB). There is a very clever trick for this that I discovered independently but later found in some research papers. Can you come up with a (very) small change in the algorithm above to extend it to AABBs instead of centroids?<p>[0] Karras: Maximizing Parallelism in the Construction of BVHs,
Octrees, and k-d Trees - <a href="https://research.nvidia.com/sites/default/files/pubs/2012-06_Maximizing-Parallelism-in/karras2012hpg_paper.pdf" rel="nofollow">https://research.nvidia.com/sites/default/files/pubs/2012-06...</a>
[1] <a href="https://en.wikipedia.org/wiki/Z-order_curve#Use_with_one-dimensional_data_structures_for_range_searching" rel="nofollow">https://en.wikipedia.org/wiki/Z-order_curve#Use_with_one-dim...</a></p>
]]></description><pubDate>Fri, 27 Feb 2026 13:13:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=47180143</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47180143</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47180143</guid></item><item><title><![CDATA[New comment by exDM69 in "Minecraft Java is switching from OpenGL to Vulkan"]]></title><description><![CDATA[
<p>> notorious Vulkan shader compilation lag spikes.<p>Vulkan gives all the tools to avoid any "lag spikes" from shader compiling. In fact, causing them is much more difficult than OpenGL where they could happen in surprising places (and only on certain hardware).<p>The issue is two fold:
1. Some engines produce a lot of shader permutations. Some AAA titles can have 60000 different shaders compiled.
2. Some GPU rasterizer states (such as color blending) are implemented as shader epilogues.<p>In Vulkan 1.0 almost all of the pipeline state had to be pre-baked into a pipeline state object compiled ahead of time. This lead to a "shader permutation explosion" where different states need different pipelines.<p>This requires the game engine to either a) compile all the pipeline combinations ahead of time (slow loading time) or b) compile them as needed (lag spikes).<p>The core issue for this was solved years ago and now most of the pipeline states can be added to the command buffers ("dynamic states"). This solves the permutation explosion. But at the same time it opens the door for issue 2: some states (blending in particular) can cause a state-based recompile (like ye olde OpenGL days) at runtime.<p>The only solution to the second problem is not to use the dynamic states that trigger recompiling. That's basically only blending as far as I know. You can't even have dynamic blend state on all GPUs.<p>For maximum developer flexibility there's the shader object extension that allows mixing and matching shaders and pipeline states any way you want. This will cause state based recompiles at unpredictable times but it's an opt-in feature and easy to avoid if lag spikes are not wanted.<p>tl;dr: shader recompilation is easy to avoid in Vulkan but porting legacy engine code or art content may take you off the happy path.</p>
]]></description><pubDate>Thu, 19 Feb 2026 11:26:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47072673</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=47072673</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47072673</guid></item><item><title><![CDATA[New comment by exDM69 in "Simplifying Vulkan one subsystem at a time"]]></title><description><![CDATA[
<p>> or you leave performance on the floor<p>The dynamic rendering local read feature is for this. You can get tiler gpus working on the happy path without the need for verbose render passes.<p>But mobile driver support being what it is, it'll take time until it's widespread in consumer devices (which don't get driver updates).</p>
]]></description><pubDate>Wed, 11 Feb 2026 08:23:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=46972301</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46972301</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46972301</guid></item><item><title><![CDATA[New comment by exDM69 in "Simplifying Vulkan one subsystem at a time"]]></title><description><![CDATA[
<p>> look up the extension on vulkan.gpuinfo.org and see ... currently 0.3% of all devices support it.<p>Afaik the extension isn't even finalized yet and they are pre-releasing it to gather feedback.<p>And you can't use gpuinfo for assessing how widely available something is or isn't. The stats contain reports from old drivers too so the numbers you see are no indication of hardware support.<p>To assess how widely supported something is, you need to look at gpuinfo, sort by date or driver version and cross reference something like steam hardware survey.</p>
]]></description><pubDate>Wed, 11 Feb 2026 08:13:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=46972250</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46972250</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46972250</guid></item><item><title><![CDATA[New comment by exDM69 in "Simplifying Vulkan one subsystem at a time"]]></title><description><![CDATA[
<p>That's the right way to go for simple use cases and especially getting started on a new project.</p>
]]></description><pubDate>Tue, 10 Feb 2026 16:21:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=46962097</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46962097</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46962097</guid></item><item><title><![CDATA[New comment by exDM69 in "Simplifying Vulkan one subsystem at a time"]]></title><description><![CDATA[
<p>You can use descriptor heaps with existing bindless shaders if you configure the optional "root signature".<p>However it looks like it's simpler to change your shaders (if you can) to use the new GLSL/SPIR-V functionality (or Slang) and don't specify the root signature at all (it's complex and verbose).<p>Descriptor heaps really reduce the amount of setup code needed, with pipeline layouts gone you can drop like third of the code needed to get started.<p>Similar in magnitude to dynamic rendering.</p>
]]></description><pubDate>Tue, 10 Feb 2026 14:16:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=46959988</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46959988</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46959988</guid></item><item><title><![CDATA[New comment by exDM69 in "Iran's internet blackout may become permanent, with access for elites only"]]></title><description><![CDATA[
<p>The GPS jamming maps are based on commercial air traffic flying in the area.<p>While that gives some ideas of how widespread the jamming is, it won't give accurate information about the range (air traffic avoids areas with jamming) of the interference or any information from places where there is no commercial air traffic (war zones, etc).</p>
]]></description><pubDate>Mon, 26 Jan 2026 13:56:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=46765669</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46765669</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46765669</guid></item><item><title><![CDATA[New comment by exDM69 in "Iran's internet blackout may become permanent, with access for elites only"]]></title><description><![CDATA[
<p>Starlink was also blocked by radio frequency interference.<p>Granted that can't possibly cover the entire area of the country.</p>
]]></description><pubDate>Mon, 26 Jan 2026 13:34:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=46765429</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46765429</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46765429</guid></item><item><title><![CDATA[New comment by exDM69 in "An Experimental Approach to Printf in HLSL"]]></title><description><![CDATA[
<p>Using printf and debuggers are complementary.<p>Finding which pixel to debug, or just dumping some info from the pixel under mouse cursor (for example) is better done with a simple printf. Then you can pick up the offending pixel/vertex/mesh/compute in the debugger if you still need it.<p>You get both, a debugger and printf related tooling in Renderdoc and it's better than either of those alone.<p>I've been writing a lot of GPU code over the past few years (and the few decades before it) and shader printf has been a huge productivity booster.</p>
]]></description><pubDate>Mon, 12 Jan 2026 10:04:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=46586345</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46586345</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46586345</guid></item><item><title><![CDATA[New comment by exDM69 in "An Experimental Approach to Printf in HLSL"]]></title><description><![CDATA[
<p>Using printf in shaders is awesome, it makes a huge difference when writing and debugging shaders. Vulkan and GLSL (and Slang) have a usable printf out of the box, but HLSL and D3D do not.<p>Afaik the way it works in Vulkan is that all the string formatting is actually done on the CPU. The GPU writes only writes the data to buffers with structs based on the format string.<p>All the shader prints are captured by tools such as Renderdoc, so you can easily find the vertex or pixel that printed something and then replay the shader execution in a debugger.<p>I only wish that we would've had this 20 years ago, it would have saved me so much time, effort and frustration.</p>
]]></description><pubDate>Sun, 11 Jan 2026 09:23:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=46573932</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46573932</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46573932</guid></item><item><title><![CDATA[New comment by exDM69 in "Lessons from Hash Table Merging"]]></title><description><![CDATA[
<p>Maybe this would be a suitable application for "Fibonacci hashing" [0][1], which is a trick to assign a hash table bucket from a hash value. Instead of just taking the modulo with the hash table size, it first multiplies the hash with a constant value 2^64/phi where phi is the golden ratio, and then takes the modulo.<p>There may be better constants than 2^64/phi, perhaps some large prime number with roughly equal number of one and zero bits could also work.<p>This will prevent bucket collisions on hash table resizing that may lead to "accidentally quadratic" behavior [2], while not requiring rehashing with a different salt.<p>I didn't do detailed analysis on whether it helps on hash table merging too, but I think it would.<p>[0] <a href="https://probablydance.com/2018/06/16/fibonacci-hashing-the-optimization-that-the-world-forgot-or-a-better-alternative-to-integer-modulo/" rel="nofollow">https://probablydance.com/2018/06/16/fibonacci-hashing-the-o...</a>
[1] <a href="https://news.ycombinator.com/item?id=43677122">https://news.ycombinator.com/item?id=43677122</a>
[2] <a href="https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion" rel="nofollow">https://accidentallyquadratic.tumblr.com/post/153545455987/r...</a></p>
]]></description><pubDate>Thu, 08 Jan 2026 12:13:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46540163</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46540163</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46540163</guid></item><item><title><![CDATA[New comment by exDM69 in "Vector graphics on GPU"]]></title><description><![CDATA[
<p>> why is it not trivial to add a path stage as an alternative to the vertex stage?<p>Because paths, unlike triangles are not fixed size or have screen space locality. Paths consist of multiple contours of segments, typically cubic bezier curves and a winding rule.<p>You can't draw one segment out of a contour on the screen and continue to the next one, let alone do them in parallel. A vertical line segment on the left hand side going bottom to top of your screen will make every pixel to the right of it "inside" the path, but if there's another line segment going top to bottom somewhere the pixel and it's outside again.<p>You need to evaluate the winding rule for every curve segment on every pixel and sum it up.<p>By contrast, all the pixels inside the triangle are also inside the bounding box of the triangle and the inside/outside test for a pixel is trivially simple.<p>There are at least four popular approaches to GPU vector graphics:<p>1) Loop-Blinn: Use CPU to tessellate the path to triangles on the inside and on the edges of the paths. Use a special shader with some tricks to evaluate a bezier curve for the triangles on the edges.<p>2) Stencil then cover: For each line segment in a tessellated curve, draw a rectangle that extends to the left edge of the contour and use two sided stencil function to add +1 or -1 to the stencil buffer. Draw another rectangle on top of the whole path and set the stencil test to draw only where the stencil buffer is non-zero (or even/odd) according to the winding rule.<p>3) Draw a rectangle with a special shader that evaluates all the curves in a path, and use a spatial data structure to skip some. Useful for fonts and quadratic bezier curves, not full vector graphics. Much faster than the other methods for simple and small (pixel size) filled paths. Example: Lengyel's method / Slug library.<p>4) Compute based methods such as the one in this article or Raph Levien's work: use a grid based system with tessellated line segments to limit the number of curves that have to be evaluated per pixel.<p>Now this is only filling paths, which is the easy part. Stroking paths is much more difficult. Full SVG support has both and much more.<p>> In fact, you could likely use the geometry stage to create arbitrarily dense vertices based on path data passed to the shader without needing any new GPU features.<p>Geometry shaders are commonly used with stencil-then-cover to avoid a CPU preprocessing step.<p>But none of the GPU geometry stages (geometry, tessellation or mesh shaders) are powerful enough to deal with all the corner cases of tessellating vector graphics paths, self intersections, cusps, holes, degenerate curves etc. It's not a very parallel friendly problem.<p>> Why is this not done?<p>As I've described here: all of these ideas have been done with varying degrees of success.<p>> Is the CPU render still faster than these options?<p>No, the fastest methods are a combination of CPU preprocessing for the difficult geometry problems and GPU for blasting out the pixels.</p>
]]></description><pubDate>Wed, 07 Jan 2026 17:51:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=46529735</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46529735</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46529735</guid></item><item><title><![CDATA[New comment by exDM69 in "Vector graphics on GPU"]]></title><description><![CDATA[
<p>> NV_path_rendering solved this in 2011.<p>By no means is this a solved problem.<p>NV_path_rendering is an implementation of "stencil then cover" method with a lot of CPU preprocessing.<p>It's also only available on OpenGL, not on any other graphics API.<p>The STC method scales very badly with increasing resolutions as it is using a lot of fill rate and memory bandwidth.<p>It's mostly using GPU fixed function units (rasterizer and stencil test), leaving the "shader cores" practically idle.<p>There's a lot of room for improvement to get more performance and better GPU utilization.</p>
]]></description><pubDate>Wed, 07 Jan 2026 12:09:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=46525468</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46525468</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46525468</guid></item><item><title><![CDATA[New comment by exDM69 in "Rust's Block Pattern"]]></title><description><![CDATA[
<p>Yes, sadly this isn't a part of standard C or C++.<p>It is available as a language extension in Clang and GCC and widely used (e.g. by the Linux kernel).<p>Unfortunately it is not supported by the third major compiler out there so many projects can't or don't want to use it.</p>
]]></description><pubDate>Sat, 20 Dec 2025 10:33:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=46335098</link><dc:creator>exDM69</dc:creator><comments>https://news.ycombinator.com/item?id=46335098</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46335098</guid></item></channel></rss>