<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: ack_complete</title><link>https://news.ycombinator.com/user?id=ack_complete</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 29 Jul 2026 13:15:18 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=ack_complete" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by ack_complete in "SIMD for Collision"]]></title><description><![CDATA[
<p>For a while it looked like ARM was trying to call the ARMv8 vector instruction set ASIMD instead of NEON, but they seem to have thrown in the towel as the ARM Intrinsics Guide simply refers to Neon.</p>
]]></description><pubDate>Sun, 26 Jul 2026 18:53:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=49061169</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=49061169</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49061169</guid></item><item><title><![CDATA[New comment by ack_complete in "Software rendering in 500 lines of bare C++"]]></title><description><![CDATA[
<p>My own knowledge of GPU rasterization may be dated, but IIRC GPUs tend to rely on guard band clipping up to a guard band threshold before using geometric clipping. The guard band clipping involves rejecting 2D coarse rasterization blocks that are fully outside of the scissor rect. This is just a quick rectangle check, but the tradeoff is that a larger guard band means more GPU time lost in over-rasterization and potential higher precision requirements for rasterization values (which could be fixed point). Beyond the guard band, the triangles are clipped in floating point against the frustum clip planes.</p>
]]></description><pubDate>Thu, 23 Jul 2026 15:54:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=49023667</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=49023667</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49023667</guid></item><item><title><![CDATA[New comment by ack_complete in "Exapunks (2018)"]]></title><description><![CDATA[
<p>Opus Magnum is one of the most polished Zachtronics games IMO. The presentation is great.<p>Exapunks can be pretty tricky with the distributed nature, which share some similarities with TIS-100. Like Opus Magnum, though, there are no restrictive code size limits, meaning that some puzzles can be solved with brute force masses of code. It's not as bad as Shenzhen I/O where you have to deal both with a tiny MCU <i>and</i> routing.</p>
]]></description><pubDate>Thu, 02 Jul 2026 20:29:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48766945</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48766945</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48766945</guid></item><item><title><![CDATA[New comment by ack_complete in "FFmpeg 9.1's new AAC encoder"]]></title><description><![CDATA[
<p>Most games use the sound support that comes with their game engine or choice of sound system, so I don't think the lack of an STB version is an issue. Performance is more of a problem. Audiokinetic, the makers of the popular Wwise audio system, estimate that Opus takes ~3-5x the CPU of Vorbis:<p><a href="https://www.audiokinetic.com/en/community/blog/a-guide-for-choosing-the-right-codec/" rel="nofollow">https://www.audiokinetic.com/en/community/blog/a-guide-for-c...</a></p>
]]></description><pubDate>Wed, 01 Jul 2026 19:11:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48751750</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48751750</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48751750</guid></item><item><title><![CDATA[New comment by ack_complete in "Historical memory prices 1960-2026"]]></title><description><![CDATA[
<p>Some tasks simply require more RAM. Compiling big software, for instance, wants as many CPU cores as it can get, and each compiler instance needs some amount of RAM to run efficiently. It's not unusual for a 32-core build to need 32-64GB of RAM to run at full speed. Work on a smaller program, though, and 16GB is absolutely fine.</p>
]]></description><pubDate>Mon, 29 Jun 2026 15:49:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=48720855</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48720855</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48720855</guid></item><item><title><![CDATA[New comment by ack_complete in "Computed goto for efficient dispatch tables (2012)"]]></title><description><![CDATA[
<p>MSVC can do this for x86 if the cases are densely packed and the default is blocked:
<a href="https://gcc.godbolt.org/z/GPo9fMx8G" rel="nofollow">https://gcc.godbolt.org/z/GPo9fMx8G</a><p>However, this optimization is less effective on modern CPUs with more powerful indirect predictors using global history.</p>
]]></description><pubDate>Sat, 20 Jun 2026 20:24:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48612663</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48612663</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48612663</guid></item><item><title><![CDATA[New comment by ack_complete in "The time the x86 emulator team found code so bad they fixed it during emulation"]]></title><description><![CDATA[
<p>Doesn't require any special flags, just hitting optimizer limits can do it with MSVC.<p><a href="https://www.reddit.com/r/cpp/comments/1i36ahd/is_this_an_msvc_bug_or_am_i_doing_something_wrong/" rel="nofollow">https://www.reddit.com/r/cpp/comments/1i36ahd/is_this_an_msv...</a></p>
]]></description><pubDate>Tue, 16 Jun 2026 15:37:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48556951</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48556951</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48556951</guid></item><item><title><![CDATA[New comment by ack_complete in "Win16 Memory Management"]]></title><description><![CDATA[
<p>Some of this was automatically handled by the compiler and wouldn't have been an issue. Current x86-64 ABIs, for instance, require function entry to use specific forms annotated by metadata to support stack walking to support exception handling. Like the far entry here, this is invisible to most programmers -- the compiler does it for you.<p>Similarly, while locking and unlocking memory blocks is no longer generally a concern, most programs still deal with files, and graphics programs still have to call map/unmap functions to access graphics data. All the same tools apply -- helper functions/libraries, RAII, and leak/sanitizer tools to dynamically detect usage errors.</p>
]]></description><pubDate>Sun, 07 Jun 2026 18:01:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48437181</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48437181</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48437181</guid></item><item><title><![CDATA[New comment by ack_complete in "Should you normalize RGB values by 255 or 256?"]]></title><description><![CDATA[
<p>There is an analogous situation in graphics with signed normalized formats. The solution there is that the R16_SNORM format maps -1 to +1 as [-32767, 32767] with -32768 being a special value (not normally emitted, and mostly but not always interpreted as -32767). Some audio storage formats seem to use this mapping too.</p>
]]></description><pubDate>Mon, 01 Jun 2026 23:26:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48363910</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48363910</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48363910</guid></item><item><title><![CDATA[New comment by ack_complete in "How do I inform Windows that I'm writing a binary file?"]]></title><description><![CDATA[
<p>It's both. Originally Visual C++ binaries built for DLL-based C runtime relied on MSVCRT.DLL and that was installed by the redist. Starting with Visual Studio .NET 2002, separate CRT DLLs starting with MSVCR70.DLL were used. MSVCRT.DLL is now part of Windows to support parts of the OS itself and for compatibility with programs that still use it. I think some versions of MinGW also use MSVCRT.<p>Current versions of the OS ship with functions in MSVCRT.DLL that weren't in the last VC6 version, such as the updated C++ exception handler (__CxxFrameHandler4). AFAIK, there is no redistributable version of it, it's unique to the OS.</p>
]]></description><pubDate>Thu, 07 May 2026 02:48:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=48044853</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=48044853</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48044853</guid></item><item><title><![CDATA[New comment by ack_complete in "Integer Overflow Checking Cost"]]></title><description><![CDATA[
<p>That's with a simple data operation and using a recent x86 vector ISA (AVX-512) that is only available on some systems, notably excluding any current Intel desktop CPU.<p>The real killer isn't the data operations, though, it's if the overflow checks interfere with converting the loop logic or data addressing to vectorizable form. Indexing with 32-bit signed int vs. unsigned int on a 64-bit platform in C is a classic case -- with unsigned the compiler cannot assume that addressing offsets don't wrap, which then prevents coalescing data accesses into vector loads and stores.</p>
]]></description><pubDate>Sat, 02 May 2026 18:24:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47988982</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47988982</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47988982</guid></item><item><title><![CDATA[New comment by ack_complete in "You can beat the binary search"]]></title><description><![CDATA[
<p>Note that CPUs have also gotten dramatically wider in both execution width and vector capability since you were a teenager. The increased throughput shifts the balance more toward being able to burn operations to reduce dependency chains. It's possible for your idea to have been both non-viable on the CPUs at the time and more viable on CPUs now.</p>
]]></description><pubDate>Thu, 30 Apr 2026 15:44:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=47964216</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47964216</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47964216</guid></item><item><title><![CDATA[New comment by ack_complete in "Windows Server 2025 Runs Better on ARM"]]></title><description><![CDATA[
<p>Two issues.<p>First, regarding application compatibility: the heap was already changed once prior to the segment heap. The Low Fragmentation Heap (LFH) was added in XP and made default in Vista, with applications no longer having to opt into it:<p><a href="https://learn.microsoft.com/en-us/windows/win32/memory/low-fragmentation-heap" rel="nofollow">https://learn.microsoft.com/en-us/windows/win32/memory/low-f...</a><p>Second, the segment heap has different tradeoffs that make it not a guaranteed win to swap in, it trades off performance for working set:<p><a href="https://issues.chromium.org/issues/40138716" rel="nofollow">https://issues.chromium.org/issues/40138716</a></p>
]]></description><pubDate>Wed, 22 Apr 2026 15:35:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47865112</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47865112</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47865112</guid></item><item><title><![CDATA[New comment by ack_complete in "Writing string.h functions using string instructions in asm x86-64 (2025)"]]></title><description><![CDATA[
<p>The REP MOVS series of instructions have an interesting history due to the advantages and disadvantages of microcode and its shifting performance relative to manual code with each CPU generation. It has long been great for aligned large copies due to the microcode having access to cache-wide copies, but until recently struggled with small copies. Apparently, one of the reasons is a lack of branch prediction in microcode:<p><a href="https://stackoverflow.com/questions/33902068/what-setup-does-rep-do" rel="nofollow">https://stackoverflow.com/questions/33902068/what-setup-does...</a><p>Non-temporal stores are tricky performance wise. They can be dramatically faster than normal stores (~3x), they may be faster on some generations of CPUs than others, they may be slower if subsequent code needs the destination in the CPU cache, and even for GPUs they may not be ideal if an iGPU is sharing part of the cache hierarchy with the CPU. But the worst issue is that occasionally a specific CPU will have some random pathological behavior with them. IIRC, masked non-temporal stores were horrifically slow on some AMD APUs, on the order of hundreds to thousands of cycles per instruction. I find it hard to recommend them much anymore.</p>
]]></description><pubDate>Tue, 21 Apr 2026 02:25:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=47843801</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47843801</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47843801</guid></item><item><title><![CDATA[New comment by ack_complete in "It's OK to compare floating-points for equality"]]></title><description><![CDATA[
<p>Yeah, that's effectively quantization, which will not work for general tolerance checks where you'd convert float similarity to int similarity.<p>There are cases where the quantization method is useful, hashing/binning floats being an example. Standard similarity checks don't work there because of lack of transitivity. But that's fundamentally a different operation than is-similar.</p>
]]></description><pubDate>Sun, 19 Apr 2026 02:34:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=47821357</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47821357</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47821357</guid></item><item><title><![CDATA[New comment by ack_complete in "It's OK to compare floating-points for equality"]]></title><description><![CDATA[
<p>This case actually works because for finite numbers of a given sign, the integer bit representations are monotonic with the value due to the placement of the exponent and mantissa fields and the implicit mantissa bit. For instance, 1.0 in IEEE float is 0x3F800000, and the next immediate representable value below it 1.0-e is 0x3F7FFFFF.<p>Signed zero and the sign-magnitude representation is more of an issue, but can be resolved by XORing the sign bit into the mantissa and exponent fields, flipping the negative range. This places -0 adjacent to 0 which is typically enough, and can be fixed up for minimal additional cost (another subtract).</p>
]]></description><pubDate>Sat, 18 Apr 2026 19:17:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47818678</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47818678</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47818678</guid></item><item><title><![CDATA[New comment by ack_complete in "Microsoft hasn't had a coherent GUI strategy since Petzold"]]></title><description><![CDATA[
<p>One significant difference is that Metro/UWP requires signing for pretty much everything. Without signing you can't have package identity, and without package identity, you can't even use the UI system. Furthermore, it requires a paid cert, which is expensive and requires publicly divulging your identity. I have major problems with this as it opens developers up to harassment. .NET at least allowed self-signed certs.<p>It's true that there is no great answer for how to add capabilities and sandboxing after the fact. But what Windows did was build an incredibly restrictive sandbox and then tell everyone who couldn't accommodate even one of the restrictions was "sucks to be you". The result was that developers, when confronted with "all or nothing" for Metro-style apps, were forced to choose nothing. It was also not a good look that Microsoft's own flagship applications like Visual Studio and Office did not show any progress toward adopting UWP, and in the latter case, was specifically exempted from the Windows RT restrictions to continue using Win32 on that platform.<p>If there had been a better strategy for easing in UWP technology, we might have seen better progress on adoption of Windows Runtime APIs and capabilities so new programs could gradually move toward the new technologies and away from HWNDs. Unfortunately, the technical barriers that were put in place between Win32 and UWP are so large that progress toward breaking them down in the Windows App SDK has been slow.</p>
]]></description><pubDate>Tue, 07 Apr 2026 01:20:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47669596</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47669596</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47669596</guid></item><item><title><![CDATA[New comment by ack_complete in "Microsoft hasn't had a coherent GUI strategy since Petzold"]]></title><description><![CDATA[
<p>Eh, WinForms did a lot to make Win32 UI accessible and usable -- especially layout and easy customization -- but I have to differ on the cross-language story. It was great, IF you were making primarily a C# program that happened to use some C/C++ components.<p>From the native code side, it was not so great. The .NET 2.0 CLR had very poor support for hosting from the native side and really wanted you to make a program that was .NET first, it didn't work well if you wanted something like primarily a C++ program that hosted a C# UI in the same process. Reverse P/Invoke via native exports wasn't exposed, so creating DLLs for consumption by non-.NET programs was difficult. Mixed mode debugging was and still is painful, with the debugger being glacially slow at some operations like OutputDebugString() processing and blocking some native features like data breakpoints, and the CLR eating access violation exceptions from native code so they couldn't be debugged properly. Build-mode wise, we had to ban C++/CLI assemblies depending on C# assemblies because the C# project system didn't handle incremental builds properly and forced the dependent C++ assembly to rebuild all the time.<p>These issues still largely exist and are an issue with WPF. It's a great UI framework, but it's unusable unless your front end is primarily a C# program.</p>
]]></description><pubDate>Mon, 06 Apr 2026 19:22:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47665646</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47665646</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47665646</guid></item><item><title><![CDATA[New comment by ack_complete in "Microsoft hasn't had a coherent GUI strategy since Petzold"]]></title><description><![CDATA[
<p>WPF originally had two major rendering issues. One was the lack of pixel snapping support, and another was gamma correction issues during text rendering, particularly for light text on a dark background (due to an alpha correction approximation, IIRC). The two combined led to blurry text in WPF applications.<p>These were finally improved for WPF 4, since Visual Studio 2010 switched to it and had a near riot in the betas due to the poor rendering in the text editor.</p>
]]></description><pubDate>Mon, 06 Apr 2026 15:57:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=47662604</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47662604</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47662604</guid></item><item><title><![CDATA[New comment by ack_complete in "Microsoft hasn't had a coherent GUI strategy since Petzold"]]></title><description><![CDATA[
<p>The main reason Win32 can't handle automatic background suspension or low-power push notifications is simply that those features haven't been exposed to it. There's nothing preventing a Win32 program from receiving those types of notifications and then being force-ended by the OS if it doesn't respond in time.<p>When I first started porting programs to Windows ARM64, I didn't have an ARM64 device and had to test in QEMU. It ran extremely slowly, probably 1/50th of real time. All UWP programs like Calculator ran like a slug. But which programs still ran reasonably? Classic WinDbg and Task Manager. Two programs that were still plain Win32.<p>There <i>are</i> significant issues with Win32, namely its lack of a permissions and isolation and lack of hardware acceleration in the old windowing UI (User/GDI). But the idea that Win32 is inherently power inefficient is, IMO, just BS. Its roots go back to CPUs that were orders of magnitude slower than modern CPUs and there is nothing difficult about making a Win32 program that idles at 0% CPU when not in use.</p>
]]></description><pubDate>Mon, 06 Apr 2026 15:39:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47662337</link><dc:creator>ack_complete</dc:creator><comments>https://news.ycombinator.com/item?id=47662337</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47662337</guid></item></channel></rss>