tag:blogger.com,1999:blog-50865086199248687522023-11-22T17:41:55.550-06:00May Contain CodeWarning: this blog may contain code. Consult your developer if you feel dizzy, dazed, or confused.Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-5086508619924868752.post-77391035563168556192023-03-24T15:12:00.002-05:002023-05-31T09:47:30.742-05:00Downgrading to Windows 10 on ARM<p>Ever since Microsoft made x86-64 emulation exclusive to Windows 11 on ARM, they've been heavily pushing Windows 11 for all devices regardless of architecture. However, Windows 11 removed the ability to see window titles on the taskbar without using 3rd party tools, which is a dealbreaker for me due to the way my mind works while I am working at my PC. Clearly, I'm not the only person with a reason to prefer Windows 10, as I've seen many people online sticking to it as much as they can, including Surface Pro X users who are giving up x86-64 support in favor of Windows 10. As a developer, I need to make sure my software runs on the operating systems people are using, but it's getting more difficult as Microsoft is no longer selling Windows 10 licenses in their store, nor Windows 10 on ARM devices in general.<br /></p><p>In my previous post I talked about trying Windows 11 on ARM with the Lenovo ThinkPad X13s, and while it runs well, I just can't get past the lack of window titles on the taskbar. However, I also had no option to use Windows 10 on that device, as it came with Windows 11 preinstalled. My Lenovo Miix 630 runs Windows 10 on ARM and thankfully its Snapdragon 735 processor isn't supported by Windows 11, but I am scared to really use it given the scare I had with having to send it in for out of warranty repair. It's been my only Windows 10 on ARM device, and I feel uneasy about potentially losing it and being unable to test my software on Windows 10 on ARM.<br /></p><p>I do have the QC710 Snapdragon Developer Kit for Windows 10 on ARM, but I made the mistake of upgrading it to Windows 11, and its Snapdragon 7c processor really doesn't like Windows 11 very much. I also made the mistake of not downgrading it during the 10 day grace period. I tried a number of different and time-consuming incantations to try and downgrade it by alternative means, but nothing would work. The Windows 10 Media Creation Tool would get most of the way through the process and then give a cryptic error message. Running the setup program from a UUPDump ISO would actually reboot and try to install, then error out and revert the installation back to Windows 11. Creating a bootable USB from that ISO does boot into a Windows 10 setup screen, but I have never been able to get it to detect any mouse or keyboard input, leaving me trapped and unable to proceed. I tried injecting drivers and creating unattended setup files, but neither of those things seemed to affect the setup environment in any noticeable way. By the time I gave up on this route, Microsoft had stopped selling these devkits in favor of the Windows DevKit 2023, which comes with Windows 11 preinstalled. I do have one, but I am not willing to try and downgrade it to an OS it was never designed for. As far as I can tell, there is no way to downgrade a QC710 from Windows 11 to Windows 10 once you're past the 10 day post-upgrade grace period. If anyone finds a way to do so though, please do tell me!<br /></p><p>I was feeling quite at a loss for months, when one day I saw an article pointing out a steep 50%+ discount on Surface Pro X devices. Checking the product page, it listed the OS as Windows 10. Perhaps they were trying to get rid of their remaining stock? For such a steep discount, and the chance to have Windows 10 on ARM in a more reliable manner, I bought it. It arrived early and when I opened it up... the box had Windows 11 written all over it. Despair. The product page had lied to me. I contacted the seller, but they told me the only option was to send it back for a refund.</p><p>I decided to open it up and try some incantations, just in case they would be more successful on the Surface Pro X than on the QC710. Indeed, it was preinstalled with Windows 11. Checking the <a href="https://support.microsoft.com/en-us/surface-recovery-image" rel="nofollow" target="_blank">Surface Recovery Image</a> site for my serial number, the only download option there was also Windows 11. From reading online, some people were able to find other serial codes that had Windows 10 downloads, but ran into issues of hardware/driver incompatibility, so I decided not to try that myself. Like with the QC710, I tried the Windows 10 Media Creation Tool to install Windows 10 on the Surface Pro X, and just like the QC710, it got a majority of the way through before failing with a cryptic error message. So, that option is out. Next, I tried using UUPDump to create a Windows 10 on ARM ISO, and then used Rufus to image it onto a USB drive. I was able to boot from it and get into the Windows 10 setup, but just like with the QC710, it would not respond to any form of user input - not mouse, keyboard, or touchscreen. I decided not to try injecting drivers this time given what a pain it was to do last time.</p><p>I was about ready to call it quits when I remembered one last thing to try - I could open the ISO file in Explorer and run the Setup executable within. This is very similar to the Media Creation Tool, and it didn't work on the QC710, so I wasn't expecting it to work here, but surprisingly, it actually did! It successfully installed Windows 10 on my Surface Pro X. From there, I was able to buy the upgrade from Home to Pro in the Microsoft Store without issue. It is activated and working properly as best I can tell, though I haven't tried using all the hardware like Wi-Fi and Cellular yet since I'm using a USB-C Ethernet adapter for internet. (Update: I have now confirmed that Wi-Fi and Cellular are working well too.) It also didn't automatically install the special Surface-related apps, but I can live without those. (Update: I was able to just install them via the Microsoft Store.) I now have the device configured to stay on Windows 10, and I have the Windows 11 recovery image downloaded too just in case I ever need it.</p><p>So, it seems it is possible to downgrade to Windows 10 on ARM without the built-in Go Back option, it's just very situational and has to be drone through somewhat unofficial means, but it works. I would not recommend doing this on a device that has never shipped with Windows 10 though, as there's unlikely to be proper driver support. The Surface Pro X originally shipped with Windows 10 before Microsoft started producing models with Windows 11 preinstalled, so that's the only reason I thought this could work. The QC710 results had me skeptical, but here we are, mission success. I can now validate my software on Windows 10 on ARM on two different devices with two different processors! To those of you out there still sticking to Windows 10 on ARM, keep fighting the good fight for getting ARM64 native versions of apps and games. I'm doing my part on the development side.</p><p>As for my personal desktop PC, I will upgrade it to a newer Windows version if Windows 10 security updates end or if Microsoft gives us back window titles on the taskbar as a built-in feature. As much as I hate only seeing app icons or having to install 3rd party tools, I don't want to risk missing out on important security updates. You, too, should avoid using software that is no longer receiving security updates. Windows 10's days are numbered, and someday, we will all have to move on from it, either to a future Windows version, or to Linux.<br /></p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-91019659039363237462022-08-21T17:36:00.016-05:002022-10-24T14:32:08.582-05:00Finally Trying Windows 11 on ARM<p>I've long enjoyed my Lenovo Miix 630, a Windows 10 on ARM device with a Snapdragon 835. Microsoft <a href="https://docs.microsoft.com/en-us/windows-hardware/design/minimum/windows-processor-requirements#windows-client-edition-processors" target="_blank">decided not to support that CPU for Windows 11</a>, so I got to keep Windows 10 on it just as I like. However, Microsoft introduced some bug with storport.sys that resulted in it bluescreening at bootup repeatedly, and despite multiple attempts to wipe and reinstall, the issue persisted. I ended up sending it in for out-of-warranty repair, during which time <a href="https://blogs.windows.com/windows-insider/2022/08/15/releasing-windows-10-build-19044-1947-to-release-preview-channel/" target="_blank">Microsoft fixed the bug</a> of course.</p><p>While waiting for Lenovo to fix my device, I started getting antsy. While I had the QC710 to keep me company, its Snapdragon 7c processor was far too sluggish for my liking, and I had upgraded it from Windows 10 to Windows 11. Project Volterra is looming on the horizon, but still not out yet (UPDATE 2022-10-24: <a href="https://blogs.windows.com/windowsdeveloper/2022/10/24/available-today-windows-dev-kit-2023-aka-project-volterra/" target="_blank">Project Volterra is released!</a>). I had been keeping my eye on the new Lenovo ThinkPad X13s for months, watching review videos and reading articles about it. It was quite tantalizing since it supports up to 32 GB of RAM and sports the new Snapdragon 8cx Gen 3, but it runs Windows 11 and the only skew with 32 GB RAM doesn't come with a SIM card slot. Those things held me back for a good long while, but a week without my Miix 630 wore me down, and I finally bought the ThinkPad X13s 32 GB RAM model.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUyLNmpRxJmq4Q387MhrGNitW-6dgQ9XtyOsMiZZmWxAKa74dpbShEg2Ckh9BxIYxDTL8QramiVUX_BbZ39ZhSu-PhkjUuu3meDzo_ZVJVMP7O7Mx3RheaUHfmLs_i1qT7xb59HzBAMX36XVSToDbIGymvBR06HFoKFLRZpq_0Et0nr2949dlRmmpL3A/s705/LenovoThinkPadX13s.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Lenovo ThinkPad X13s with the screen displaying the logo for the Snapdragon 8cx Gen 3 processor" border="0" data-original-height="557" data-original-width="705" height="506" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUyLNmpRxJmq4Q387MhrGNitW-6dgQ9XtyOsMiZZmWxAKa74dpbShEg2Ckh9BxIYxDTL8QramiVUX_BbZ39ZhSu-PhkjUuu3meDzo_ZVJVMP7O7Mx3RheaUHfmLs_i1qT7xb59HzBAMX36XVSToDbIGymvBR06HFoKFLRZpq_0Et0nr2949dlRmmpL3A/w640-h506/LenovoThinkPadX13s.png" title="Image stolen from Lenovo's product listing" width="640" /></a></div><p></p><p>Both the new X13s and the repaired Miix 630 arrived on the same day. Lenovo just nuked and reinstalled the original ancient Windows 10 on ARM version on my Miix 630 and apparently forgot to bill me at all...? After getting it all updated again, it did at least work properly and no longer have the bluescreen issue with storport.sys thanks to Microsoft having finally fixed it, so that's good. I'd hate to lose my last remaining Windows 10 on ARM device.<br /></p><p>As for the ThinkPad X13s, I've had a lot of fun messing around with it despite the lack of window titles on the taskbar (the main reason I dislike Windows 11). When I first got it, it had like 20 Windows Updates to install for various firmware updates and drivers. The first restart had it updating the UEFI BIOS. Clearly a lot of things are moving fast in the Windows on ARM ecosystem.</p><p>I'm happy to report, the X13s supports hardware virtualization! So I was able to use WSL2 and WSLg, though there's currently no GPU virtualization support that I'm aware of, so WSLg uses software rendering. I also got to try Hyper-V, but Windows 11 build 22000 doesn't support TPMs properly in Hyper-V, so the Windows 11 VHDXs you download from Microsoft will refuse to install updates. If you update to a newer insider preview build, then you can enable TPM support in Hyper-V, but I can't use those newer builds because they break external display support. (Yes, I did already submit feedback in the Feedback Hub. UPDATE: A 2022-09-28 firmware update fixed the external display issue for 22621)<br /></p><p>Speaking of external displays, from what I've been able to test, it supports up to 1920 by 1080 at 120 hertz, or 2160 by 1440 at 60 hertz, or 3840 by 2160 at 30 hertz. I typically use the 1440p option since I can't stand the 30 hertz refresh rate feeling so sluggish, but the 4k option might be good for movie watching. (UPDATE 2022-10-10: I tried a different HDMI adapter and got 3840 by
2160 at 60 hertz, so try different adapters and see what you get!) As mentioned above, the insider preview builds break external display support entirely, they can't even be detected, so I've been staying on 22000 for now. Hopefully they have it fixed and working by the time 22621 rolls out in a month or so. (UPDATE: A 2022-09-28 firmware update fixed the external display issue for 22621)</p><p>I've also tried the ARM64 version of Visual Studio 2022. There was an initial weird issue I had where a changing the build architecture dropdown in a C++/CX UWP project would freeze the IDE and cause weird system instability, but a Repair Install fixed that. It all works quite nicely now, it was able to build and run the massive C++ project from work in quite a decently short time (significantly faster than the QC710). The X13s would make a good development machine if I didn't have access to a desktop setup. I'll be using it for sure though to make sure any software I develop works well on ARM64 Windows. (This is also why I got the Miix 630 and QC710, in addition to just being really interested in RISC-based computing, and they make good personal devices too.)<br /></p><p>I also tried out gaming, since amusingly both Windows 10 on ARM and Windows 11 on ARM offer Gaming as an option during the setup experience and even offer to sell you Xbox Game Pass, but as usual the current reality (at least on 19044 and 22000) is somewhat disappointing. Games in the Microsoft Store which I know for a fact have native ARM64 versions (because I'm the one who built and uploaded them) show as incompatible for some inexplicable reason. Just a couple years ago they worked fine, so clearly Microsoft changed something. (UPDATE 2022-10-14: this now appears to be fixed, the games correctly show as compatible with ARM64 versions.) The Video Memory listing is also always shown as incompatible despite the X13s having 16 GB shared VRAM, probably because it's looking at the 1 MB dedicated VRAM instead.</p><p>The Xbox app also doesn't install by default and the Microsoft store shows it as incompatible, but you can still use the trick of downloading the installer from a web browser and watching the Microsoft store in the background show the progress of the install that it doesn't want to allow. (UPDATE 2022-10-14: The Xbox App now has an ARM64 version that can be installed from the store, but it only supports cloud gaming, and only works on Windows 11, not Windows 10.) Unfortunately, unlike when I last tested on the QC710, now on the X13s the Xbox app won't even show me my library of games, and the Microsoft store app no longer has a way to open the game page in the Xbox app. Game installs from the Xbox app have never worked for me on ARM, but now I can't even get to try because I literally can't navigate to any screen where the option would be presented!</p><p>However there is one game I own which doesn't require the Xbox app to install: Age of Empires Definitive Edition. It can be installed directly from the Microsoft Store app, and just like when I tested it on the QC710, it works here on the X13s, with better performance as well. It's only available as x64 though, so you can't play it on Windows 10 on ARM unless you use an expired Windows 10 Insider Preview build with x64 emulation support that later became Windows 11 exclusive. So, you can game on this device! Just... not with the Xbox app. As for Vulkan, there's still no news of when it will be supported. Only games using DirectX 11 or 12, or a very limited subset of OpenGL, will work, and this applies both to x86 and x64 games as well as native ARM and ARM64 and ARM64EC games.</p><p>Things start looking a lot better when you install Steam or EGS. Neither has any specific support for Windows on ARM, but they are both 32-bit x86 apps so they install and run fine on both Windows 10 on ARM and Windows 11 on ARM. Then it comes down to each individual game being either 32-bit x86 or 64-bit x86/x64. Duskers works fine on both 10 and 11 on ARM, and I did some more testing of various games on 11 since the X13s is more powerful.</p><p>In addition to Duskers, The Talos Principle also runs well. It complains that it can't detect the graphics hardware, but it works fine anyway. Obviously the Vulkan backend can't be tested right now, but I was able to test DirectX 11. I tried the beta DirectX 12 option briefly but it just made the game flicker between itself and whatever was behind it (e.g. Steam) so I stuck to DirectX 11 mode. Next I tried The Witness, on lowest settings it can't run at 1440p without being a choppy framerate, but it has a dynamic resolution option that lets it run more smoothly in exchange for looking like pixel art. Not ideal, but it works. I also tried Antichamber, but it only gets as far as showing the Unreal Engine logo and then stays on an endless black screen with the Steam overlay at the bottom right. The graphical options for Antichamber are a part of the actual gameplay so I couldn't tweak them. Lastly I tried Outer Wilds - I couldn't install the Microsoft Store version due to aforementioned issues, but the EGS version runs fine when you turn the settings down.</p><p>I haven't felt like trying Android app support with WSA yet, mainly due to the lack of hardware GPU acceleration seen in WSLg, and also because I don't know what apps to even try on the Amazon App Store and I don't want to mess with sideloading the Google Play Store. I might make another blog post for it later when hardware acceleration support is added for WSLg.</p><p>One last thing before I end off for now, I saw one review mention that the red dot in the i on the ThinkPad logo wasn't an LED. That review is lying. It blinks occasionally when the device is in sleep mode, and remains lit continuously when the device is on. Just wanted to get that out there.<br /></p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-9628801153189597322022-06-09T11:22:00.004-05:002022-06-25T10:23:59.266-05:00Project Volterra is NOT the first desktop Windows on ARM device<p> Microsoft recently announced Project Volterra, their second desktop Windows on ARM device after the QC710, seen in this video at 12:17:</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/iecqGBfv0To" width="320" youtube-src-id="iecqGBfv0To"></iframe></div><br /><p>However, a lot of online reporting is falsely claiming this to be Microsoft's first desktop Windows on ARM device. It seems everyone has already forgotten <a href="https://blog.maycontaincode.com/2021/11/WoA-devkit-QC710.html" target="_blank">the QC710</a>, which has still been available for months <a href="https://microsoft.com/en-us/d/ecs-liva-mini-box-qc710-desktop/8z247h1h3skp" target="_blank">sold directly from the Microsoft store</a>. Both the QC710 and Project Volterra are aimed at developers, but it seems like Project Volterra is getting a bigger marketing push from Microsoft, so perhaps most tech press just genuinely had not heard of the QC710 before.</p><p>My time with the QC710 has been fine, though I was unable to upgrade it from Home to Pro until 2022-06-24 and it still hasn't magically acquired hardware virtualization support, but it works well for its purpose of being a desktop WoA device for development and testing. I will probably get Project Volterra too, since it will likely have better specs than the QC710. There's not really much more to say at this point, I just wanted to set the record straight about which device was the first WoA desktop device from Microsoft. Also I am just really excited we're getting Visual Studio as a native ARM64 experience too.</p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-36687200413322614362021-11-22T21:59:00.028-06:002022-06-24T22:21:29.995-05:00Windows on ARM is off to a shaky start, but it is the future<p>After waiting and waiting, the Snapdragon Developer Kit for Windows on ARM that was promised to be released before the end of the summer was finally released on 2021-11-14. It's called the ECS LIVA Mini Box QC710 Desktop, and it can be purchased from the Microsoft store with a zero refunds policy, <a href="https://microsoft.com/en-us/d/ecs-liva-mini-box-qc710-desktop/8z247h1h3skp" target="_blank">in your browser</a> or <a href="ms-windows-store://pdp/?productid=8z247h1h3skp" target="_blank">in your Microsoft Store app</a>. We have known the specifications since the original announcement back in May, and based on the specs many people were expecting a low end price, but the actual price ended up being $219 USD before tax. This is a bit more expensive than what some were expecting, but it could be to combat supply chain shortages by discouraging ordinary people from buying it, thus leaving enough supply for developers. This is unfortunate as ideally Microsoft would want to jump start Windows on ARM development by getting these devkits into the hands of as many developers as possible, but at least we have it at all and it is indeed cheaper than other Windows on ARM devices.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9EfKtvZ6moMYxIvEBXJXFOL1IN6o4WRAuooeezXcI58laj71osVGuZ9wdstAqJ2jCWH7ExcYoSixIZETLd6jYOGRm9Wfq8MDUOQdOxjPbJTpIsus1mvGMjxfICM8cRaNpZrALbqhx7kT1/s9887/WoA-devkit_crop.jpg" style="display: block; padding: 1em 0px; text-align: center;"><img alt="Front cover of the box that the devkit came in, identifying itself as the QC710 Developer Kit" border="0" data-original-height="6855" data-original-width="9887" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9EfKtvZ6moMYxIvEBXJXFOL1IN6o4WRAuooeezXcI58laj71osVGuZ9wdstAqJ2jCWH7ExcYoSixIZETLd6jYOGRm9Wfq8MDUOQdOxjPbJTpIsus1mvGMjxfICM8cRaNpZrALbqhx7kT1/s600/WoA-devkit_crop.jpg" width="600" /></a></div>
<p>As soon as I had both the devkit and free time in my grasp, I set about recording my experience with setting it up. I made <a href="https://youtube.com/playlist?list=PLbXsvwtizmh6zh5I-Q2s_SXFUzFL8z9lX" target="_blank">a playlist on YouTube</a> where you can watch and skip through the various things I attempt to do. Something odd I discovered was that the devkit has 50 partitions, most of which are OEM partitions of just a few megabytes each. Contrast this to my Lenovo Miix 630 which only has three partitions. All but one of the mysterious OEM partitions was a RAW data partition, and the one that wasn't was a FAT filesystem that simply had a log file for the UEFI BIOS. Speaking of that, the UEFI BIOS is extremely simplistic with only 5 options, one of which dumps you into a command line interface with several dozen commands to choose from. I've decided not to mess with it too much out of fear of bricking it, but at least in theory there are options and ways to do things.</p>
<p>The original announcement of the devkit implied that there would be a lot of native ARM software preinstalled on the devkit, including LLVM. However, the unit I received had only a bare bones basic Windows 10 Home installation, with no customized software that I could find. I had thought the dozens of other partitions might have held it, but if so, it's too-well hidden from me. It seems that instead you will have to track down and download the ARM versions of the software that was supposed to be installed, and install it yourself. Perhaps this is for the best, given the extremely small storage space of 64 GB that has to support 50 partitions and a full Windows install before you can add any of your own stuff.</p>
<p>Another curiousity of mine was display output support. When connected to a 4k60hz display, the highest output resolution seems to be 2560x1440 at just a hair under 60fps as the only framerate option. When connected to a 1080p144hz display, you have to lower the resolution below 1080p to get the highest framerate option of just a hair under 75hz, but there were other framerate options too. I settled with the 1440p setup for most of my testing, so that the YouTube videos could be nice and high resolution. (This of course resulted in them taking several days to fully process correctly.)</p>
<p>I could have discovered in advance from the specifications, but the devkit doesn't support hardware virtualization at all. It started with Windows 10 Home and can be upgraded to Windows 11, but it can't run Hyper-V or WSL2, which means you can't use WSLg to test Linux ARM graphical apps. This was a rather disappointing realization for me. However, since it can run Windows 11, it can be used to test 64-bit x86 app emulation as well as the ARM64EC architecture. It's worth noting that Microsoft officially confirmed that Windows 10 is no longer getting 64-bit x86 emulation support despite it being in insider preview builds, that turned into a Windows 11 exclusive along with WSLg.</p>
<p>Here's a table showing a comparison of what can and can't be tested among the devices I am aware of:</p>
<style>
th+th
{
border-left: 1px solid rgba(0,0,0,0.1);
}
td
{
border: 1px solid rgba(0,0,0,0.1);
}
th, td
{
text-align: center;
padding: 0 2px;
}
td.yes
{
background-color: rgba(0,127,0,0.2);
}
td.no
{
background-color: rgba(127,0,0,0.2);
}
</style>
<table>
<thead><tr><th>Ability</th><th>Lenovo Miix 630</th><th>ECS LIVA QC710</th><th>Surface Pro X</th></tr></thead>
<tbody>
<tr><td>Run Windows 10</td><td class="yes">Yes</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run WSL 1</td><td class="yes">Yes</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run 32-bit ARM</td><td class="yes">Yes</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run 64-bit ARM</td><td class="yes">Yes</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run 32-bit x86</td><td class="yes">Yes</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run Windows 11</td><td class="no">No</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run 64-bit x86</td><td class="no">No</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Run ARM64EC</td><td class="no">No</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
<tr><td>Hardware Virtualization</td><td class="no">No</td><td class="no">No</td><td class="yes">Yes</td></tr>
<tr><td>Run WSL 2</td><td class="no">No</td><td class="no">No</td><td class="yes">Yes</td></tr>
<tr><td>Run WSLg</td><td class="no">No</td><td class="no">No</td><td class="yes">Yes</td></tr>
</tbody>
</table>
<p>It's easy to see there are three "tiers" of support here, predicated on <a href="https://docs.microsoft.com/en-us/windows-hardware/design/minimum/supported/windows-11-supported-qualcomm-processors" target="_blank">Windows 11 processor requirements</a> and whether said processor supports hardware virtualization. At one point <a gref="https://sinclairinat0r.com/2020/02/04/running-hyper-v-in-windows-on-arm" target="_blank">Windows 10 on ARM was going to get hardware virtualization support</a>, but that seems to also have been absorbed into Windows 11 instead. Either way, this table should be helpful when considering whether to purchase the developer kit or to seek a more expensive option. Qualcomm lists <a href="https://www.qualcomm.com/products/mobile-computing/consumer/windows#windows-devices-for-consumers-" target="_blank">other Windows on ARM devices</a> that you can research as well, just be sure to check if they are on the Windows 11 list and if they have hardware virtualization support.</p>
<p>One major snag, however, is that the ability to upgrade from Home to Pro seems to be broken on the QC710 at the moment, both on Windows 10 and on Windows 11. When you go to the Activation settings and click the button to buy the upgrade, it launches <a href="ms-windows-store://WindowsUpgrade/?ocid=settings_activation_edition_upgrade" target="_blank">the Microsoft Store app</a>, and clicking the buy button there asks me to sign in and then after a successful sign in it just displays an error message. I have tried every remedy I could find online, including fully resetting the device with a Windows 11 cloud reset, which wipes and reinstalls everything cleanly from scratch, but it still doesn't work. However, opening that Microsoft Store app link on my Lenovo Miix 630 works just fine, and lets me get to a screen where I could in theory pay to upgrade from Pro to Pro for Workstations. I can get to the Pro for Workstations upgrade screen on the QC710 too but it is broken in the same way as the regular Pro upgrade. Whatever the issue is, it seems specific to the QC710. I submitted feedback about it in the Feedback Hub, so it will hopefully be fixed, but for now it's another disappointment. UPDATE 2022-06-24: <a href="https://youtu.be/PLz5v6AWS4M" target="_blank">I was finally able to upgrade it from Home to Pro</a>! They seem to have fixed whatever issue I was encountering at last.</p>
<p>Despite this shaky start, the future of Windows on ARM looks bright. I've seen news articles that Qualcomm wants to create chips to compete with the Apple M1, which will be a huge leap forward in performance for Windows on ARM. I've also seen news articles that MediaTek wants to make chips for Windows on ARM PCs. Then there are also news articles about a supposed secret exclusivity deal between Microsoft and Qualcomm that meant only Qualcomm chips could be used for Windows on ARM devices, but it's supposedly expiring soon, which could allow for MediaTek and others to license Windows on ARM. We may even be able to buy our own Windows on ARM licenses someday, and perhaps even run it legally on Apple M1 via bootcamp. In theory the Qualcomm exclusivity deal was the only thing stopping Microsoft from letting people throw money at them. It will be nice to be rid of the monopoly, and to see Qualcomm have to actually compete.</p>
<p>On a final amusing note, the Microsoft Store won't let you install the Xbox app on the QC710, but if you download and run the Xbox app installer from xbox.com, you can see that it just forces the Microsoft Store to install it anyway, even updating the download and install progress on the very same screen that claims it cannot be installed. And, it does work too, though you can only install games from the Microsoft Store app and not the Xbox app. Other 64-bit x86 apps can be installed from the Microsoft Store just fine, so it's unclear why just the Xbox app is in this half supported half not supported state. I'm sure with enough interest we'll see more games and gaming apps gain native ARM64 or ARM64EC support, and maybe then the Xbox app will be able to be installed without tricking the Microsoft Store app.</p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-78774038803852804952021-08-23T21:05:00.004-05:002021-11-14T17:59:31.539-06:00Down the Windows on ARM devkit rabbit hole<p>(UPDATE 2021-11-14: It's finally <a href="https://www.microsoft.com/en-us/d/ecs-liva-mini-box-qc710-desktop/8z247h1h3skp" target="_blank">available on the Microsoft Store</a>!)</p><p>Microsoft and Qualcomm recently teamed up to create a <a href="https://www.youtube.com/watch?v=LPGaQz-_VdY" target="_blank">Snapdragon Developer Kit</a> for Windows on ARM. I already have a WoA device, but it's an older processor that doesn't support hardware virtualization, and <a href="https://docs.microsoft.com/en-us/windows-hardware/design/minimum/supported/windows-11-supported-qualcomm-processors" target="_blank">might not even support Windows 11</a>, so I am excited to get my hands on this new devkit. It was announced first at Microsoft Build in this rather unusual presentation:</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/U4ja4nZnwh4" width="320" youtube-src-id="U4ja4nZnwh4"></iframe></div><p>At first, I didn't understand why it was so awkward, or why these two Microsoft employees seemed to simultaneously dislike each other and not care about each other. I was incredulous, laughing and naively wondering if Microsoft had really let some passive-aggressive beef between two engineers slip out like this. Then, I showed the video to someone else, and they pointed out that it was a parody of the comedy celebrity interview series Between Two Ferns. That's when things clicked, and I appreciated the presentation even more. The devkit is only announced and shown off at the very end of the presentation, but the parody is worth a watch in its entirety as it is well-done.</p><p>Amusing presentations aside, every news source I could find simply said that the devkit would be available "later this summer". Well, it's currently very late into the summer, but we do still have an entire month left before "summer" "ends" according to a quick search. My excitement is palpable though as it feels like this <a href="https://www.youtube.com/watch?v=ztV9Z1T04RE" target="_blank">summer never ends</a>. So, I've been searching every week to see if the devkit was released without me knowing about it, and so far nothing. But, I did find some interesting things!</p><p>Firstly, there's these official pages on Qualcomm's website:</p><p><a href="https://developer.qualcomm.com/hardware/windows-on-snapdragon/snapdragon-developer-kit" target="_blank">https://developer.qualcomm.com/hardware/windows-on-snapdragon/snapdragon-developer-kit</a></p><p><a href="https://developer.qualcomm.com/hardware/windows-on-snapdragon/developer-resources" target="_blank">https://developer.qualcomm.com/hardware/windows-on-snapdragon/developer-resources</a></p><p><a href="https://developer.qualcomm.com/blog/windows-arm-development-how-do-i-get-started-tools" target="_blank">https://developer.qualcomm.com/blog/windows-arm-development-how-do-i-get-started-tools</a></p><p>They don't really provide much more info, but they do have an option at the bottom of the page to sign up for the developer newsletter. This could be how I find out the release date! Sure enough, there's an option for Windows developers on the sign-up form. So, I signed up, and then waited. As luck would have it, I very soon received an email with more info about WoA!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiEX5aL7hfZs_Ii99VbgDsyU1GnobAUnTxE6CwTSf2XJBB26TxXOfEwXmQaU7hWcq4Gh5JggBuspcC_TFkB7pBK7TrkeAWc2KWokXwB7dyD_7-EqaFKKjv6003NMPKwDdyYj1ufFNjlJ4r/s5224/qualcomm-email.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Full email from Qualcomm with a blue button at the top labeled Game Developer Guides. I have added a red arrow further down that points to a mention of Windows on ARM64 as one of the tutorials." border="0" data-original-height="5224" data-original-width="1497" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiEX5aL7hfZs_Ii99VbgDsyU1GnobAUnTxE6CwTSf2XJBB26TxXOfEwXmQaU7hWcq4Gh5JggBuspcC_TFkB7pBK7TrkeAWc2KWokXwB7dyD_7-EqaFKKjv6003NMPKwDdyYj1ufFNjlJ4r/w184-h640/qualcomm-email.png" width="184" /></a></div><p>Awesome! Except... the links in the email just led to 404 pages. Hoping they'd fix the issue after a few days, I retreated back to searching for info every now and then. Recently, on one of my searches, I came across this video that had slightly more information than the Microsoft video did about the devkit:</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/31Ei6mOfkjg" width="320" youtube-src-id="31Ei6mOfkjg"></iframe></div><p>This reminded me to check the email again to see if the links were fixed. Sadly, they were not. Out of curiosity, I looked at the URL in the address bar to see if I could glean any useful info. The big button at the top of the email links to a .html page, but then it has a slash after that, and a query string. Surely it couldn't be that simple? Well, it was, as simply removing the slash fixed the URL and I got an actual webpage!! I am not sure how Qualcomm still hasn't fixed this, as it is their click tracker that redirects to this bad URL, but it should be easy for them to fix. Anyway, here's the working URL:</p><p><a href="https://developer.qualcomm.com/sites/default/files/docs/adreno-gpu/developer-guide/index.html" target="_blank">https://developer.qualcomm.com/sites/default/files/docs/adreno-gpu/developer-guide/index.html</a></p><p>Tada! Lots of goodies and useful information. I have no idea how you are supposed to find this documentation otherwise. Two entries in the sidebar caught my eye: Adreno SDK for Vulkan, and Windows on Arm64. I decided to check out the Vulkan stuff first to see if there was perhaps finally a Vulkan SDK for WoA. After some clicking I got to this page:</p><p><a href="https://developer.qualcomm.com/software/adreno-gpu-sdk/tools" target="_blank">https://developer.qualcomm.com/software/adreno-gpu-sdk/tools</a></p><p>Interesting! Two downloads look worthwhile, an "Adreno SDK v5.0 - Windows Installer" and an "Adreno SDK for Vulkan v1.05", totaling 371 and 115 megabytes respectively. I immediately opened both in new tabs, and then... got an Access Restricted message in each. Apparently I needed to create a Qualcomm Developer account in order to download these! Well, no matter, I'll use the same email I subscribed to the Developer Newsletter with. Sure enough, I got an account confirmation link, and I was able to proceed to a typical account creation form. Amusingly, clicking into the password field and then unfocusing it immediately shows all password requirements, and despite not having typed anything, it tells me I entered an invalid character, just to show me all the valid symbols. Pasting in a generated password from my password manager gets me through the sign up process and... wait. I have to wait, apparently.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioyP_nX5iVgBLsInKjsy3oKyPdpV4EEwDta4yMQgiXCpQTmT_jMAnUlsJBox2zC5s7F_LNu8h6t_neuWgWvddPZdY7s46mmEhuJ1PCh-14zlWrCYZbQHA7e4hUlsKqWFA_rcqNSbZihbIP/s927/qualcomm-signup.png" style="margin-left: 1em; margin-right: 1em;"><img alt="An in-page popup with a spinner, and text explaining that it might take a few minutes for the account to be created, and that the window must be kept open." border="0" data-original-height="821" data-original-width="927" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioyP_nX5iVgBLsInKjsy3oKyPdpV4EEwDta4yMQgiXCpQTmT_jMAnUlsJBox2zC5s7F_LNu8h6t_neuWgWvddPZdY7s46mmEhuJ1PCh-14zlWrCYZbQHA7e4hUlsKqWFA_rcqNSbZihbIP/w400-h354/qualcomm-signup.png" width="400" /></a></div><p>This takes a good minute, and I almost think it's stuck and I'll have to break open devtools to see which of my extensions conflicted with it, but then I get redirected to another page! Which just says my registration is still in progress. Uh, I already knew it was in progress? Well, I guess it's better than waiting even longer on the previous page and not knowing if something broke. Interestingly, it lists which "applications" I have access to, which include Qualcomm.com, Qualcomm Developer Network, CreatePoint, and Chipcode. I have no idea what those last two are. Also, it's saying I'll be given a Qualcomm ID... does this mean I'll need to replace my registration email with a different ID in my password manager in order to log in? Only one way to find out, I suppose.</p><p>While waiting for the email to arrive telling me that my account had finally been created, I decided to go back to the documentation from earlier and check the other link for Windows on Arm64. Immediately, I am surprised in a good way! A major game engine is listed as one of the tutorials for Windows on Arm64. This gives me hope that we will see some games get native ARM64 builds. I'm not sure if Steam has backend options for ARM64 yet like they do with x86-32 vs x86-64, but I expect we'll get it eventually.</p><p>But anyway, above the tutorial for that game engine is a more general tutorial, "<a href="https://developer.qualcomm.com/sites/default/files/docs/adreno-gpu/developer-guide/tutorials/windows/get_started_wos.html" target="_blank">Getting Started with Windows on Arm64 Development</a>". Looks like all the usual stuff I'd expect for setting up Visual Studio, though there is no mention of <a href="https://devblogs.microsoft.com/cppblog/arm64ec-support-in-visual-studio/" target="_blank">ARM64EC</a> from what I can tell. I suppose that makes sense, given that ARM64EC will <a href="https://blogs.windows.com/windowsdeveloper/2021/06/28/announcing-arm64ec-building-native-and-interoperable-apps-for-windows-11-on-arm/" target="_blank">only work on Windows 11</a>, whereas ARM64 will work on both Windows 10 and 11.</p><p>There is, however, interesting terminology in relation to the different types of cores within the processor. The high performance and high efficiency cores are referred to as "Gold" and "Silver" cores, respectively. There's also some good advice about memory barriers and Neon. Apparently Visual Studio supports Neon intrinsics, which I didn't know but I guess I should have assumed.</p><p>Back to my email, I got one! "You Qualcomm ID Registration has been approved" - uh, it was being scrutinized?? At this hour of the night? I sure hope not. The email also contains a password reset link for the password I literally just set in case I forgot it between now and then, and it contains my email address with the same casing as I entered it instead of lowercased. Hmm... I'm going to edit my password manager entry to match that case as well, just in case. My developer senses are tingling in a bad way.</p><p>Anyway, now back to downloading those SDKs! I click the Log In button from the Access Restricted page, use my password manager to fill the login info, and... excuse me?</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj_VrMncWROfAYACT1ZqDp4LcUENx2nGgGY-Js4hCokQbLifNMv1Wirp6Loo70cZu0tuqJVpqAXGRPy5duPnKvPqqlQVrmfMA2F3Rp1dyNkW1qbxwLBGoFQrE7akaLlIh4Mvyz5-VjiOHS/s2578/qualcomm-login.png" style="margin-left: 1em; margin-right: 1em;"><img alt="An absolutely terrifying screen with all sorts of warnings in varying fonts and sizes, asking me to retrieve a code from my email or bad things will happen." border="0" data-original-height="2578" data-original-width="1600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj_VrMncWROfAYACT1ZqDp4LcUENx2nGgGY-Js4hCokQbLifNMv1Wirp6Loo70cZu0tuqJVpqAXGRPy5duPnKvPqqlQVrmfMA2F3Rp1dyNkW1qbxwLBGoFQrE7akaLlIh4Mvyz5-VjiOHS/w398-h640/qualcomm-login.png" width="398" /></a></div><p>This is the most frightening login process I have ever experienced. My bank isn't even this arcane. Warning? Do not close this screen? Verification code? My account could be disabled? Make sure my transaction ID matches the one shown here? WTF are they guarding here? I mean, I appreciate having 2FA on by default, but this is such an abrasive implementation. Well, anyway, I got the code and submitted it, so now I should start downloading the SDK, right? It's sure taking a long time to load the next page, that could be the download, right?</p><p>NOPE! Time to "Complete Your Profile" on a webpage brilliantly titled "qualcomm22" according to the tab name.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh65otm5HrDq0yFw_Y7yBKcXpe_lx-IgkYwpa5wHQxjLxyBy5O5e33CEp5pEBCtFzbW0og2VJc-6Mg-FZP5QQrH2N_YScB0lUKateujbQgHdmO_6xSSBNx7oqh5hJrZyFLcBhb0l0z_XzJf/s5000/qualcomm22.png" style="margin-left: 1em; margin-right: 1em;"><img alt="A questionnaire asking about my interests as they relate to Qualcomm's offerings and how I found the developer program." border="0" data-original-height="5000" data-original-width="2560" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh65otm5HrDq0yFw_Y7yBKcXpe_lx-IgkYwpa5wHQxjLxyBy5O5e33CEp5pEBCtFzbW0og2VJc-6Mg-FZP5QQrH2N_YScB0lUKateujbQgHdmO_6xSSBNx7oqh5hJrZyFLcBhb0l0z_XzJf/w328-h640/qualcomm22.png" width="328" /></a></div><p>Should I even be sharing this screenshot? I mean, my account had to be "approved" and then I had to go through a risky sign-in process with a verification code just to get here. They really wanted to protect this from hackers. Or maybe they just really don't want people to even get this far. Anyway, I ticked some boxes and clicked Save, and waited another agonizing amount of time for the page to load.</p><p>Finally... Adreno GPU Product Kit License Agreement, or rather "PKLA PRODUCT KIT LICENSE AGREEMENT" in case ATM Machine and PIN Number weren't annoying enough. "YOU ARE ADVISED TO PRINT THIS AGREEMENT FOR YOUR RECORDS AND/OR SAVE IT TO YOUR COMPUTER." Alright, print to PDF, save to cloud storage, done. Right? Wrong. The entire first two pages of the PDF preview are taken up by nested links from the menu at the top of the page, with default CSS. The license agreement doesn't start until page 3, and it goes down to page 24. After that, there are two more pages of nested links from the footer, also without CSS, partially covered up by the Qualcomm logo in this horrific display:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi316a4ujGCtiKttm7FIAIu4Ru_eGmpL_VzMW5rZiMHzNE4L4OjSNtXi9nLJJVpXlNbCYZcGtidEIfO4tqGmLl8k14uT6FSRIgr2pwMSVJnEaaG8Xpy7A0F_K7GLDMPYqv_PzQ6uo-YmfCN/s1358/QualQualQualQualQualQual.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The bottom portion of a webpage printed as a PDF, with the formatting gone horribly wrong and the Qualcomm logo repeated dozens of times overtop of some text." border="0" data-original-height="1001" data-original-width="1358" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi316a4ujGCtiKttm7FIAIu4Ru_eGmpL_VzMW5rZiMHzNE4L4OjSNtXi9nLJJVpXlNbCYZcGtidEIfO4tqGmLl8k14uT6FSRIgr2pwMSVJnEaaG8Xpy7A0F_K7GLDMPYqv_PzQ6uo-YmfCN/w640-h472/QualQualQualQualQualQual.png" width="640" /></a></div><p>Well, I mean, it contains the entire license agreement I guess, so I'll just save it and get on with things without reading it fully, like you do. Time to scroll to the bottom, click accept, and... wait, is that a Decline button? Haha, it's not often you see those!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1rfZWjkbGgVlbjjNh2oH8JZv0QEmvvIzGFHK6V1UvyVj8ewY39ebunQI0JaBQ0r2qyKKQTu7cS4h2daYx7H3GipkPp1GXWsiKgDTsgSTh74Gz9zYLoH1ck1eyoXAKyXgmui2KqOo4gq8k/s1650/QualcomDecline.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The end of a license agreement, with separate decline and accept buttons." border="0" data-original-height="413" data-original-width="1650" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1rfZWjkbGgVlbjjNh2oH8JZv0QEmvvIzGFHK6V1UvyVj8ewY39ebunQI0JaBQ0r2qyKKQTu7cS4h2daYx7H3GipkPp1GXWsiKgDTsgSTh74Gz9zYLoH1ck1eyoXAKyXgmui2KqOo4gq8k/w640-h160/QualcomDecline.png" width="640" /></a></div><p>I am morbidly curious as to what that Decline button does, but given the prior threat of disabling my account, I'm not going to risk it tonight. I tick the box, click Accept, and finally I get redirected to download the zip file. Success! Well, for one download anyway. Oh, on the download page, there's an option to opt-in for updates to receive a notification when the file is updated.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDAYYoQnRB0ckJ4XxwzwvK957OLDJgUMVPVcPEXuHfN-XyJ8NzWuIFyJDbDBokaBFQ1pgvGvXZn6WKo51QISGzadm2yxlHt7oeSjxj0Uc_gw-B_xZ8iuwB756EHw4MQ3fRWkuPbk1de9GY/s1134/QualcommOptIn.png" style="margin-left: 1em; margin-right: 1em;"><img alt="A page informing me that the download has started, and giving an option to receive updates for when this file is changed." border="0" data-original-height="681" data-original-width="1134" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDAYYoQnRB0ckJ4XxwzwvK957OLDJgUMVPVcPEXuHfN-XyJ8NzWuIFyJDbDBokaBFQ1pgvGvXZn6WKo51QISGzadm2yxlHt7oeSjxj0Uc_gw-B_xZ8iuwB756EHw4MQ3fRWkuPbk1de9GY/w640-h384/QualcommOptIn.png" width="640" /></a></div><p>I assume that will notify me of new releases automatically? That's cool! So I click it and... oh. It just takes me to the developer newsletter signup. The one I got here from in the first place. Seriously?? You got my hopes up there! Well, I suppose the developer newsletters will still contain information about updates. Anyway, both downloads are done (and I didn't need to accept a second agreement), so it's time for me to experiment with these SDKs and see what's what.</p><p>I am most curious to find WoA binaries for Vulkan somewhere in these SDKs. The Vulkan SDK sadly only has Linux shared object files in 32 and 64 bit flavors (and presumably ARM in both cases), so let's try this Windows installer instead.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXv-JRaAV4imt95Tc262WLGMWxSSg3nEQdQlsdJ-1ONf4_FjdjkizwJN1RU6RgD5x91tf8iGqk3MrPZHFMWipemXUzuxj5Rdv1-T4Z74dpdP7VAElfNFX2PPfVOK0BivBe9MqXXt52Le-o/s288/QualcommAdrenoSdkInstaller.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The installer executable as shown in Windows Explorer dark theme." border="0" data-original-height="288" data-original-width="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXv-JRaAV4imt95Tc262WLGMWxSSg3nEQdQlsdJ-1ONf4_FjdjkizwJN1RU6RgD5x91tf8iGqk3MrPZHFMWipemXUzuxj5Rdv1-T4Z74dpdP7VAElfNFX2PPfVOK0BivBe9MqXXt52Le-o/s16000/QualcommAdrenoSdkInstaller.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwaIohkQVbv3YWHJ6B-mrwtS0B_p0wgXH7yJQ86iY7lHsv8wnJz4nMnVNISUcalNPWzKKPzdi197UkGnjJTI_vAjdzvRwuGvi6FRHTdxq0yLPkobMQQjtaiGD-8gGGWrGTIOmyjGCinYBg/s422/QualcommAdrenoSdkLicense.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The installer program showing a completely separate license agreement from the previous one." border="0" data-original-height="290" data-original-width="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwaIohkQVbv3YWHJ6B-mrwtS0B_p0wgXH7yJQ86iY7lHsv8wnJz4nMnVNISUcalNPWzKKPzdi197UkGnjJTI_vAjdzvRwuGvi6FRHTdxq0yLPkobMQQjtaiGD-8gGGWrGTIOmyjGCinYBg/s16000/QualcommAdrenoSdkLicense.png" /></a></div><p>It's the mythical DOUBLE LICENSE for a single software download! Two completely different licenses for the same piece of software! I guess I shall abide by both simultaneously despite reading neither. After all, I do not have an option to Decline this time, I can only Cancel the installer. Or would that Cancel the license agreement? I know I know, I'll get on with it. Out of curiosity I scrolled to the bottom just in case it would nag me for not doing that, and based on the very ending, I am apparently also making an agreement not just with Qualcomm, but also with ARM. As in, the company ARM. The one nVidia is trying to buy. I suppose it makes sense they'd both be in here. I just hope nVidia doesn't try inserting itself into the relationship we have going here between me, Qualcomm, and ARM. That'd be too many unread license agreements for me. Anyway, upon clicking Agree...</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3dDjJZYf_pqTQISK2SbI9lk3W4-6HsmWXZH51rWyFtpeH6dQ_tOH1-kPlpaaBcvCxuuBwmd2HdXtXlf8wkMR5SGWVVlk8AbGaIaKOJR7EITL8GwFjXxwnMaU08kkdeNM2cNvLvilutIi_/s422/QualcommAdrenoSdkPath.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The installer program showing the default install path as being on my desktop." border="0" data-original-height="290" data-original-width="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3dDjJZYf_pqTQISK2SbI9lk3W4-6HsmWXZH51rWyFtpeH6dQ_tOH1-kPlpaaBcvCxuuBwmd2HdXtXlf8wkMR5SGWVVlk8AbGaIaKOJR7EITL8GwFjXxwnMaU08kkdeNM2cNvLvilutIi_/s16000/QualcommAdrenoSdkPath.png" /></a></div><p>Excuse me? You want to install to my DESKTOP?? Well that just won't do. You see, I moved my Desktop folder into my cloud sync folder. I don't want to sync this entire SDK to the cloud. But also, even if I hadn't done that... who installs software to their Desktop directory?? This is utterly bizarre. The entire experience from start to finish has been bumpy and obtuse, but this is just pushing it. This has to be an intentional ploy to sabotage the WoA initiative. Well, you won't stop me! I'll go through the arduous and arcane task of selecting a different directory to install to. I've heard only a few people have ever had to do this in their lives, and only when they prefer to install to a different drive letter, if that's even presented as an option. In fact, let me just see which drive of mine has the most storage... er... wait, this can't be right. It says at the bottom there, just above the Cancel button, that the space required is 0.0KB... this is a 375 MB installer using an off-the-shelf installer software, how did they get this wrong? Hm... perhaps my sabotage theory can be reworked into an incompetence theory. Never attribute to malice, they say...</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7rdAdg4xFhhAXYkA00kpNolyw03MO8i5Jt25V3W4E973YRLuOxCnj6N9ChWfYiubq2jBepSNbME7WOb7rZ7pVof8JptxRAclgGm6DrWmlgNopGCGkugDcA49Pu_JU9Hm81FLReMUaHlwL/s422/QualcommAdrenoSdkQt.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The installer progress report showing Qt libraries being installed." border="0" data-original-height="290" data-original-width="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7rdAdg4xFhhAXYkA00kpNolyw03MO8i5Jt25V3W4E973YRLuOxCnj6N9ChWfYiubq2jBepSNbME7WOb7rZ7pVof8JptxRAclgGm6DrWmlgNopGCGkugDcA49Pu_JU9Hm81FLReMUaHlwL/s16000/QualcommAdrenoSdkQt.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoOKDan22Y9on5Lddb9-hwY8l6EmWCVPDddcw34wjwb8XhWw885aFS-ajt0lWENerw7nr9cUbmm9FqUf_1vB73hzEWWCQ4i1wy2AEbtQN5mVaD8w0m0fqBp_0YuYcy6KWjdjhd2a2gC0mc/s422/QualcommAdrenoSdkShortcut.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The installer progress report showing shortcut files being created." border="0" data-original-height="290" data-original-width="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoOKDan22Y9on5Lddb9-hwY8l6EmWCVPDddcw34wjwb8XhWw885aFS-ajt0lWENerw7nr9cUbmm9FqUf_1vB73hzEWWCQ4i1wy2AEbtQN5mVaD8w0m0fqBp_0YuYcy6KWjdjhd2a2gC0mc/s16000/QualcommAdrenoSdkShortcut.png" /></a></div><p>And it's done! Although, it also installed some Qt files and a Desktop shortcut. Two things I did not want. Hm... actually, where does that Desktop shortcut even go to? What does it launch? Apparently, "AdrenoSDK\Bin\Browser.exe" - is that what the Qt stuff was for? Let's launch it and find out!</p><p>...</p><p>...</p><p>Uh... nothing's happening. Did I imagine the mouse cursor changing to the wait cursor after my second click? Let's try that again.</p><p>...</p><p>...</p><p>Nope, I definitely double-clicked and it definitely changed my cursor, and then did nothing. Let's open Process Explorer... no "Browser.exe" process showing up, I'll watch for it and try a third time.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHHaQoGg2o2nImzc2VoEsb9LD7z1F41vz1LEEKNYstSC3R68Wwi1jRzvLgTKfK_Q8RoTDaTf1IMEdRh1C6r1hgXxI5fPzYKvGjttTt0LnpYyCesIWifzJPd7PWbnw5nq9n_sopcl54WVoK/s740/QualcommAdrenoSdkBrowser.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Process Explorer showing Browser.exe running with a child process of itself suspended, and WerFault.exe also running as a second child process." border="0" data-original-height="62" data-original-width="740" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHHaQoGg2o2nImzc2VoEsb9LD7z1F41vz1LEEKNYstSC3R68Wwi1jRzvLgTKfK_Q8RoTDaTf1IMEdRh1C6r1hgXxI5fPzYKvGjttTt0LnpYyCesIWifzJPd7PWbnw5nq9n_sopcl54WVoK/s16000/QualcommAdrenoSdkBrowser.png" /></a></div><p>You're kidding. It spawns a child process of itself, and immediately crashes on startup. It happens so fast I don't even have time to suspend it. But, I can see that the child process was launched with no command line arguments. Guess it communicates with the parent via stdin and stdout? Or some other IPC? Either way it's not working. Well, time to nuke that useless desktop shortcut I didn't want in the first place. It doesn't even have a custom icon. Guess we'll have to be our own Browser for now.</p><p>A quick search reveals what I had feared... nothing resembling Vulkan at all. Just a bunch of OpenGL libs, and they seem to be for x86-32 and x86-64 only. Where's the ARM stuff? And... oh no... is that... a Visual Studio 2010 directory? The more I examine the installed files the more I am regretting this. A lot of the file dates are from 2016. I don't know what I expected but it absolutely was not this. At least all of this is free for literally anyone to download and view for themselves, assuming they can get past the above gauntlet.</p><p>Wait... a glimmer of hope... in the Docs directory there's a file named "Adreno_DirectX_Developer_Guide.pdf"... could this be it? My WoA savior?</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSlXc9OdgsVOzbTVEgwVRoCBB_W7JU4hzypzFU-vyVAMUdzcrbTwis1FcQtw2w_zhgUKS8KwaO4TDGIblgkUt6t32kF-zr9geoJ7NwE1amy0mQyQhGlVaTt94TnwIEe4vDyiuF4dOsH4bR/s1291/QualcommAdrenoSdkWindowsRT.png" style="margin-left: 1em; margin-right: 1em;"><img alt="The first main section of the PDF explaining that it is about Windows RT." border="0" data-original-height="524" data-original-width="1291" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSlXc9OdgsVOzbTVEgwVRoCBB_W7JU4hzypzFU-vyVAMUdzcrbTwis1FcQtw2w_zhgUKS8KwaO4TDGIblgkUt6t32kF-zr9geoJ7NwE1amy0mQyQhGlVaTt94TnwIEe4vDyiuF4dOsH4bR/w640-h260/QualcommAdrenoSdkWindowsRT.png" width="640" /></a></div><p>OH NO IT'S WINDOWS RT! AAAAAAAAAAAAAAAAAAAAAAAAAAAAA! The sabotage, the incompetence, the gauntlet, it all makes sense! No wonder they were guarding this with such intense security and had made every step of obtaining this so difficult and confusing, the entire download is cursed! Quick, uninstall it, before it's too late!</p><p>...</p><p>Actually I am curious to read more. (No, stop you fool, don't listen to it!) I've always been curious about Windows RT since I never got to try it. (Don't let it tell you sweet nothings, uninstall it!) It was discontinued before I even heard about it, and apparently it was 32-bit ARM only, and back before there was any x86 emulation, and you couldn't even sideload Win32 apps. (All good reasons to run the uninstaller, now!) I wonder... (No! Don't lose yourself!)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKhxTVYKWzt9QCpdnj8Q4ycYGo_4KcECrBYQbGe7X4lN7NBOB38C8BG9nMiM4S35kZBtDsgrNtWYfIauXqWohTitocOMe4dLsccdIG_65BmtfUPn2-XgbtJ6DbXmIWtvNDfrds91QWVqLF/s1256/QualcommAdrenoSdkWindowsRtGame.png" style="margin-left: 1em; margin-right: 1em;"><img alt="A PDF section about the GPU profiler, showing a video game running on a Windows RT tablet." border="0" data-original-height="765" data-original-width="1256" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKhxTVYKWzt9QCpdnj8Q4ycYGo_4KcECrBYQbGe7X4lN7NBOB38C8BG9nMiM4S35kZBtDsgrNtWYfIauXqWohTitocOMe4dLsccdIG_65BmtfUPn2-XgbtJ6DbXmIWtvNDfrds91QWVqLF/w640-h390/QualcommAdrenoSdkWindowsRtGame.png" width="640" /></a></div><p>Wow, they had games running on it? (You've gone too deep!) This is fascinating... I need to <a href="https://www.youtube.com/watch?v=cpDYBsdqDqo" target="_blank">look this up</a>. This <a href="https://www.youtube.com/watch?v=ipe2Px93qQ4" target="_blank">predates the Nintendo Switch</a>? Amazing! Uh, I guess this is the end... of this blog post. I'll report back when I get the Snapdragon Developer Kit for Windows on ARM. Later this summer! I hope!</p><p></p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-31217984241113364652021-07-02T21:10:00.007-05:002021-09-01T17:34:38.567-05:00I wish UWP had succeeded<p>I work professionally as a C++ developer, and as part of my job I personally ported multiple Win32 games to run on UWP for Desktop and Xbox. I will admit, there are some aspects of the Universal Windows Platform that I found annoying, but overall I liked the direction it was going and the features it offered.</p><p>The main thing I liked about UWP apps was the user experience: the app/game runs in a sandbox with limited permissions that the user can see in advance and even turn off or customize. I am a huge, huge advocate of giving users control over what apps are allowed to do on their system. This is difficult to do with any real reliability for Win32 apps, especially without sacrificing performance, and it's why antivirus software has stepped up as an alternative. UWP on the other hand had sandboxing and permissions baked in while being really performant, especially if you implemented your UWP app or game as C++/WinRT with DirectX 11 or 12. Android, iOS, and other mobile operating systems are far, far ahead of Windows in this regard, and it's frankly embarrassing that such an ancient app model as Win32 is still so popular.</p><p>UWP apps also have a nice installation experience, either for sideloading or for installing from the Microsoft Store. Automatic update support was baked in too, so no more chaos of every app having its own weird implementation of automatic update. A single UWP package can also run on multiple device types such as Desktop, Xbox, and more, and even use APIs that only exist on one of those device types if it checks for their presence. Windows also has native support for allowing users to move UWP apps between drives with just a few clicks. Compare this to the myriad of Win32 apps that come with installers and due to registry keys and shortcuts and services and such it is easier to uninstall and reinstall the app than to try and move it by hand.</p><p>My gripes with UWP are rather minor by comparison - the new app model takes some getting used to, some of the more advanced features only work on NTFS volumes, there's no Vulkan support yet, and WinRT has a steep learning curve. Aside form that though, I mostly have positive sentiment toward UWP.</p><p>Microsoft recently released their new GDK app model designed for games, and to say I am disappointed is an understatement. It is a regression back to the Win32 app model, with the suspend/resume part of UWP bolted on haphazardly, and endless hacks and limitations to try and give developers that outdated Win32 feel. As can be seen from the Microsoft store, apps that use the GDK require all the same permissions as Win32 apps - that is to say, they require full filesystem access and other invasive permissions which are likely to discourage users from trusting them enough to try out. UWP apps often only need an internet connection and little to no other permissions or access. Even more alarming, the GDK only supports 64-bit x86, with no support for ARM, right when it is most critical for Microsoft to push for ARM support. They could add it in the future, but its omission is glaring in the face of UWP's already existing support for it.</p><p>We were also going to get WinUI 3 for UWP along with WebView2 support, but Microsoft seems to have backed off from those plans, leaving UWP with outdated WebView support only. In addition to endless headlines from news publishers about UWP dying or being abandoned or being disliked and Microsoft constantly backpedaling, Microsoft is now recommending that game developers use the GDK instead of UWP. It's very frustrating to me since from both a developer's perspective and a user's perspective, UWP is by far the superior platform for apps and games. I seem to be in the minority with this sentiment though. Perhaps people really just don't like change.</p><p>I had hoped that Microsoft would continue to expand UWP such that eventually every app or game could be ported to it with the right permissions enabled, but instead it seems that the developer community and user community alike pushed back hard against it. I can't help but wonder if the awful UX of the Microsoft Store contributed to UWP's demise, even though they are separate entities.</p><p>It's not too late for Microsoft to salvage UWP, though I have a feeling that even if UWP does make a comeback, it might not be for years. What a shame.</p><p><br /></p><p>Update: Microsoft decided to <a href="https://blogs.windows.com/msedgedev/2021/08/31/webview2-windows-app-sdk-winui2-runtime-cdp-helper/" target="_blank">support WebView2 in UWP after all</a>, but only in WinUI 2. WinUI 3 still has no UWP support aside from the 0.8 preview. Guess we'll take what we can get.</p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-46192839604701477272021-06-24T21:56:00.005-05:002021-06-24T22:09:58.638-05:00How to build WinDirStat for Windows 10 on ARM<p>WinDirStat is a 32-bit x86 app, so it can already run through emulation on Windows 10 on ARM. However, it is surprisingly easy to build an ARM-native version of the app. I thought it'd be fun to try, so here's what worked for me.</p><p>First, you'll need to install Visual Studio. I used Visual Studio 2022 Preview 1.1 for this, but things should work in Visual Studio 2019 as well. Importantly, within Visual Studio Installer, you need to select the Desktop Development with C++ workload, and in the optional components you need to select MFC, specifically for ARM. You can find it by searching for ARM MFC in the Individual components screen. You should install MFC for x86 as well to verify that you can build WinDirStat in its default configuration.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7c_abWurg7BQQbH2OGAlucMKwzOHxRCA4yoiR-ACTy6A9cwotX2HFBFuOUyNBCWBnkMWDhHEOpCsKr9zLOaxxUe3YOFanVgDhTzcL-YAh6C8e6QgtzZjNMxBXR-JkCvHxk8Fm_e28prtb//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="720" data-original-width="1290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7c_abWurg7BQQbH2OGAlucMKwzOHxRCA4yoiR-ACTy6A9cwotX2HFBFuOUyNBCWBnkMWDhHEOpCsKr9zLOaxxUe3YOFanVgDhTzcL-YAh6C8e6QgtzZjNMxBXR-JkCvHxk8Fm_e28prtb/s16000/image.png" /></a></div>Once you have Visual Studio installed, you need to download the WinDirStat source code. When I did it, it was hosted on OSDN as a mercurial repository, so I installed mercurial and cloned the repository. With the source code in hand, all I had to do was open the Visual Studio solution file.<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Aoq6Baii0BYuZ5B8nl0Ir8jMJF2Vzi9ngf37fVWsl3wXxAi25H31rJsztyAPOJoIHieHp0XtBO30B_fhiSMWUGII-e3-akucmrkSX3sNowAOK84-EzB_OOtEl3m8P8brPgayK6WDIet-//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="420" data-original-width="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Aoq6Baii0BYuZ5B8nl0Ir8jMJF2Vzi9ngf37fVWsl3wXxAi25H31rJsztyAPOJoIHieHp0XtBO30B_fhiSMWUGII-e3-akucmrkSX3sNowAOK84-EzB_OOtEl3m8P8brPgayK6WDIet-/s16000/image.png" /></a></div>First things first, change the dropdowns at the top to Release and Win32 and then choose Build -> Build Solution. This should succeed as a baseline to confirm that you installed Visual Studio correctly. If you get errors, you may have missed certain components such as MFC - close Visual Studio and run Visual Studio Installer and Modify the install to add the missing components.<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSODOxQSMJGOG0BVX3QGjpUwV0PP0v5DSUJgrZKG3NncJmZOOu2kZlwAS4xBM2__YnMQkF2sV803A8cWujOe1g8n96WoZi5hEeuPNK1Klyw8AEBdH3L4ohN8-kqsOcx8hLssQJBoES-3UM//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="83" data-original-width="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSODOxQSMJGOG0BVX3QGjpUwV0PP0v5DSUJgrZKG3NncJmZOOu2kZlwAS4xBM2__YnMQkF2sV803A8cWujOe1g8n96WoZi5hEeuPNK1Klyw8AEBdH3L4ohN8-kqsOcx8hLssQJBoES-3UM/s16000/image.png" /></a></div>Now comes the the big part - porting this complicated x86 app to ARM. Get ready...<div><ol style="text-align: left;"><li>Go to Build -> Configuration Manager</li><li>At the top right, click in the Active Solution Configuration dropdown and click <New...><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQSDOSkepwSIF3ZSp2GbFIa4D9tjlyyouJAP2BRZFV8vz4Agh_vAbESuIqrDd_XE6UX9npNY1IJz5LNFi2_OCg51mi8ITu-Vwv-wDk1i3lDAoanb33TpsbV8Bk9qhzXaa0yMEcYRiV98N//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="443" data-original-width="702" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQSDOSkepwSIF3ZSp2GbFIa4D9tjlyyouJAP2BRZFV8vz4Agh_vAbESuIqrDd_XE6UX9npNY1IJz5LNFi2_OCg51mi8ITu-Vwv-wDk1i3lDAoanb33TpsbV8Bk9qhzXaa0yMEcYRiV98N/s16000/image.png" /></a></div></li><li><div class="separator" style="clear: both; text-align: left;">Make sure ARM is selected as well as "Create new project platforms" and click OK<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgzePKOiN8KiMc2ou1mtz7ijOTnR_cQiRFgK7WOvwt8AlB0Pp0aouohSot86uUdXkapwELeH2L1dr2pmzsT8sqt0lvGXnadte9fGe4gSFtv47YVZ64nB6DaXhXv0ehbyKDaFpAXerU3U-p//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="221" data-original-width="335" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgzePKOiN8KiMc2ou1mtz7ijOTnR_cQiRFgK7WOvwt8AlB0Pp0aouohSot86uUdXkapwELeH2L1dr2pmzsT8sqt0lvGXnadte9fGe4gSFtv47YVZ64nB6DaXhXv0ehbyKDaFpAXerU3U-p/s16000/image.png" /></a></div></div></li><li><div class="separator" style="clear: both; text-align: left;">Click the Close button in the dialog from Step 2.</div></li><li><div class="separator" style="clear: both; text-align: left;">Right click on the WinDirStat project in the Solution Explorer and choose Properties<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip2aNbwy8T86rummbXIRRFlN8_3YRFu9SUMgKudDzNIfLlAfeilF7-2tiYDappWIDy-JgppOEYwsjiXoVhqBZs1qWu5b_f-YwnI0EI9PeeblmSxsXLEd4CHsaNWV81tbHkwnf-RQMg4C8F//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="977" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip2aNbwy8T86rummbXIRRFlN8_3YRFu9SUMgKudDzNIfLlAfeilF7-2tiYDappWIDy-JgppOEYwsjiXoVhqBZs1qWu5b_f-YwnI0EI9PeeblmSxsXLEd4CHsaNWV81tbHkwnf-RQMg4C8F/s16000/image.png" /></a></div></div></li><li><div class="separator" style="clear: both; text-align: left;">Make sure the dropdowns at the top say "All Configurations" and "ARM", then navigate to Linker -> General and change Link Library Dependencies to No, then click OK<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7a7rQM11sGGm1-TdOLv8G3Xlhp5bxXx17GmJ4jSNUrm26SAr7wFgZ0jF9CzdAquD__THObRYa84JOssn8L0xeMxvUizn0Zb4mrfav7wo0-ftGLwbnx95h6Cl-dNezxzWtRCHmel3oupvK//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="543" data-original-width="786" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7a7rQM11sGGm1-TdOLv8G3Xlhp5bxXx17GmJ4jSNUrm26SAr7wFgZ0jF9CzdAquD__THObRYa84JOssn8L0xeMxvUizn0Zb4mrfav7wo0-ftGLwbnx95h6Cl-dNezxzWtRCHmel3oupvK/s16000/image.png" /></a></div></div></li><li><div class="separator" style="clear: both; text-align: left;">Now, in the Solution Explorer, expand the WinDirStat project -> Source Files -> Lua -> Right click on WDS_Lua_C.c and choose Properties<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-iuJVrepQWlc6AtSjEwZsVPG8XzTeRht57v2vEddZTtd170CfXGL8R55ekWzVzGyqhfC4sXEyXpzn04MZNILnffD4dIQhOpJS3thFC-yWSCEKL_-MxCBaMQE8DUf4M2ENKJCoAqiW4xe-//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="582" data-original-width="488" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-iuJVrepQWlc6AtSjEwZsVPG8XzTeRht57v2vEddZTtd170CfXGL8R55ekWzVzGyqhfC4sXEyXpzn04MZNILnffD4dIQhOpJS3thFC-yWSCEKL_-MxCBaMQE8DUf4M2ENKJCoAqiW4xe-/s16000/image.png" /></a></div></div></li><li><div class="separator" style="clear: both; text-align: left;">Make sure the dropdowns at the top say "All Configurations" and "ARM", then in the General section, change "Excluded From Build" to Yes, then click OK<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigkKSfDZoqLZK_R8ovp_NsziuxaSBg7oBTVjqyqPrdzFJw_5BPxRZLZiVn4ZxWQ0Q-RR-0oovDUyrbm7ZCOtKmXnGWIwFLynink48wwUyKGPtP9sjGF2qCNif9_wD-52qNdSdNyYFVbhRx//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="543" data-original-width="786" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigkKSfDZoqLZK_R8ovp_NsziuxaSBg7oBTVjqyqPrdzFJw_5BPxRZLZiVn4ZxWQ0Q-RR-0oovDUyrbm7ZCOtKmXnGWIwFLynink48wwUyKGPtP9sjGF2qCNif9_wD-52qNdSdNyYFVbhRx/s16000/image.png" /></a></div></div></li></ol><div>Congratulations, you have just ported WinDirStat to ARM! You can choose Build -> Build Solution and you will end up with a wds32.exe file in the Release subdirectory of the ARM directory. You will also get a lot of build errors from the Lua projects, but don't worry, they aren't necessary.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibFavkTwak-sIaMJf_gPuHt42VWaJ170eu96o6LLUlO2i7mpv_d6oFb0vQO-1xb8SC9ny9MC8TUn-WoPBGlezacH3dtd6YryGsRqFwpNmMqmAkMslNDJyd8mJL6BtF1RhvQSoLNpmvOV5H//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="104" data-original-width="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibFavkTwak-sIaMJf_gPuHt42VWaJ170eu96o6LLUlO2i7mpv_d6oFb0vQO-1xb8SC9ny9MC8TUn-WoPBGlezacH3dtd6YryGsRqFwpNmMqmAkMslNDJyd8mJL6BtF1RhvQSoLNpmvOV5H/s16000/image.png" /></a></div>And that's that! Porting complex apps to ARM really is that simple in many cases. I tested the resulting executable on my Lenovo Miix 630 - the only Windows 10 on ARM device I own currently - and it worked fine. Though, apparently the latest WinDirStat source code I checked out had some minor bugs even in the x86 version. Still, this is cool!</div></div><div><p></p></div>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-34313962965443017662021-04-26T21:45:00.007-05:002023-11-22T10:49:31.753-06:00Windows 10 on ARM has always been able to run 64-bit apps<p>The transition from x86-based processors to ARM-based processors is one of the most interesting and exciting technology events for me right now, and it is happening so stealthily that most people don't even understand what is going on. I keep seeing reviews that say Windows 10 on ARM "can't run 64-bit apps" or articles titled "Will Windows 10 on ARM be affected by ARM dropping 32-bit support?" or other such misleading things. The confusion comes from a misunderstanding of what 32-bit and 64-bit even are - people don't realize that 64-bit ARM code exists at the same time as 64-bit x86 code.</p>
<p>Here's a handy table to hopefully clear things up before I delve into details:</p>
<style>
th+th
{
border-left: 1px solid rgba(0,0,0,0.1);
}
td
{
border: 1px solid rgba(0,0,0,0.1);
}
th, td
{
text-align: center;
padding: 0 2px;
}
td.yes
{
background-color: rgba(0,127,0,0.2);
}
td.no
{
background-color: rgba(127,0,0,0.2);
}
td.soon
{
background-color: rgba(127,127,0,0.2);
}
</style>
<table>
<thead><tr><th>Ability</th><th>Windows 10 on x86</th><th>Windows 10 on ARM</th><th>Windows RT</th><th>MacOS on x86</th><th>MacOS on ARM</th><th>Linux</th></tr></thead>
<tbody>
<tr><td>Run 32-bit x86</td><td class="yes">Yes<br />Natively</td><td class="yes">Yes<br />Emulated</td><td class="no">No<br />Never</td><td class="no">No<br />Not Anymore</td><td class="no">No<br />Never</td><td class="yes">Yes</td></tr>
<tr><td>Run 64-bit x86</td><td class="yes">Yes<br />Natively</td><td class="soon">Yes (insider builds)<br />Emulated</td><td class="no">No<br />Never</td><td class="yes">Yes</td><td class="yes">Yes<br />Translated (Rosetta 2)</td><td class="yes">Yes</td></tr>
<tr><td>Run 32-bit ARM</td><td class="no">No</td><td class="yes">Yes<br />Natively</td><td class="yes">Yes<br />Natively</td><td class="no">No<br />Never</td><td class="no">No<br />Never</td><td class="yes">Yes</td></tr>
<tr><td>Run 64-bit ARM</td><td class="no">No</td><td class="yes">Yes<br />Natively</td><td class="no">No<br />Never</td><td class="no">No</td><td class="yes">Yes<br />Natively</td><td class="yes">Yes</td></tr>
<tr><td>Run 32-bit RISC-V</td><td class="no">No</td><td class="no">No</td><td class="no">No<br />Never</td><td class="no">No</td><td class="no">No</td><td class="yes">Yes</td></tr>
<tr><td>Run 64-bit RISC-V</td><td class="no">No</td><td class="no">No</td><td class="no">No<br />Never</td><td class="no">No</td><td class="no">No</td><td class="yes">Yes</td></tr>
</tbody>
</table>
<p>It's a bit much to take in, as usual due to historical considerations. For starters, the processors themselves: x86 processors include those made by Intel and AMD - there hasn't been a third major player for x86 in a long time, primarily due to Intel's licensing restrictions for the 32-bit x86 instruction set and AMD's licensing restrictions for the 64-bit x86 instruction set. x86 is what is known as a Complex Instruction Set Architecture, or CISC (with the second C being for Computer). They can do a wide range of complex instructions quickly, but they use a ton of electricity in the process, and generate a lot of heat as a result. On the other hand, ARM processors include those made by Qualcomm and Apple, as well as others - ARM licensing is more open than x86. ARM is a Reduced Instruction Set Architecture (RISC) meaning that they only process simple consistent instructions. They need more instructions in some cases to do the same things as fewer instructions in x86, but they also use much less electricity and generate much less heat. You may also have noticed RISC-V in the table, which is also a RISC processor architecture like ARM, but it is even more power efficient than ARM and more open as well, though also much newer and with much less adoption as a result. ARM has long dominated in the smartphone industry due to the better power efficiency and reduced heat output, and while we used to have MIPS as another RISC processor architecture, the MIPS company has decided to invest all its resources into RISC-V. ARM is also taking huge swaths of the datacenter industry under its belt, as data centers seek to use less electricity and generate less heat. If RISC-V proves to be more efficient, it will likely catch up to and even surpass ARM, but that's a ways off still.</p>
<p>Nearly all of the processors can have 32-bit and 64-bit variants, and for backwards compatibility, they can natively run code from half their native size - e.g. 32-bit x86 processors could run 16-bit code and 64-bit processors could run 32-bit code, natively. This backward compatibility is optional though and doesn't necessarily have to be supported by the processors. Apple, for instance, decided to stop supporting 32-bit x86 apps entirely, even if the processor itself might still have remnants of that support. ARM initially only had 32-bit processors, but now has moved to 64-bit and still supports 32-bit code as well. Apple's new M1 processors are ARM processors dubbed as Apple Silicon, and they likely don't have any 32-bit support at all even vestigially.</p>
<p>Windows RT was Microsoft's first foray into the world of ARM processors for desktop operating systems, and it flopped hard, mainly because it couldn't run x86 apps (which were the only Windows apps in existence at the time) and because even when developers did take the time to recompile their code for ARM, they were only allowed to do so as Universal Windows Platform (UWP) apps, which are more complicated to develop for and more limited than traditional Win32 apps. (Win32 is just the name for the kind of apps that get full unrestricted system access due to not being UWP apps, the 32 doesn't mean anything anymore as there can be 64-bit Win32 apps.) Making matters worse, apps for WIndows RT also apparently had to be hand-picked by Microsoft, so you couldn't just throw a 32-bit ARM version of your UWP app on the Microsoft store and expect to be able to download it on a Windows RT device. This completely crippled the platform, and now Microsoft no longer supports it.</p>
<p>Windows 10 on ARM, on the other hand, is the full entire Windows 10 operating system running on a 64-bit ARM processor. In theory Microsoft could have made a 32-bit ARM version of Windows 10 just like they have a 32-bit x86 version, and Windows RT was itself 32-bit, but there's really no benefit to doing this, so Windows 10 on ARM is entirely 64-bit native. However, there are still some benefits to 32-bit ARM software even on 64-bit ARM hardware, so Microsoft did decide to support both 32-bit and 64-bit ARM apps for Windows 10 on ARM. This also allowed supporting old 32-bit UWP apps that were made for Windows RT, in theory, as well as supporting traditional unrestricted Win32 apps for both 32-bit and 64-bit ARM. For supporting x86 apps though, they went with emulation: within the OS they run a software emulator that pretends to be an x86 processor. This emulator is itself running natively as ARM code, and it reads the x86 code and then executes corresponding ARM instructions. There is some overhead in this process incurred by the emulator having to interpret and understand the x86 code as it executes. For a long time now, only 32-bit x86 apps could be emulated, Microsoft is still building emulation support for 64-bit x86 apps. You can try it in Windows 10 insider builds, it'll likely be released fully either later this year or early next year.</p>
<p>Apple on the other hand decided not to use emulation, and instead went with translation: before the app even runs at all, Apple goes through all the x86 code of the app and generates corresponding ARM instructions, and then once it has done that, it finally runs this newly-minted ARM version of the app. There is also some trickery with their processors supporting some special hybrid ARM+x86 instructions to allow the Rosetta 2 translator to generate more optimal code. (Rosetta 1 was used back when Apple moved from PowerPC to x86.) As a result, x86 apps on MacOS run much faster than they would through emulation. In theory, Microsoft could do this too, it's just a matter of time.</p><p> (Update 2023-11-22: the distinction between emulation and translation seems misleading, and <a href="https://www.youtube.com/watch?v=uY-tMBk9Vx4" target="_blank">actual tests show it's not as clear cut</a>.) <br /></p>
<p>So, now we get to the confusion. Microsoft, in their infinite wisdom, decided that 32-bit x86 should be denoted as just x86, and 64-bit x86 should be denoted as... x64. Yes, the lower number is the newer and (usually) better version. When you see people making the claim that Windows 10 on ARM can't run 64-bit apps, what they mean is that it can't yet run 64-bit x86 apps, and they have no understanding of the concept of 64-bit ARM apps. That x64 name doesn't help avoid confusion either. In their defense, a majority of apps are still only available as 64-bit x86 builds, which is why it's such a contentious issue. But don't be misled, Windows 10 on ARM has always been able to run 64-bit ARM apps. Additionally, when you hear people talking about ARM dropping 32-bit support, that only applies to new processors, it can not and will not affect existing devices. I also don't expect it to affect the ability to run 32-bit x86 apps - those can still run through emulation via 64-bit ARM code that emulates the x86 instructions, as discussed before. It is effectively a non-issue.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWxRX1Vd6QDE3U4Opjdgg6ptHKFUVvDQc2waGNUdEPzDIyrfMmIpGQIB4E6968Wpl96ktXiTf682euRG6M8IyLKS5LkSUoU2_vjaKSCEfivBp4AQSHonZBNBrGTIgF7YuuUoy-gnzZM50h/s1920/Win10ARM64.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="A screenshot of the Windows 10 on ARM system properties with a red rectangle highlighting the text 64-bit operating system, ARM-based processor" border="0" data-original-height="1220" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWxRX1Vd6QDE3U4Opjdgg6ptHKFUVvDQc2waGNUdEPzDIyrfMmIpGQIB4E6968Wpl96ktXiTf682euRG6M8IyLKS5LkSUoU2_vjaKSCEfivBp4AQSHonZBNBrGTIgF7YuuUoy-gnzZM50h/s0/Win10ARM64.png" /></a></div>
<p>There are some cases where it is actually better to use 32-bit apps on 64-bit processors, but they are few and far between, and it primarily comes down to RAM usage. 32-bit code uses 32-bits for storing memory addresses, which is something code does all the time, whereas 64-bit code uses 64-bit addresses. If some environment doesn't have more than 3 or 4 GB of RAM, a 32-bit process could use less memory than its 64-bit equivalent. However, with the ever increasing amount of RAM we are shoving into our devices, this is quickly fading as a relevant argument for 32-bit apps. Nearly all software that has been ported to ARM is only distributed as 64-bit ARM. Apple stopped supporting 32-bit apps of any kind, the Google Play Store also stopped allowing submissions of 32-bit code, and now ARM itself is removing 32-bit code support from its future processor designs. 32-bit ARM is going by the wayside as it has little reason to exist. You can still build 32-bit ARM apps for Windows 10 on ARM today, but it's only useful for that small demographic of 4 GB RAM or less, and the differences are in practice negligible.</p>
<p>So how hard is it anyway to build ARM versions of apps that only have x86 versions? Well, if you have the source code, it is usually trivially easy to do. The only issues that tend to crop up are if you had hand-written some assembly code (which is the part that actually differs between different processor architectures) or if you had used special compiler intrinsics that rely on specific processor instructions. Those are usually rare and just need some replacing for ARM. In all other cases though, building an app for ARM is the same as building it for x86, you just select a different architecture while building and the compiler does all the work for you. With some languages, you don't even need to recompile the code, only the interpreter needs to be recompiled (e.g. Python, Java, C#). While building for ARM is trivially easy in most cases, optimizing for ARM is a new learning experience for many developers who use low level languages like C++, Rust, or C. You have to worry more about memory alignment and data access synchronization in ARM than you do in x86. The compiler can in most cases fix issues in these areas for you, but it will do so by generating slower code, so while an initial port will likely work without issue, it will likely also have some code paths that are unnecessarily slow. Those are the ones that take the most time to fix up. In the end though, you can easily match or surpass x86 in some way with ARM, if not in raw performance then at least in power efficiency. The crazy thing about RISC is that even if it takes longer to perform some task, it can still spend less electricity and generate less heat than when the CISC code does it faster. It is very much worth it to try and optimize code for ARM anyway, as some of the optimizations that benefit ARM can also benefit x86.</p>
<p>Did you know the Nintendo Switch uses an ARM processor? It's true - unlike the PS4/PS5 and the Xbox One and Xbox Series consoles which use x86-based processors to run 64-bit x86 code, the Nintendo Switch runs both 32-bit and 64-bit ARM code. If you are a game developer and you optimize your game for the Nintendo Switch and for Windows, congratulations, you already have optimal code for Windows 10 on ARM! Currently there are very few games that run on Windows 10 on ARM, and even fewer that run natively as ARM code rather than through emulation. I personally helped increase the list of native ARM games for Windows 10 on ARM when I ported the Five Nights at Freddy's series to UWP. They aren't particularly demanding games by any stretch, sure, but they are games and they now have native ARM versions available on the Microsoft Store, and I think that's really cool. (And for reference, you don't need to use UWP or the Microsoft Store to distribute native ARM apps for Windows 10 on ARM, you can do it the same way as on x86 via the Win32 app model).</p>
<p>One major caveat with Windows 10 on ARM though: Only DirectX is supported as the graphics rendering API, and only recent versions. Microsoft recently released an OpenGL compatibility pack, but this just emulates OpenGL under DirectX. Vulkan isn't supported yet. In theory OpenGL and Vulkan could be natively supported alongside DirectX, but this requires graphics driver support, which means collaboration between multiple companies and money being spent. It's early days still, so it is likely a difficult sell. OpenGL and Vulkan run fine on ARM Android devices though, so it's only a matter of time.</p>
<p>Bonus nonsense: In 64-bit Windows on x86, you have <tt>C:\Program Files (x86)\</tt> and <tt>C:\Program Files\</tt> with the latter being for 64-bit x86 apps and the former being for 32-bit x86 apps. In Windows 10 on ARM, you have those two directories and also a <tt>C:\Program Files (arm)\</tt> for 32-bit ARM apps. The 64-bit ARM apps go in <tt>C:\Program Files\</tt> - and, guess where the 64-bit x86 apps will go? You know Microsoft wouldn't pick something that makes sense like <tt>C:\Program Files (x64)\</tt> - no, instead the 64-bit x86 apps will share a home with the 64-bit ARM apps in one big unhappy family under <tt>C:\Program Files\</tt> because Microsoft said so. This complicates side-by-side installations for people who want to test the 64-bit x86 emulation speed compared to the native 64-bit ARM speed.</p>
<p>Microsoft is also doing something rather interesting to support 64-bit x86 apps in Windows 10 on ARM, and that is to introduce whole new architectures for the compiler to target so as to create hybrid x86+ARM binaries. It is currently unclear how exactly they work, but if you search online for ARM64EC and ARM64X you will find some information. In general it looks like whatever approach Microsoft used for supporting 32-bit x86 apps on Windows 10 on ARM is similar to the 32-bit ARM support, or the 32-bit x86 support on 64-bit Windows 10 on x86, whereas supporting 64-bit x86 apps on Windows 10 on ARM is forcing them to go down a whole entirely different route. It will be interesting to see what the final product ends up like.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qV7N4KLh9IElhzYyHJJFsjmbLwl6Sa_h9DrI0dX8gE8gls9ZKt4Sf1L4RK8tTYV45zQ7JFRrUduHLv2xt1kFRZKrPOMlc8my5HnQt6kFE2tSQyPNWQgDZohFdOpkiXwHE8-GOM29cdAr/s0/MSVC-Architectures.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="A screenshot of the target machine options in the C++ linker settings in Visual Studio 2019" border="0" data-original-height="598" data-original-width="733" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qV7N4KLh9IElhzYyHJJFsjmbLwl6Sa_h9DrI0dX8gE8gls9ZKt4Sf1L4RK8tTYV45zQ7JFRrUduHLv2xt1kFRZKrPOMlc8my5HnQt6kFE2tSQyPNWQgDZohFdOpkiXwHE8-GOM29cdAr/s0/MSVC-Architectures.png" /></a></div>
<p>If like me you're curious about the MIPS options there, it's because <a href="https://superuser.com/a/1062488/219815" rel="noopener" target="_blank">Windows used to support multiple different processor achitectures before ARM</a>. Microsoft and Apple have both jumped between different processor architectures in the past, and the fact they're doing it again now shows that we have cool times ahead.</p>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-14328054170078132812021-02-10T21:43:00.006-06:002022-06-11T16:11:06.723-05:00Gray Patterns<div>You may have heard of dark patterns, where technology is designed in intentionally malicious (or, dark) ways. But what about when it's unintentional? There are a ton of habits I have developed over the years purely to account for bugs I have encountered in software I use. These bugs may be fixed someday, but for now the defensive habits remain, sapping precious energy and time from me. Here are some examples.</div><div><br /></div><div>I have multiple monitors, and in Windows 10 there's an option to have a taskbar on each monitor and to only show open windows on the taskbar of the same monitor as there the window is at. If you focus a program on one monitor, then focus a program on another monitor, both programs stay focused on both taskbars even though only one is truly in focus. Clicking in the blank area of any taskbar fixes the display issue. So, I now have a habit of clicking to focus a program, clicking in a blank area, then refocusing the program again, just to avoid this distracting visual bug.</div><div><br /></div><div>Windows 10 also has a bug where sometimes one of the taskbars will get stuck thinking the mouse is continuing to hover over the last window it crossed over, even causing the tooltip and preview to show up sometimes, which is incredibly distracting. If this happens the only solution is to restart the system entirely, <i>or</i> I can pull a browser tab out into a new window, hover it in the taskbar, then close that tab/window, and then just <i>never hover my mouse over any windows in that taskbar again</i> until I restart my computer. It is almost getting me to start using Alt+Tab, except that I often have too many windows on other monitors for that to be practical.</div><div><br /></div><div>VLC has a bug where pausing or seeking music sometimes messes it up and it gets slightly pitched up or down in a subtle not noticeable way. So, I am now afraid to pause or seek music in it because I know I'll have to close it and reopen it if I want to fix the sound quality.</div><div><br /></div><div>YouTube lets you turn off autoplay for isolated videos, but not for playlists. I often want to scroll into the comments once a video is over, but I can't do that if I've been advanced to the next video in the playlist already. I can just click back, but that starts me at the beginning of the video, which changes my saved position in that video and affects the progress of the red progress bar on video thumbnails, which I rely on to know when I need to finish watching a partially-watched video. So I am now compelled to detect the end of the video approaching and pause it, read the comments, then let it play out fully once I am done so the progress bar shows as fully watched. This can probably be categorized as a dark pattern too, but mainly it's notable because I have developed numerous habits and mannerisms to account for it. I also write comments in a text file that I save frequently, since the auto advance feature cares not for what I have been writing carefully throughout the duration of the video.</div><div><br /></div><div>Discord has a bug where if you hold the Home key to scroll up through messages, it eventually stops working until you click to refocus the element it is scrolling inside of. So now on every webpage everywhere that has infiniscrolling, I occasionally click in the empty space while I am scrolling.</div><div><br /></div><div>Discord also has an issue where if you click away from a channel or DM right as a message appears, it marks that message as read even though you've never seen it. I found that if you use the browser version of Discord and refresh the tab and keep the tab focused, it breaks the auto-mark-as-read functionality and lets you mark messages as read only when you want to, thus negating this issue from happening. If you unfocus and refocus the tab though then Discord returns to working in its unfortunate normal mode. (Update: sometime in May or July 2022, this stopped working, and Discord always works in its unfortunate normal mode now.) However, as long as the tab is unfocused, it also doesn't mark messages as read, and so if you see new messages, you can scroll up in the chat without focusing the tab, and once you are scrolled up in the chat you can safely focus the tab again without it marking the messages as read, allowing you to refresh the page and get back the more desirable behavior.</div><div><br /></div><div>Nintendo Switch Pro Controllers will turn on and try to connect if you press any button on them at all. I have it paired to my PC for testing, but usually I use an Xbox controller, so when the Pro Controller turns on and connects it interferes with my testing. It is also annoying in that it constantly shows the player number LEDs bouncing back and forth. The only way I know of to turn it off is to turn my system's bluetooth off and back on again, which is annoying since I have bluetooth headphones and some applications don't like random changes to the default audio device. So, now I am afraid of even moving the Pro Controller out of the way in case I accidentally turn it on.</div><div><br /></div><div>I have a Lenovo Miix 630, a little Windows on ARM laptop/tablet hybrid I use for testing and development purposes. The battery life is amazing and can last for days or even weeks, <i>when it's turned on</i>. If I power it off fully, the battery drains rapidly and will be totally dead within a day, it won't even turn on until you've had it plugged in to the charger for several minutes. So unlike every single other non-phone device I own, I now leave this one turned on all the time just so that the battery isn't dead every time I go to use it. It goes into sleep mode when the cover is closed on it, and the battery lasts for weeks that way.</div><div><br /></div><div>Update 2021-07-06: I just remembered that for years now I have been cautious about having multiple Chrome windows open since I use pinned tabs. I have had issues where Chrome has crashed or my PC has bluescreened and when Chrome "restored open tabs" it only restored the last window I had open/focused, losing my pinned tabs. This has also led to me noting down the URLs of pinned tabs in both my bookmarks and in text files that sync to my cloud backup solution. I don't understand why pinned tabs are per-window, they should really be global to all open windows to avoid this exact issue.</div><div><br /></div><div>Update 2022-05-03: A few months ago a bug was introduced in Chrome where dragging the browser window between monitors with different DPIs no longer scaled the window size properly in most cases. However, if the window was maximized and I used the Win+Shift+Arrow keyboard shortcut to move it to the other monitor, I could then restore the window and it would have the correct scaled size. I think the bug is mostly fixed now but I still do things with this slower method out of fear of messing up my window sizes, because it's annoying to keep having to fix them.</div><div><br /></div><div>There are more of these I know I am forgetting too, so I plan to continue editing this post and expand it over time with more stuff I encounter. So far, as of the post date, none of these issues have been resolved to my satisfaction, so I still have to employ all these defensive habits.</div>Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-83318464191560945682019-10-18T02:23:00.000-05:002019-10-18T02:23:35.491-05:00I want to be a reason other people are happyI like to introspect. Lately I’ve been fascinated by figuring out my own drive and motivation in life. I’ve come to find that, primarily, I want to be a reason other people are happy. This ties so deeply and profoundly into my psyche that I used to feel guilty or sad when the opposite was true: when I am happy because of someone else. But when I make others happy, that in turn makes me happy too. I crave that vicarious enjoyment, that empathetic feeling of giving someone else a positive experience and knowing that they like it. It makes me happy to make others happy.<br />
<br />
When I was younger, I used to play video games by myself. Sometimes family would watch, usually my younger sister, but in general I was content to just play by myself. Something changed when I started doing YouTube. I stopped playing games entirely, unless I was recording them with the intention to upload and publish. I’ve heard other YouTubers talk about this experience happening to them too, and like me, they describe it as feeling like it’s wasteful to play a game without recording it. But usually that’s because it’s their business model; they need to record gameplay as their product. I doubt I’ll ever be in a position where that is feasible for me.<br />
<br />
I record my experience because I want others to be able to enjoy it like I do. I feel it is a waste to experience things alone, to be the only one to know what happens, what I feel, what I think. My commentary is a record of my inner thoughts and feelings as I play a game. I feel like it should be preserved so that someone, somewhere, might find it and get entertainment value out of it, or some kind of shared experience, a connection on the other side of a screen.<br />
<br />
Of course, there are countless YouTubers. There is an overwhelming amount of content of all types being produced and published every day, every hour, every minute, every second. All of it is too much. There is no way anyone could keep up with it all. But, some people watch my videos anyway. Even if nobody watched my videos, even if they all got No Views and stayed that way for months or years, I might still continue on. My way of having fun in games is intrinsically linked to creating content that might someday be enjoyed, because at the heart of everything, I want to be enjoyed.<br />
<br />
I’ve often felt it’s a very vain thing to desire when phrased that way, though. I suppose a more accurate description is that I want to do things that make others happy, that others can experience and enjoy. I want to create games of my own, passion projects that allow me to express myself while also still being heavily geared toward others’ enjoyment. I can do this because others share similar interests and enjoy things I also enjoy. I can make things I enjoy, and then share it with others. I can create experiences that will improve the mood of other people, if I put in the effort. That is my driving motivation.<br />
<br />
Everyone needs entertainment for one reason or another. It helps us relax, unwind, or learn new things, keep our minds active. YouTube is very much a passive form of entertainment. Games are a more engaging and active form of interactive entertainment. I want to do that. I want to make games so people can enjoy them, be engaged, experience something cool. The easiest way to do that is just to make games I myself would enjoy. I don’t care if it takes years or decades for them to be uncovered by the right crowd. I’ll be happy knowing I made something that can positively influence other people.<br />
<br />
It’s not about me. It’s about everyone. Learning to include myself in “everyone” is one of the single most challenging things I have ever had to do in my life. I mentioned earlier that I used to feel sad or guilty when I was made happy by others. That was a rather drastic understatement. I went through a highly depressive period of my life from late 2018 to late 2019, and the core reason was the overwhelming feeling of guilt from finally having friends that I could enjoy spending time with. For the first time in my life, other people were making me happy, instead of me making other people happy, and it was terrifying.<br />
<br />
Every time I thought of something I wanted, especially if it was something another person could give me, I felt a pang of self hate. Some sort of chemical released from a gland in my brain and coursed through my bloodstream, filling my body with an awful feeling of death. I thought of ways to sabotage my chances of getting what I wanted. I took deliberate actions to make people less likely to do something for me that I wanted. I let these feelings fill me because, in a strange way, they felt good. I was giving in to something in my mind that liked it when I hated myself. But of course, there was still the part of me that was normal, that wanted things and that wanted to deserve them. That normal part of me made me feel guilty, because I didn’t know or want to admit it was normal.<br />
<br />
The guilt was overwhelming. I constantly feared getting things I wanted. Anything that would burden another person or take up their time or even just slightly annoy them was off limits for me. I couldn’t message people first because I was afraid it would bug them. I didn’t feel like I deserved to take up their time when they could be doing better things. I would only reply to people if they expected a response from me, even though I desperately wanted to talk to them and get to know them and let them get to know me. I didn’t value myself. Or rather, I valued everyone else significantly more than myself.<br />
<br />
This manifested in a lot of strange and contradictory behavior. I would often try and get friends to meet each other or hang out in the same server together, and then once I saw them being happy without me, I would distance myself from them. My job was done, they didn’t need me anymore, I could stop taking up their time and let them be happy without me, with better people than me. I thought I was doing them a favor.<br />
<br />
With the friends I was unable to do this with, I would instead become excessively self-sacrificing for them, often staying up late hours into the night to put on a smile and keep them happy. There were many times where I was crying while pretending to be happy for someone, just because I didn’t want them to feel bad. I’d lie about the way I felt in order to make them feel better. I’d decline any and all offers to do things I wanted to do, instead obsessively focusing on what they wanted even if I disliked it. I thought I was doing them a favor.<br />
<br />
I drained myself so much. I was burning myself to warm others in the most efficient way I could without being able to physically meet anyone. I donated my own money to many, many people when I felt exceptionally bad, and hid behind anonymity to prevent them from being able to do anything for me in return. It was a way for me to sacrifice myself in a way that didn’t immediately hurt, and it let me feel just a little bit better as a person for a moment, until that other part of my mind reminded me I could have donated more or to a better cause. I kept doing it anyway, like some kind of donation addiction, just to get that brief high of feeling like a good person before crashing down under the thought that I could have been better. I exhausted myself trying to please everyone and do nothing for myself. It was obsessive selflessness that I hid and lied about. I was miserable. I thought I was doing them a favor.<br />
<br />
That isn’t how it works though. Nobody ever saw me as negatively as I saw myself, no matter how much I told them about myself. Nobody actually wanted me to sacrifice myself for them, no matter how much I told them I wanted to. Nobody wanted to accept without also giving back, no matter how much I told them it was okay. Nobody wanted me to hurt myself, to drain myself, to exhaust myself, and doing so was making it more and more difficult for me to even talk to the very people I was trying so hard to do favors for. My self loathing and overvaluing of others was indirectly negatively affecting everyone in my life. My friends, my family, my employer, all getting a more defeated and more tired me. I was hiding my true feelings from everyone because I secretly already knew this and just didn’t want to admit it. I wasn’t doing them a favor.<br />
<br />
Someone gave me an unexpected gift once during that period, and it broke me. I cried for hours because of how awful I felt that someone had taken time out of their day to do something for me when I didn’t even deserve it. The pain was very real and very intense. After I calmed down, I agonized over writing a thank you message so that they would feel good about themselves instead of feeling like they wasted their time. I didn’t want them to know how badly they had hurt me from just trying to do a nice thing. That’s how bad of a mental state I was in.<br />
<br />
It took me a full year to crawl out of that pit. Through sheer determination, I powered through. Once I knew it was a problem with myself that needed to be solved, I got to work on solving it. I started writing to introspect and figure out what was going on in my mind. I started identifying negative thought patterns and fighting them off as they happened. I learned to stop giving in to that other part of my mind that wanted me to mentally hurt myself. Apparently, I reinvented some cognitive behavioral therapy techniques without ever having heard of them before.<br />
<br />
The trick, I found, was that my problems were also my solution. My goal never changed. I’m still doing all this for the benefit of others. I’m improving myself so that other people can experience a better me. The key was believing that allowing myself to be happy and to have things that I want for myself would indirectly help others to be happy too. I am not the only person with empathy. By fixing up my self worth issues and eliminating my self-sabotaging tendencies, I have become much happier as a person overall, and many of my friends and other people that talk to me have noticed. It’s more enjoyable for them too. I… I am more enjoyable for them.<br />
<br />
I want to be a reason other people are happy.Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-79488579793374507942018-01-08T13:41:00.000-06:002018-01-08T13:41:58.388-06:00How to livestream to Twitch and YouTube at the same time using ffmpeg and OBS Studio on a single Windows or Linux computerI'm a big fan of OBS Studio, and I've recently started learning how to use ffmpeg for transcoding and remuxing my videos. One thing that has bugged me is that current versions of OBS Studio can only stream to one streaming service at a time (one RTMP server). There are services like restream.io that get around this, but you're basically paying them for a little bit of CPU/GPU time and some added latency to your stream, and maybe only getting combined chat in return.<br />
<br />
Well, it just so happens that with a single ffmpeg command line invocation, you can output to multiple files and streaming services at once with very little overhead. Another benefit of ffmpeg over OBS Studio is that it supports more encoders such as hevc_amf which is the hardware H.265 encoder for AMD video cards. OBS Studio currently only supports h264_amf via the Advanced output mode. Strangely, OBS Studio has an included version of ffmpeg but the list of encoders it has does not include any AMD encoders, only NVidia's encoders, and OBS Studio also provides a really limited interface to its included ffmpeg.<br />
<br />
If you have multiple computers - one for recording with OBS Studio and another for encoding with ffmpeg - there are already guides for how to do that, such as <a href="https://obsproject.com/forum/resources/obs-studio-send-an-udp-stream-to-a-second-pc-using-obs.455/" target="_blank">this one</a> which suggests sending and receiving over UDP. However, as far as I can tell, this is only possible with at least two computers - it is impossible to send and receive on the same computer without doing weird networking hacks. This was a dead end for me for a long time. I was looking up the possibility of named pipes or other IPC between the ffmpeg inside OBS Studio and the separate ffmpeg on my system.<br />
<br />
Finally, I found <a href="https://www.reddit.com/r/Twitch/comments/42a25b/streaming_to_twitch_and_youtube_gaming/cz8uct5/" target="_blank">this reddit post</a> and suddenly everything fell into place. Basically, you just host your own minimal RTMP server on your own system, stream to it from OBS Studio, and then use it as an input to ffmpeg. Heck, if you don't need to re-encode the stream at all, you can literally use just the RTMP server to rebroadcast to Twitch and YouTube simultaneously without needing ffmpeg at all.<br />
<br />
You should be able to <a href="https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/" target="_blank">follow along</a> in order to set up your copy of nginx on either Linux or Windows. For Windows specifically, I've found that the "nginx 1.7.11.3 Gryphon.zip" version works and includes RTMP support, though it is rather outdated coming from 2015 and I would discourage you from opening it up to the internet in any capacity. If you're more experienced you could try building the latest and most secure versions of everything yourself.<br />
<br />
If you plan to just use nginx to restream to both Twitch and YouTube without using ffmpeg, be sure to adjust your streaming bitrate and such in OBS Studio - Twitch is the main limiting factor as YouTube will happily accept anything your upload speed can handle. If you'll be using ffmpeg however, I recommend configuring OBS Studio to stream lossless with fast encoding time, and then we'll be doing the actual lossy encoding in ffmpeg (this way you don't double-encode lossy video). You can use a software or hardware encoder in OBS Studio for this purpose, whichever works best for you.<br />
<br />
Once you've installed nginx and added the minimum test configuration for the RTMP server, all you have to do is stream to it from OBS Studio <a href="https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/" target="_blank">as documented</a> and then you're all set to use it as an input to ffmpeg. Here's an example command line to test it out without actually streaming anywhere so you can get an idea of the quality:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">ffmpeg -i "rtmp://127.0.0.1/live/test" -c:v h264_amf -usage lowlatency -rc cbr -b:v 4000k -c:a copy twitch-recording.flv -c:v h264_amf -usage lowlatency -rc cbr -b:v 7500k -c:a copy youtube-recording.flv -c:v hevc_amf -rc cqp -qp_p 20 -qp_i 20 -c:a copy local-recrding.mkv -c:v copy -c:a copy raw-recording.mkv</span><br />
<br />
In that command line there is one input (the RTMP stream from nginx) and four outputs (all saved to files with different encoding settings so you can compare the quality of each). Obviously when you are actually streaming you'd only need two or three outputs depending on whether you want to record locally or not. The audio is just copied from OBS Studio as-is, since it is already fine for Twitch and YouTube. The h264_amf and hevc_amf encoders for AMD graphics cards can be swapped out for h264_nvenc and hevc_nvenc for NVidia graphics cards. If you want to use Intel graphics for some reason, you can use h264_qsv. Be sure to use "ffmpeg -h full" and search for the encoder you are using to make sure you specify the correct options, as they differ from encoder to encoder.<br />
<br />
If you can run the above command and your system doesn't catch fire, you should be more than ready when it comes time to actually stream. It is very important to note that you should always stop ffmpeg first before stopping the stream in OBS Studio. You can do so by pressing q or Ctrl+C (once) in the command prompt window or terminal where you are running ffmpeg. Then you can stop streaming in OBS Studio. If you want to shutdown nginx, run "nginx -s stop" in the directory with the executable.<br />
<br />
To actually stream to Twitch and YouTube using your stream keys, you'll want to use a command like this:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">ffmpeg -i "rtmp://127.0.0.1/live/test" -c:v h264_amf -usage lowlatency -rc cbr -b:v 4000k -c:a copy -f flv "rtmp://live.twitch.tv/app/YOUR-TWITCH-KEY-HERE" -c:v h264_amf -usage lowlatency -rc cbr -b:v 7500k -c:a copy -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR-YOUTUBE-KEY-HERE"</span><br />
<br />
This will take your stream and send 4000kb/s to Twitch and 7500kb/s to YouTube. It won't create a local recording, but that's easy enough to figure out from the earlier command. Again, you can substitute the encoders for NVidia or Intel's encoders. It's also possible to use software encoding with an encoder like libx264 but that will take a lot of CPU usage, which is why I recommend the hardware encoders instead. Also keep in mind you are likely to have better driver support on Windows.<br />
<br />
By the way, if you're new to YouTube streaming, I recommend that you DON'T use the "Stream Now" beta - it's still quite buggy and your stream archive will end up several pages back in your video manager making it hard to find. Instead, <a href="https://www.youtube.com/my_live_events" target="_blank">create a scheduled event</a> - this has several advantages: firstly, subscribers will see the stream notification like any other video in their subscription feed, letting them click "Set Reminder", and when they visit the stream URL they will see a countdown (so you don't have to do a countdown yourself). Secondly, if you stop your stream for any reason (system crash, power loss, internet outage, etc), the stream will not actually end until you click the Stop button on YouTube's livestream dashboard. You can literally stop streaming for an hour to eat, and then start again, and it will pick up like nothing happened. There will be no gap in the stream archive, just an instant cut. Just remember to always stop ffmpeg before you stop OBS Studio or bad things happen. If your internet goes out, stop ffmpeg and let OBS Studio keep streaming to nginx, then when you have internet again you cam start ffmpeg again.<br />
<br />
Unfortunately Twitch isn't so kind, any interruption of your stream that lasts more than a few seconds will split your Twitch stream in half, making two separate archives. Viewers on Twitch also won't be able to rewind the stream and catch up to live at 1.5x/2x speed like they can on YouTube with YouTube DVR. Additionally, if you are a Twitch affiliate or partner, you are not allowed to use any streaming service other than Twitch, meaning you read this whole article for nothing. YouTube doesn't have such an exclusivity clause.<br />
<br />
It's a shame, because Twitch and YouTube are pretty similar as far as features for streamers go: they both offer monthly paid subscriptions ("Subscribe" on Twitch and "Sponsor" on YouTube) and they also both offer paid chat messages ("bits" on Twitch and "Super Chats" on YouTube). Another thing to consider is that Twitch allows you to upload videos just like you would to YouTube, so you can upload to both just like you stream to both. Unfortunately, Twitch Uploads can't be monetized unless you're an affiliate or partner, which would prevent you from streaming on YouTube. Thankfully, the YouTube "Sponsor" feature is still available whether you stream on YouTube or not.<br />
<br />
And no, this isn't a paid post, I'm just making sure newcomers are fully aware of the ins and outs of each platform, since this article is about streaming to both after all.<br />
<br />
If you have any questions or trouble getting things set up, feel free to comment and ask - I prefer public communication so that others with the same problem can see that and get an answer too. If you need help learning to use OBS Studio, <a href="https://www.youtube.com/playlist?list=PLzo7l8HTJNK-IKzM_zDicTd2u20Ab2pAl" target="_blank">here's a great tutorial series</a>. If you need help using ffmpeg, I'd recommend lots of Google searches, reading the wiki, reading the help, reading the documentation, etc. If you need help using nginx, I'm not sure what you did wrong but I wish you luck in fixing it.Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-45535775564892704092017-10-06T00:51:00.001-05:002021-05-28T13:13:07.780-05:00Why I prefer minimalist art styles in gamesI'm a big fan of minimalist art styles in games - simple lines and shapes, dashes of color, the occasional complex geometry, etc. I like the way it looks, but there's more to an art style than just the way it looks.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1le5k_MlVHP3koRMz65m6Bp0s7UJlaUhcjvd5PQ8T_k1dDKJ-VaDZjp9gt1fu6krO9Jaott6N1EzfZ7AkYMbMm_TjKi4RvRXawUNhzA6V4V9a1kHGadnBlvhWPJTkd-IasS5ywjdh7WfD/s1600/mini-metro.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1le5k_MlVHP3koRMz65m6Bp0s7UJlaUhcjvd5PQ8T_k1dDKJ-VaDZjp9gt1fu6krO9Jaott6N1EzfZ7AkYMbMm_TjKi4RvRXawUNhzA6V4V9a1kHGadnBlvhWPJTkd-IasS5ywjdh7WfD/s640/mini-metro.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mini Metro. Image from official press kit. Check out the <a href="https://www.youtube.com/watch?v=kmHXk4Y35QM" target="_blank">GDC talk</a>.</td></tr>
</tbody></table>
Games have had a long history of trying to mimic reality, especially big-budget games made by large companies for mass audiences. It can be impressive to see how far technology has come, but basing games in realistic worlds runs counter to game design. Real life has a lot of limitations, and games based on real life have to devote a lot of effort to explaining why you can do things that can't be done in real life, or they blatantly ignore such conflicts and go for the "it's just game logic" option. Whether or not you care about immersion, this is a problem that wouldn't exist if the game wasn't based in reality.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHYlgukXPnemWP4XgAT_4OPlEgMRn63H4SAleJhgWYlWNR7nCbKQfMjDSSbiwWwHaJw1sb81JZDHu1tpseN_JKmO1YkkQWqQ3R7_9Lz2BBlggrTe914ZxRcdy2sMoTEaUnUfsicQCp1LLq/s1600/rise-of-the-tomb-raider-8.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1000" data-original-width="1600" height="396" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHYlgukXPnemWP4XgAT_4OPlEgMRn63H4SAleJhgWYlWNR7nCbKQfMjDSSbiwWwHaJw1sb81JZDHu1tpseN_JKmO1YkkQWqQ3R7_9Lz2BBlggrTe914ZxRcdy2sMoTEaUnUfsicQCp1LLq/s640/rise-of-the-tomb-raider-8.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Rise of the Tomb Raider. Image from vg247.com. The player is expected to believe this is real life, but rapid healing is never explained.</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Some games are quite clever with how they dodge bullets - they set themselves in futuristic settings, or make magic real. While this typically works for the story, it doesn't always work for the gameplay. At the end of the day, someone has to play the game, and ideally they have to enjoy it. It's hard to fully enjoy a game when you know it's being held back by the pseudo-real laws of reality the designers trapped themselves in.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWBexmgxftIn-7ALgRpznxycno30gsClIO83VazXHQW89W_wgHk9v9K-_NzUM4zZglTI69peND9pI017SGd4krLsZN9yqtYfzdJpcyQWETNy0x9KvF9TIcxugPUxOBzPFf8wdD9HghbvwY/s1600/ECHO_Screenshot_Vault.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWBexmgxftIn-7ALgRpznxycno30gsClIO83VazXHQW89W_wgHk9v9K-_NzUM4zZglTI69peND9pI017SGd4krLsZN9yqtYfzdJpcyQWETNy0x9KvF9TIcxugPUxOBzPFf8wdD9HghbvwY/s640/ECHO_Screenshot_Vault.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ECHO. Image from the official press kit. The game is set in the far future within a planet-sized palace with highly advanced technology.</td></tr>
</tbody></table>
Reality lends itself well to stories because it's been the setting of an overwhelming number of stories for thousands of years. However, many of those stories have also bent reality under the guise of dreams or exaggerated tales. Walking simulators are a great example - while their gameplay is lacking, their stories can be quite fascinating, alternating between reality and imagination as if the player was supposed to know all along that the world didn't follow the same rules as real life. I don't personally enjoy the act of playing such interactive media, but watching others play is as enjoyable as watching a good movie.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEQxWyzrVrTTMTj1JEX9CkdS3-svWcl48FOBRL7snHyA-ZeDuR__NJMF9VK1AX2TAbvPLelTtrJSzfhtju6MwObQZwDEoiR3pBFQCXxRs6FXZgdwDTG_Pa17bgUF9rByfhWTYib74RfhV6/s1600/what-remains-of-edith-finch-screen-02-ps4-us-21mar17.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEQxWyzrVrTTMTj1JEX9CkdS3-svWcl48FOBRL7snHyA-ZeDuR__NJMF9VK1AX2TAbvPLelTtrJSzfhtju6MwObQZwDEoiR3pBFQCXxRs6FXZgdwDTG_Pa17bgUF9rByfhWTYib74RfhV6/s640/what-remains-of-edith-finch-screen-02-ps4-us-21mar17.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">What Remains of Edith Finch. Image from PlayStation store page. The game takes place in real life but frequently shifts into tall tales.</td></tr>
</tbody></table>
But what if you want better gameplay and don't care too much about reality? Games with colorful art styles have far fewer chains holding them back - they can break more rules because they don't look like reality, therefore people don't assume they follow the same rules as reality. Every unexpected element is just a part of how this fictional reality works, and that's okay because the game is the only reference you have for that kind of reality, and it sets the rules for you. There's still a tendency to compare many aspects to real life, but the suspension of disbelief is much easier to maintain.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQF5aqGyaDc4mZOdE-nuzXzc5bVpoL2u4364hZRGPhOiTAXIxD28PLOyDnqHR2fYi0aXBDLHe8lxeAAuMO13TpAGFwBQAoPQJKLCc5rg9o_09vvWJ-yTZ-kLERsxIZpvbNEGPRhw1WUnYC/s1600/witness-nature-panels.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQF5aqGyaDc4mZOdE-nuzXzc5bVpoL2u4364hZRGPhOiTAXIxD28PLOyDnqHR2fYi0aXBDLHe8lxeAAuMO13TpAGFwBQAoPQJKLCc5rg9o_09vvWJ-yTZ-kLERsxIZpvbNEGPRhw1WUnYC/s640/witness-nature-panels.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The Witness. Image screenshotted by me. The nature suggests reality but the technology is all for show.</td></tr>
</tbody></table>
But art styles other than photorealism can still restrict the gameplay. Whatever art style a game chooses inherently limits the game to what makes sense in that art style. Some art styles are more restrictive than others, such as photorealism and whatever Nintendo is doing to Paper Mario: Color Splash. The presentation of the game sets the bar for what the player is willing to believe can happen in the game, and mismatching the art style with the game's reality often doesn't work. It can leave players wondering if they even understand the art style.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfYKudaHKfgrrPweSxImt39NlGvfnf89mTAi72bJlK_jS-7zaVMR1ji8pwv5tUtsSlkmzxCVYbsaLQTkOQ50-FfObbIjkh4ltlNoItZRkgXSjgy43HbJuTmqD_PsYyStShejMtwqQNT1r_/s1600/duskers-sentry.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfYKudaHKfgrrPweSxImt39NlGvfnf89mTAi72bJlK_jS-7zaVMR1ji8pwv5tUtsSlkmzxCVYbsaLQTkOQ50-FfObbIjkh4ltlNoItZRkgXSjgy43HbJuTmqD_PsYyStShejMtwqQNT1r_/s640/duskers-sentry.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Duskers. Image screenshotted by me. The game convinces you you're a drone operator looking at staticy live feeds on computer screens, but then you can still see drone feeds when your screen is supposedly broken and stopping you from seeing the ship layout, thus the story and art style contradict the gameplay and experience.</td></tr>
</tbody></table>
At some point along the spectrum of art styles, you end up on the opposite end from photorealism: minimalism. In minimalist art styles, you use the bare minimum of shapes and colors to convey the game's world to the player, leaving the gameplay as the focus. Instead of having to come up with contrived reasons for why the player has to do something or why the player cannot do something, you just tell the player outright and the accept it. There is no preconceived ruleset for how the world should function, and what the game says is law.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8KOX5T9EgBlGTOAxbMUniaDM7YA919q0pxfEaQNs9PQhjIwGq_zOfepBtBBt4a-PCQyVAzsnx6DFdZ_Vq8adhCjSykmfJ2XM-LHzfC08YRoWWOeauQ-X7k6BS8qTn860xfr-CdWdZfS6j/s1600/antichamber-walk.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8KOX5T9EgBlGTOAxbMUniaDM7YA919q0pxfEaQNs9PQhjIwGq_zOfepBtBBt4a-PCQyVAzsnx6DFdZ_Vq8adhCjSykmfJ2XM-LHzfC08YRoWWOeauQ-X7k6BS8qTn860xfr-CdWdZfS6j/s640/antichamber-walk.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Antichamber. Image screenshotted by me. The game is focused on learning the rules of the world in order to explore. It is very clearly not set in reality.</td></tr>
</tbody></table>
This affords so much more freedom for a game to explore its gameplay mechanics in whatever combinations it pleases. It also maintains a permanent suspension of disbelief because the player believes everything they see, having no reference to find inconsistencies with. Games with minimalist art styles need only teach the player what everything means and how it works, and then the game can challenge the player to test that knowledge. As you would expect, minimalism lends itself well to puzzle games, but it can also work well for other types of games, such as those featuring combat.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdZOQo3iAEBxf_TK7AegJxYywY5IKg6ks7NdpZh1aY_fekKtp5Bt-KBNDIENP9yezpt0wCgeCnPUxya4Qmy-ZphOQ0JTZ8R43pXnttuoALqT2CSupcPAB6BLmSA1JBn-3podlAINgadg2V/s1600/superhot-bullets.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdZOQo3iAEBxf_TK7AegJxYywY5IKg6ks7NdpZh1aY_fekKtp5Bt-KBNDIENP9yezpt0wCgeCnPUxya4Qmy-ZphOQ0JTZ8R43pXnttuoALqT2CSupcPAB6BLmSA1JBn-3podlAINgadg2V/s640/superhot-bullets.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">SUPERHOT. Image from official press kit. While the environments look like they could be in the real world, they merely serve as creative obstacles.</td></tr>
</tbody></table>
Unfortunately, many games with minimalist art styles often fail to explore their full potential, probably because developers are used to working within the limited confines of other art styles closer to photorealism. The sky isn't the limit because there need not be a sky, only your ability to convey information to the player limits what you can do. Compared to the noisy environments of photorealistic games that players have to learn to ignore 90% of, minimalism offers an unprecedented lack of distractions. Because of this, players can take in much more relevant information from a scene and remain much more observant. The use of simple shapes and colors makes it easy for people of all ages and backgrounds to pick up and play a game with a minimalist art style, and leaves a lot of room on the table for challenging more advanced players.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiboeBV-2PYzIYO21cg_qraRx5WkNq7TgXRfffdptGwXphPPXoLPdD3C7PoxxmLBL1aZqTvvp3i2Vnzlcq2JmodYpx1nr_Pc02jTPJxrJxz59uA4PLFwY-zOUxGLLQZA1ieX56mm09lvJOm/s1600/disoriented.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiboeBV-2PYzIYO21cg_qraRx5WkNq7TgXRfffdptGwXphPPXoLPdD3C7PoxxmLBL1aZqTvvp3i2Vnzlcq2JmodYpx1nr_Pc02jTPJxrJxz59uA4PLFwY-zOUxGLLQZA1ieX56mm09lvJOm/s640/disoriented.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Disoriented. Image from Steam store page. Extremely disappointing as the puzzles never get more challenging, just more tedious.</td></tr>
</tbody></table>
Some common criticisms that I often see of games with minimalist art styles is that they are lazy, and that they all look the same (or more recently, that they all look like Antichamber). While developers often intentionally choose an art style that they have the ability to pull off, it isn't always out of laziness. There will always be developers who take the lazy approach, but the point of a minimalist art style isn't to look impressive, it's to focus on the gameplay. If the gameplay is lazy, then yes, the art style is probably lazy too. But if the gameplay, experience, or story is great, the minimalist art style can suit it, lazy or not.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1TlmA73B0iS97PCWPX8WmvIwMkhUJ3zW8px-FRNV9RCREKynX-56Rd_tpW6Oo2452DV9rh-uK6lRqN0xAGC0KejslFo05gLKu_AQbtZvBJDoADNpv0zZmdPYHi1let4F2geYXlJfWlnCf/s1600/LIMBO_03.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1TlmA73B0iS97PCWPX8WmvIwMkhUJ3zW8px-FRNV9RCREKynX-56Rd_tpW6Oo2452DV9rh-uK6lRqN0xAGC0KejslFo05gLKu_AQbtZvBJDoADNpv0zZmdPYHi1let4F2geYXlJfWlnCf/s640/LIMBO_03.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">LIMBO. Image from official press kit. While the gameplay and story are nothing to write home about, the experience lends itself well to the minimalist art style.</td></tr>
</tbody></table>
As for many minimalist games looking the same, I could say the same about photorealism, animated movies, traditional movies, etc. A game's identity isn't supposed to be its art style. The gameplay, the experience, and/or the story should serve as the identity, while the art style merely serves the needs of those three. Make the game first, and then pick the art style that best suits the game afterward. Picking the art style first can box you into a corner and cause you to waste time if you change your mind. I feel that many games would be much better if they were in a different art style - not because changing the art style magically makes the game better, but because it allows (or disallows) different possibilities as needed. Minimalism is actually best suited to a focus on gameplay, and shouldn't be used if you want to focus on the experience or story of a game instead.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/nhQ66CozrgY/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/nhQ66CozrgY?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: x-small;">Watch this if you're confused by my use of the word 'experience'.</span></div>
<br />
At the end of the day, I like the potential that minimalism offers over other art styles, but I also just like the way it looks. Despite many minimalist games not reaching their full potential, I still get excited when I see a new game featuring simple shapes and lines. You never know when a developer will finally realize that they can do everything and more with minimalism. One day I hope to even create a couple minimalist games myself.Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-72809078418362179252017-06-22T16:30:00.001-05:002021-05-28T13:12:45.628-05:00What makes puzzle platformers challenging? What makes them good?I'm a big fan of puzzle platformers - games like Portal 1 and 2, The Talos Principle, The Swapper, etc. - and I've logged many dozens of hours playing such games, mostly due to community-made puzzles. In fact, I've played over 500 community maps for Portal 2, and I've learned quite a bit along the way. Someone asked me an interesting question that really got me thinking:<br />
<blockquote class="tr_bq">
When do elements that are individually passable become insurmountable or too convoluted when stacked together?</blockquote>
It's a great question, and I think the answer depends on a few factors: how many options plays have at each step, which options players are likely to actually notice, and what players typically think about each option. Every player is different, but that doesn't mean you can't estimate the qualities of a puzzle without players.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2c6gZnpJPcrwGayR8lPvYB2KF5AulPbObneiE3MKkSOtJJX6H_64pzV_lRET6O8tGXvPZFqJj8DHh99bC6yOdYPLXEmwUp2vh8292TUawfckuFmwemFCPwtnj0_bkisoov6FiJqfsYB_B/s1600/three-buttons.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2c6gZnpJPcrwGayR8lPvYB2KF5AulPbObneiE3MKkSOtJJX6H_64pzV_lRET6O8tGXvPZFqJj8DHh99bC6yOdYPLXEmwUp2vh8292TUawfckuFmwemFCPwtnj0_bkisoov6FiJqfsYB_B/s640/three-buttons.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">How many options does a player standing in the center of the room have?</td></tr>
</tbody></table>
An 'option' is an action the player can perform to change the state of the puzzle, and it can either have forward progress (they get closer to the solution), negative progress (they create more work for themselves), or no progress (the option isn't part of the puzzle currently). Moving two steps to the left isn't an "option" unless it changes the state of the puzzle (e.g. the player starts or stops being in the way of a light ray, or steps onto or off of a pressure plate). Placing an object at X, and placing an object a centimeter to the left of X aren't separate options unless they have different results. In the above image, the player has two neutral options and one positive option.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiawU5ie64_acDINRPcrthQoQOOIS9vjLlPa3FOtM58ZgOPlo5lZAv_hc2_RzqebCaRT-gkpiKerhRFO3zDhxd0dSfNHfvcB9a0MX8cctzSqJO-j88vwvmw03HMYEdEuBafvfWny56Ye1Hg/s1600/two-options.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiawU5ie64_acDINRPcrthQoQOOIS9vjLlPa3FOtM58ZgOPlo5lZAv_hc2_RzqebCaRT-gkpiKerhRFO3zDhxd0dSfNHfvcB9a0MX8cctzSqJO-j88vwvmw03HMYEdEuBafvfWny56Ye1Hg/s640/two-options.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Why should the player press the pedestal button on the left at this point?</td></tr>
</tbody></table>
Knowing what the options are is only half the battle - the player has to actually understand what those options do for them. Players have a natural desire to avoid options that look like they would result in negative progress - you don't typically see players jumping into lava believing that it might advance the story. But sometimes, they do make mistakes, and misjudge options. This is where challenge comes from: looking for options and figuring out if they are good, bad, or neutral at each step of the puzzle.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHtZdsbVH5KijzMtwCtYA6i1ZQHHtRztfTuPImyY_4Y6ltBOQzqCSCmGbNpi9JztP3jrKfoIz9we7m6aBRCElWHMUD6eoKB44fb6DbaetDDK9eIY4ew9fabb0XS5xNUMwPchLByuSz0uEi/s1600/planning.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHtZdsbVH5KijzMtwCtYA6i1ZQHHtRztfTuPImyY_4Y6ltBOQzqCSCmGbNpi9JztP3jrKfoIz9we7m6aBRCElWHMUD6eoKB44fb6DbaetDDK9eIY4ew9fabb0XS5xNUMwPchLByuSz0uEi/s640/planning.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Should you put the cube on the button, or take it somewhere else first? What's a safer assumption? Why?</td></tr>
</tbody></table>
There's two ways to solve puzzles: you can plan things out in advance, or you can evaluate your current options and pick the one that looks the best. Generally players use a combination of both tactics, so they start acting before they have the entire solution in their head, or even the entire puzzle. Sometimes it isn't possible to see the entire puzzle without acting, making it a necessity to just start doing things with little planning.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNIH2Q612aN0ufT1oeIRwvOIsxDN2tXh1iXMwXXpwGXnKrRlneDPJ2sLfIEXvOnkKYLp7AjSeTYWQYu3NSGhpJw9XCmfdo4mfrAqrwIQgw3M29gEu0R0an0zwhrV9-25_4PXstM2NksdBg/s1600/why-ramp.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNIH2Q612aN0ufT1oeIRwvOIsxDN2tXh1iXMwXXpwGXnKrRlneDPJ2sLfIEXvOnkKYLp7AjSeTYWQYu3NSGhpJw9XCmfdo4mfrAqrwIQgw3M29gEu0R0an0zwhrV9-25_4PXstM2NksdBg/s640/why-ramp.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">This ramp just leads to a bottomless pit, but it isn't there for decoration or aesthetics.</td></tr>
</tbody></table>
A puzzle is challenging when it is difficult to distinguish between forward progress options and negative progress options. Challenge does not come from not knowing what the options are, it comes from not knowing whether to even try an option in the first place. Brute force works as long as there are no trapping situations, but experienced players know that brute force is not fun, and thus they evaluate their options to determine which to try. Since every element of a properly designed puzzle will be used at some point, the question is <i>when</i> to choose options - what state does the puzzle need to be in for a normally negative option to be positive?<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpWGXgQBlcc5zlkOjXMSeBtAbJmR0qavfPdITVmZi6ammhnZaDPhCT9vYCWYswVcWuhT3flvyIQDZdohB5HoFG40-10s0eDCgHne2hiGuN6oV5m-Vs-l4GQOwnEwtMECO4bYLYgFlOVCsD/s1600/maze.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpWGXgQBlcc5zlkOjXMSeBtAbJmR0qavfPdITVmZi6ammhnZaDPhCT9vYCWYswVcWuhT3flvyIQDZdohB5HoFG40-10s0eDCgHne2hiGuN6oV5m-Vs-l4GQOwnEwtMECO4bYLYgFlOVCsD/s640/maze.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Quick, use logic to solve this maze on your first try without running into any dead ends or loops!</td></tr>
</tbody></table>
Easy puzzles make the options easy to distinguish, whereas hard puzzles make the options relatively indistinguishable. An analogy would be that easy puzzles have high contrast and hard puzzles have low contrast. However, there needs to be at least some contrast - otherwise the player is left with brute force. A maze has no contrast because all options look the same. An arrow on the ground telling the player where to go has too much contrast because there is no mental effort required to determine the solution.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnKXk4czDPxfMyqkUyxEFzPgMmbzes2LlcCxa1mHuOLdnXoBItN0WReTOK9QERD59BhcC5noFYs_CA-gAoM5dh_NzWLx3bjHpnr-KD5yz4QLZvjVUI1JVBScJSOaW08MTEwzZUDnHT2EkI/s1600/pointless.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnKXk4czDPxfMyqkUyxEFzPgMmbzes2LlcCxa1mHuOLdnXoBItN0WReTOK9QERD59BhcC5noFYs_CA-gAoM5dh_NzWLx3bjHpnr-KD5yz4QLZvjVUI1JVBScJSOaW08MTEwzZUDnHT2EkI/s640/pointless.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Not only does <a href="http://steamcommunity.com/sharedfiles/filedetails/?id=817466596" target="_blank">this map</a> present no challenge due to high contrast, it is possible to become trapped.</td></tr>
</tbody></table>
Challenge is only part of the story, though - puzzles of any challenge level can also be good or bad. It's easy to point to specific problems that make puzzles worse: trapping situations, too many negative options that look positive, lack of negative options, and too much contrast for the player's skill level. A puzzle with only one option at each step is no puzzle at all, nor is a puzzle where all the options result in positive progress, as it makes the player feel like their choices don't matter.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiq73oswe7uw1ArQy_tJwWfHl-xzR7GoA4aoopo_wV_3RQ6oicn5LQ6DXZZME1gjkrJv-okQekRMcxKzc9d7hUhZCzJxHlV3qS1FVnslrDaym2dP574fiY7w_gMYzTfzb3VBg44398eIF5/s1600/unforgiving.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiq73oswe7uw1ArQy_tJwWfHl-xzR7GoA4aoopo_wV_3RQ6oicn5LQ6DXZZME1gjkrJv-okQekRMcxKzc9d7hUhZCzJxHlV3qS1FVnslrDaym2dP574fiY7w_gMYzTfzb3VBg44398eIF5/s640/unforgiving.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Although <a href="http://steamcommunity.com/sharedfiles/filedetails/?id=109384161" target="_blank">this map</a> is logically challenging, it is overly punishing. Here the player needs enough velocity to get to the exit, but the most intuitive way to gain velocity gives the player too much, resulting in their death.</td></tr>
</tbody></table>
On the other end of the spectrum, tricking the player too frequently with negative options that look positive can be frustrating and even rage inducing. While players should be able to make mistakes, the punishment shouldn't be severe on a regular basis. The map featured in the above image is by far the most punishing map I have played - every mistake the player makes results in having to redo a large majority of the puzzle to get back to where they were and try again.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-TTyEFN7cPX3-an7zzOzJaU6KhK2hbl0QJ6UkviF1c83NcqxUySgru9OvDEUu6IhkqgBriImX4ZUfummqHlbz9lrpHN1gAClzasSBIkNfAWXt7pm2ya2BYRt_Iy4N6XlbmaOZOd_HgS11/s1600/attention-span.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-TTyEFN7cPX3-an7zzOzJaU6KhK2hbl0QJ6UkviF1c83NcqxUySgru9OvDEUu6IhkqgBriImX4ZUfummqHlbz9lrpHN1gAClzasSBIkNfAWXt7pm2ya2BYRt_Iy4N6XlbmaOZOd_HgS11/s640/attention-span.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In <a href="http://steamcommunity.com/sharedfiles/filedetails/?id=515183757" target="_blank">this map</a>, the button opens the exit, so naturally the player spends most of their time trying to get a cube into this area to place on the button. But unless they first get blue gel underneath the angled panel and in certain other key locations, getting the cube in this area is just a massive amount of negative progress that the player believes to be positive progress.</td></tr>
</tbody></table>
It's important to remember that the player has to reconsider all options every time they change the state of the puzzle. Having too many options and/or too many puzzle states can be mentally exhausting, rather than challenging. It's also a bad idea to allow for the player to make considerable negative progress without realizing it - the player should be able to determine that they have made a mistake relatively quickly. The feedback loop should fit within the player's attention span so that they can still remember the moment when they made the mistake. Otherwise the player can feel as though they are wandering around aimlessly trying random things without making any discernable progress. However, it's fine to make it difficult to determine when positive progress has been made - this can make the player feel like they solved something above their skill level.<br />
<br />
Having options that never change between puzzle states can make the puzzle feel cluttered. For example, a cube that only needs to be put in one place and then never moved from that position is effectively clutter. Either the cube and its requirement should be removed, or new requirements should be added so that the cube must be used more than once. If the challenge is simply to get the cube there in the first place, then it could probably be replaced with a button for the player to press.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYpNJz2Ti86kggGskCHSOUL6glgcK8psfiPtxhFLd1kTIcNvDld8MtlR6K8uCBKbNkT3UVgNc9DMdcO-FC5AwjHsmumSu2ckGjD6T7EiCpDyCCUOrdnQP6gZOMWWClrHvpoGWJjiyRH4HZ/s1600/overwhelming.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYpNJz2Ti86kggGskCHSOUL6glgcK8psfiPtxhFLd1kTIcNvDld8MtlR6K8uCBKbNkT3UVgNc9DMdcO-FC5AwjHsmumSu2ckGjD6T7EiCpDyCCUOrdnQP6gZOMWWClrHvpoGWJjiyRH4HZ/s640/overwhelming.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Every time you change the puzzle state in <a href="http://steamcommunity.com/sharedfiles/filedetails/?id=828435925" target="_blank">this puzzle</a>, you have to carefully re-evaluate the surprising number of options again, making it difficult to plan ahead at all.</td></tr>
</tbody></table>
On the other end of the spectrum, having options that change too frequently between puzzle states can make the puzzle feel overwhelming. It's important that some options stay constant for a while as others change, so that the player doesn't have to focus on everything all the time.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizbVww-dj38jr_IUSdy_0AEHvdWzPSJ_38WHD5dgvBsYJXg-l7GpraTmsCBHVApvEz3qZfcHTQhIWJjz4Ej_VC5dFYO_VgH3wxUMb_kBjsy2Dl_NCNCgifXm6FoNGU6nimeQ8o5XO-gdGl/s1600/bidirectional.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizbVww-dj38jr_IUSdy_0AEHvdWzPSJ_38WHD5dgvBsYJXg-l7GpraTmsCBHVApvEz3qZfcHTQhIWJjz4Ej_VC5dFYO_VgH3wxUMb_kBjsy2Dl_NCNCgifXm6FoNGU6nimeQ8o5XO-gdGl/s640/bidirectional.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In this puzzle, the player is meant to learn that they can travel through portals in both directions, if they haven't already. The design of the puzzle forces the player to exit the pre-placed portal, move their own portal elsewhere, and then re-enter the pre-placed portal.</td></tr>
</tbody></table>
But what if you want to teach the player something without challenging them, while still making a good puzzle? Good easy puzzles are typically tutorial puzzles that teach the player something new, either by carefully using contrast to highlight the new information, or by reducing the number of options such that the player naturally chooses to use the new information. The puzzle featured above has very few distinct options, even if the player doesn't yet grasp what those options are.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU7WMDdGxCf8TAeC68__QYm0ZmAp_je59G2IhP7uID2at0VxaMde4989Xz49mGgY0Odrx0bIoQylKB_pvwB-jvJnNFCo0pVHZ9TqjyWNLLOETOu0OrmawuxNGoen0_M2pyqIqVuq_u-l_m/s1600/contrast.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU7WMDdGxCf8TAeC68__QYm0ZmAp_je59G2IhP7uID2at0VxaMde4989Xz49mGgY0Odrx0bIoQylKB_pvwB-jvJnNFCo0pVHZ9TqjyWNLLOETOu0OrmawuxNGoen0_M2pyqIqVuq_u-l_m/s640/contrast.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">An example of high contrast.</td></tr>
</tbody></table>
In the above image, there are many more options, but there is high contrast directing the player's attention: the player intuitively understands that each cube belongs on a button, and won't waste time putting the cubes anywhere else once they obtain them. This lets the player quickly rule out options that don't result in forward progress.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7bMIzV7KzIA049Bl0PCpsU2ocuhyphenhyphenP4xbTMTTatdGOEk3iIWkn5UzU50EGZxvSiWbp2pT6cZYqhwixhX1Dv1ACpl8K71AXTotsmyg4DfVQrLKsZ-hEF5JB0YG1HTPxckx1KPgZnQsBbuSq/s1600/lumps.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7bMIzV7KzIA049Bl0PCpsU2ocuhyphenhyphenP4xbTMTTatdGOEk3iIWkn5UzU50EGZxvSiWbp2pT6cZYqhwixhX1Dv1ACpl8K71AXTotsmyg4DfVQrLKsZ-hEF5JB0YG1HTPxckx1KPgZnQsBbuSq/s640/lumps.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Being able to disable the barrier blocking the star requires some extra steps that first-time players wouldn't try.</td></tr>
</tbody></table>
High contrast can be used in specific instances of more challenging puzzles to reduce the challenge of a particular aspect of the puzzle, and low contrast can be used in easier parts to boost the challenge. This allows for keeping a puzzle feeling consistent, rather than lumpy. Lumpy puzzles have some parts that are either far easier or far harder than the rest of the puzzle, and it can make the puzzle just seem weird - the lumps don't fit naturally with the rest of the puzzle. If you want to hide secrets, however, then lumps are the way to do it, as seen above in The Talos Principle.<br />
<br />
Of course, many of these principles apply to more than just puzzle games, but puzzle games are my favorite.Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-10148312442718737262016-02-25T08:17:00.001-06:002021-05-28T13:12:02.405-05:00FizzlersI haven't really studied game design much, but seeing as I want to make games, I figured I had better at least pay attention to the games I play and see what I can learn from their design. I've learned a lot of things about game design and a lot of things about myself - namely, I like puzzle games, and there's a trend in puzzle games that makes them more fun for me.<br />
<br />
I've recently been playing a lot of Portal. A lot. I've played <a href="https://steamcommunity.com/id/_LB/recommended/400/" target="_blank">Portal 1</a>, <a href="https://steamcommunity.com/id/_LB/recommended/620/" target="_blank">Portal 2</a>, <a href="https://steamcommunity.com/id/_LB/recommended/317400/" target="_blank">Portal Stories: Mel</a>, <a href="https://steamcommunity.com/id/_LB/recommended/280740/" target="_blank">Aperture Tag</a>, <a href="https://steamcommunity.com/id/_LB/recommended/317790/" target="_blank">Rexaura</a>, and many, <a href="https://steamcommunity.com/id/_LB/myworkshopfiles/?appid=620&browsefilter=myplayedfiles&p=1&numperpage=30&browsesort=myplayedfiles" target="_blank"><i>many</i> community maps</a> for Portal 2. (Though I have not played anywhere near as much as <a href="https://steamcommunity.com/id/deathwish808" target="_blank">this guy</a>). One thing I have noticed consistently is that I enjoy fizzler puzzles - you know, those ones where one or more <i>Aperture Science Material Emancipation Grills</i> play a crucial role in the puzzle?<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpNSSgwIghLnRMky5nnKXRdkYP8Za-XLdbpyjywW0JEbDM_FogUWIL4Vwcw07kYUa8_YYuunjVaipIMb7JdsjHC43JApDxvG5UDXFTlTNj1opeL1lbSk8zYHZFGz3n5GOJLyU8C6q-VlML/s1600/fizzler.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpNSSgwIghLnRMky5nnKXRdkYP8Za-XLdbpyjywW0JEbDM_FogUWIL4Vwcw07kYUa8_YYuunjVaipIMb7JdsjHC43JApDxvG5UDXFTlTNj1opeL1lbSk8zYHZFGz3n5GOJLyU8C6q-VlML/s640/fizzler.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A fizzler in Portal 2, with a nearby cube to show the effect.</td></tr>
</tbody></table>
Fizzlers in Portal 2 allow you to pass through them, but they impose certain limitations. You cannot shoot portals through them, and when you pass through them your existing portals are cleared. Also, any objects that come into contact with them are fizzled - that is, destroyed. However, lasers, light bridges, and excursion funnels can all pass through them without issue. From a simple standpoint, this makes them a sort of special kind of wall that you can only pass through if you are willing to lose your portals and any carried objects. However, there is a bit more to them than that - for you see, they can also be turned on or off.<br />
<br />
If you can, you should play <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=201755717" target="_blank">The Winter Testing Initiative</a> - the last puzzle is a fizzler puzzle and had me stumped until I looked up a walkthrough. Fizzler puzzles become very challenging when you can turn off the fizzler temporarily - you suddenly have to think far more carefully about when and why you would turn it off, because when you turn it off you can shoot portals on both sides, but then you may be required to turn the fizzler back on. Suddenly, you have to keep your portals on each side of the fizzler and never touch the fizzler. You also have to decide which side of the fizzler you want objects on. It introduces a whole new level of challenge despite the rules being so simple.<br />
<br />
The Portal trilogy aren't the only games with this concept, though; <a href="http://steamcommunity.com/app/219890" target="_blank">Antichamber</a>, another of my all time favorite games, also employs fizzlers - a few different kinds, actually. Some fizzlers don't let you carry bricks through in your brick tool, but you can shoot bricks through them and move them to the other side. Other fizzlers will let you carry bricks but won't let bricks exist within them, destroying them on contact. There are also fizzlers that do both. Several puzzles in the game revolve around outwitting the fizzlers.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDtecshfKib7TM70i0whfpvLQXYzGBp1RCj3yE8U4LNav8oOCyEPWD5X-w6AorENn5S0TpKmmLtKNwXgl9jUK_tjGXICyhKZOiFy69hCP8hXj1rTreuuDSNrVHQQnorRccRbju_tPeMLOo/s1600/antichamber-fizzler.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDtecshfKib7TM70i0whfpvLQXYzGBp1RCj3yE8U4LNav8oOCyEPWD5X-w6AorENn5S0TpKmmLtKNwXgl9jUK_tjGXICyhKZOiFy69hCP8hXj1rTreuuDSNrVHQQnorRccRbju_tPeMLOo/s640/antichamber-fizzler.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A fizzler in Antichamber.</td></tr>
</tbody></table>
Another game, <a href="https://steamcommunity.com/id/_LB/recommended/231160/" target="_blank">The Swapper</a>, also features fizzlers - there are fizzlers that clear your clones when you pass through them (which are only used for story purposes and never as puzzle elements, unfortunately), but there are also red and blue light sources which block swapping and clone creation, respectively. When red and blue light overlap, it creates purple light that blocks both. Nearly every puzzle in the game uses these lights to prevent you from taking the obvious approach - in fact, the game would not work without them. The lights are also often turned on or off by switches, and the light sources themselves can even be blocked by physical objects.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8pzw-5qfTnyDTlHhmAYkWF-1zNsbWRskhL5eiudTus0TPd_jTyBTmQAuwVHp7YpZSB6r6LkMHdZOvc_qo75265TmVYGaTyI6RZp5h_OpFdZ7p9aAViGNoNKsnyvoFVgfv5wZbTbq7hYBV/s1600/swapper-fizzler.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8pzw-5qfTnyDTlHhmAYkWF-1zNsbWRskhL5eiudTus0TPd_jTyBTmQAuwVHp7YpZSB6r6LkMHdZOvc_qo75265TmVYGaTyI6RZp5h_OpFdZ7p9aAViGNoNKsnyvoFVgfv5wZbTbq7hYBV/s640/swapper-fizzler.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A fizzler (left) and colored lights (center) in The Swapper.</td></tr>
</tbody></table>
Even <a href="https://steamcommunity.com/id/_LB/recommended/210970/" target="_blank">The Witness</a> has something a little similar - what I like to call "strategic breaks". The line puzzles in the game often have breaks in the grid that prevent the line from passing that way, forcing you to use a different path. I often found that these breaks were placed in such a way so as to block all the obvious and trivial solutions, forcing me to get creative and think outside the box.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqcUlm25VjOOhNHyS1OKfxm5QZ_DP7zkq0N7bBGkxEL5_WMyPoMB9XXdlx9jvCY5fsJAiHgBpntN7mwm9GvWcMhcauFkEw5iZPuomxzIRU7NF78X5HgcViyYxFR65hdZF02Vs0QlrzHru1/s1600/witness-breaks.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqcUlm25VjOOhNHyS1OKfxm5QZ_DP7zkq0N7bBGkxEL5_WMyPoMB9XXdlx9jvCY5fsJAiHgBpntN7mwm9GvWcMhcauFkEw5iZPuomxzIRU7NF78X5HgcViyYxFR65hdZF02Vs0QlrzHru1/s640/witness-breaks.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A puzzle in The Witness with two "strategic breaks".</td></tr>
</tbody></table>
So what is it about fizzlers that makes puzzle games so much more fun and challenging, aside from the fact that the English spellings of the words both have the double Z? Well, I think it has everything to do with constricting movement in a logical manner. Fizzlers force you to act in a certain way that no other puzzle element does. Sure, a wall will block your path, and a light bridge is only so wide, but fizzlers can be turned off and they have special rules about what they allow through. They require far more strategic thinking - can I walk through this fizzler and reset my portals? Do I need the cube on this side or the other side? Can I shoot bricks under or above this fizzler and access them on the other side? Can I create a clone on the other side of the light and then switch to it after pressing this button? Can I draw my line this way and satisfy the requirements like that instead?<br />
<br />
Fizzlers require thinking about alternative solutions. They aren't always wall, because the player might be able to pass through them effortlessly. They aren't always door, because you might be able to walk through them whether they are on or off. They generally aren't deadly, though Portal 2 does have deadly player fizzlers. They don't have to be moved from point A to point B. They don't have to be stood on to satisfy a requirement. They might not even have on and off states.<br />
<br />
The interesting thing about fizzlers is that they can be found even in games which are not primarily puzzle games. Think force fields which allow passage but cannot be shot through. Sci-fi shooters are full of them. Sometimes they are even just invisible walls to prevent objects from leaving areas. However, despite the fact that you can find a fizzler in so many games, very few actually take advantage of their properties - generally fizzlers are just used to prevent the player from doing something that the developer doesn't want them to do. Things get interesting when developers use them to force the player to do something they <i>want</i> the player to do.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://i.imgur.com/EucGNB7.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://i.imgur.com/EucGNB7.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A picture I might have copypasted from the internet.</td></tr>
</tbody></table>
<a href="https://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Twilight_Princess" target="_blank">The Legend Of Zelda: Twilight Princess</a> has a very interesting mechanic in one of its dungeons. You are required to carry around cannonballs so that you can place them into cannons and destroy obstacles (walls, enemies). However, Link cannot carry cannonballs through doors - you have to set down the cannonball before traversing the door. Sounding familiar? Additionally, next to certain doors are devices in which you can place a cannonball and then retrieve it in the other room. Yes, I am saying that fizzlers exist in the Zelda universe too, they are just cleverly hidden in a puzzle mechanic. Or, rather, they <i>are</i> the puzzle mechanic.<br />
<br />
My point is, whether fizzlers are obvious or not, you can usually find them in good games, and for me the most challenging and engaging games are the ones that take advantage of their properties. But what do I mean when I talk about fizzler in the general sense? In Portal, fizzlers are a field that disintegrates objects and resets portals. In Antichamber it is much the same. The Swapper is where things get interesting - not only is there a traditional fizzler that resets your clones, there are the colored lights that I also consider fizzlers, just a different kind. The colored lights in The Swapper don't disintegrate objects or clones, but they <i>do</i> prevent using your abilities in certain areas. Where you cannot shoot a portal through a fizzler in Portal 2, you cannot swap to a clone through red light in The Swapper.<br />
<br />
What about The Witness? Surely I don't consider the strategic breaks to be fizzlers too? There are no objects to be destroyed, no guns to shoot, no switches to toggle them on or off. Well, you're right - I don't consider them to be fizzlers. I threw them in as a red herring - they are just plain ordinary walls. Basically, I <i>lied</i> to you in order to get my point across. Will you accept my apology? Yes? Good. Now let's talk about my general definition of a fizzler.<br />
<br />
To me, a fizzler is any selective filter in a puzzle game - it must allow travel for some things but not others. Things that can be filtered by a fizzler include the player, various objects, and remote abilities (such as portals as in Portal, energy orbs as in The Turing Test, or bricks in Antichamber). This definition supports fizzlers in Portal, Antichamber, The Swapper, Twilight Princess, and The Turing Test.<br />
<br />
That's it! We have a definition. Are there any other games which contain fizzlers by that definition, obvious or not? Let me know! Or don't. That's fine too.<br />
<br />
UPDATE 2016-07-20: I've played more puzzle games and found more fizzlers! It's almost as if there is a correlation...<br />
<div style="text-align: center;">
<a href="https://steamcommunity.com/id/_LB/recommended/257510/" target="_blank">The Talos Principle</a></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKwgy6Uboo81J49lzXuqm-suSIk8Q7VR0_mK_C29nZ_30OWaEqcweLG9cHMIzMHA5A1O1kuJg02YL0Ey2yPB4eAbmll8DCg0vCY1yx5qbw8tuwHyxYqUnP69mR6tSoAn95mOIfbl9f-6VZ/s1600/TalosPrinciple-Fizzler.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKwgy6Uboo81J49lzXuqm-suSIk8Q7VR0_mK_C29nZ_30OWaEqcweLG9cHMIzMHA5A1O1kuJg02YL0Ey2yPB4eAbmll8DCg0vCY1yx5qbw8tuwHyxYqUnP69mR6tSoAn95mOIfbl9f-6VZ/s640/TalosPrinciple-Fizzler.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In "The Talos Principle": a classic fizzler (left) and a toggleable barrier (right)</td></tr>
</tbody></table>
<div style="text-align: center;">
<a href="https://steamcommunity.com/id/_LB/recommended/491130/" target="_blank">Red Trigger</a></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuqOmbKGdZ5OIdn4mvi1H4Flfj4F__JRwhOB3NKC7WTfw1J4bQPv6-pXUSKrqUv8GzUBkbKRzFUEWwNW0v5mPeTEg7T8E3QKT5IsFcYc6WXk5UweERIcjeiTqectq8Q4mKeFlJx1UANrap/s1600/RedTrigger-Fizzler.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuqOmbKGdZ5OIdn4mvi1H4Flfj4F__JRwhOB3NKC7WTfw1J4bQPv6-pXUSKrqUv8GzUBkbKRzFUEWwNW0v5mPeTEg7T8E3QKT5IsFcYc6WXk5UweERIcjeiTqectq8Q4mKeFlJx1UANrap/s640/RedTrigger-Fizzler.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In "Red Trigger": a basic fizzler that resets your blocks and energy when you pass through it, but you can also shoot through it</td></tr>
</tbody></table>
<br />Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-64668986470601701502016-01-04T00:45:00.002-06:002021-05-28T13:11:03.581-05:00Why do people like puzzles with multiple solutions!?I've asked this question <a href="http://www.cplusplus.com/forum/lounge/162345/" target="_blank">before</a> and I still want to talk about it, because I still cringe when people mention it.<br />
<br />
I frequently notice reviewers and players complaining about puzzles with only one solution, saying they instead want puzzles with <i>multiple</i> solutions. I cannot wrap my head around <i>why</i>, as there are so many drawbacks both from the player's perspective and the designer's perspective. Why would people want this when it only subtracts from the experience?<br />
<br />
Having multiple solutions can either make a puzzle too easy, or too confusing. For example, the player often thinks that every part of the puzzle has a purpose (this is how our brains naturally work), but with multiple solutions, some parts of a puzzle might never be used for the solution the player uses, leading to confusion - red herrings may be enjoyable in some circumstances, but puzzles are not any of those circumstances. It is also significantly more difficult to design a proper puzzle with multiple solutions that are all the same level of challenge, especially since the level of challenge is highly subjective - for any given person, one solution will end up being easier, even if on average both solutions are about the same difficulty. This ends up watering down the puzzle, taking away some of the challenge. Having one solution be noticeably easier can often make the player feel stupid when they realize they did it the hard way, and that's not a nice feeling to have.<br />
<br />
I like the feeling of knowing I did something <i>the</i> right way. Not just one way of many possible ways, I mean <i>the</i> right way - it's idealistic because real life often doesn't have a single right answer. Real life has choices, and <a href="https://xkcd.com/1445/" target="_blank">choices are annoying</a> - they require an entirely different kind of thinking from puzzle solving and it's not something I enjoy.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://imgs.xkcd.com/comics/efficiency.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="260" src="https://imgs.xkcd.com/comics/efficiency.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">This XKCD comic perfectly describes my life and the reason it takes me so long to ever do anything.</td></tr>
</tbody></table>
<br />
If I want to make choices, I will play a game centered around choice - not a puzzle game. A puzzle game should challenge me to solve each puzzle by figuring out how all the pieces fit together, not throw possible solutions at me until one of them finally sticks. Having secrets is fine, but having entire other solutions to the same puzzle just makes me feel cheated and patronized. Weren't you confident enough in my cognitive ability to do it the right way?<br />
<br />
If this doesn't make sense to you, it might be because of how I am using the word "choice". When I say you have a choice, it means you can completely avoid one or more interactions by using one or more other interactions. In a good (single-solution) puzzle, all elements require an interaction at one point or another, so there is never any choice to be made. The puzzle is about <i>when</i> to make interactions and in <i>what order</i> the interactions should happen. I don't consider doing things in a different order as adding multiple solutions, nor do I consider walking in a slightly different way to be a different solution. You might "choose" to stand in one spot for an hour, but that's not a choice from the perspective of the puzzle.<br />
<br />
Back on track - having multiple solutions to a puzzle generally seems like a mistake to me; an oversight. It distracts me from the game and instead makes me focus on the meta aspects, which is the opposite of immersive. I shouldn't have to ponder why a puzzle element went unused, making me wonder if I abused a glitch. It gives me the impression that the puzzle was not playtested very well, or at all. It just looks awkward.<br />
<br />
I've heard people say that having puzzles with one solution is basically putting the puzzle 'on rails', but I don't even understand how that's bad if the challenge is finding out where the rail even is in the first place. Puzzle games aren't about creativity, they're about logic. I want to <i>solve</i> something, not <i>discover</i> something - there are other kinds of games that focus on discovery rather than solving, and I wouldn't be playing a puzzle game if I were interested in that instead. Besides, many people enjoy 'walking simulators', and movies are still incredibly popular despite always having the same outcome at every corner - having multiple paths and/or choices to make isn't always necessary or even desirable.<br />
<br />
I hate puzzles with multiple solutions because they subtract from the experience in so many ways and require additional effort from the developer to create them - effort that could have been spent elsewhere.Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0tag:blogger.com,1999:blog-5086508619924868752.post-54068647316552276962015-06-03T21:15:00.001-05:002021-05-28T13:09:48.614-05:00"Garbage Collection is Wrong" ExplainedMy other website, <a href="http://www.lb-stuff.com/" target="_blank">LB-Stuff.com</a>, has been the primary target for my sudden urges to write articles on various things. People keep calling them blog posts (they're not), so I finally decided to make an actual blog. I figured "Eh, I like writing, and it's more comfortable than verbal communication", so why not?<br />
<br />
The first article I wrote on my site was titled "Garbage Collection is Wrong". Yikes, what was 17-year-old me thinking? It was unintentional flamebait that ended with me having to put in a banner explaining that I didn't really know what I was talking about because I was just a teenager. Well, now I'm 20 and I still regret writing that article. I don't dare erase it, however. Sure, I often edit my forum posts dozens of times after submitting them and occasionally delete them mere seconds afterward (I am pretty impulsive sometimes and quickly regret the things I say), but I'm afraid that deleting the page would generate the wrong response. (Specifically, not a 404 or 410.)<br />
<br />
I often write in moments of passion, but I've learned over the years that I have a lot of cognitive dissonance. There's a lot of good ideas floating around in my head, and a lot of bad ones too. I don't spend too much time thinking about them, so when I finally bring them together in a moment of passion to try and form an argument, the result is... a mess. My first mess was the garbage collection article.<br />
<br />
My stance now is that GC is often used in scenarios where it is not beneficial - there are good use cases for GC, but there are more incorrect uses. But like anything related to computers, people will find a way to make it work better, and GC is decently fast nowadays. I still don't like it, but at least I've learned not to talk about things I am not very knowledgeable about. Internet people are ferocious, feral beasts that tear you to shreds at the first sign of an opinion.<br />Nhttp://www.blogger.com/profile/10263940363463156225noreply@blogger.com0