Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://feeds.feedburner.com/cliffski

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. >
  9.  
  10. <channel>
  11. <title>Cliffski&#039;s Blog</title>
  12. <atom:link href="https://www.positech.co.uk/cliffsblog/feed/" rel="self" type="application/rss+xml" />
  13. <link>https://www.positech.co.uk/cliffsblog</link>
  14. <description>Game Design, Programming and running a one-man games business...</description>
  15. <lastBuildDate>Thu, 11 Sep 2025 15:48:32 +0000</lastBuildDate>
  16. <language>en-US</language>
  17. <sy:updatePeriod>
  18. hourly </sy:updatePeriod>
  19. <sy:updateFrequency>
  20. 1 </sy:updateFrequency>
  21. <item>
  22. <title>A solar farm after 6 months: Maintenance report</title>
  23. <link>https://www.positech.co.uk/cliffsblog/2025/09/11/a-solar-farm-after-6-months-maintenance-report/</link>
  24. <comments>https://www.positech.co.uk/cliffsblog/2025/09/11/a-solar-farm-after-6-months-maintenance-report/#respond</comments>
  25. <dc:creator><![CDATA[cliffski]]></dc:creator>
  26. <pubDate>Thu, 11 Sep 2025 15:48:31 +0000</pubDate>
  27. <category><![CDATA[solar]]></category>
  28. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6963</guid>
  29.  
  30. <description><![CDATA[So&#8230;my site has actually been live for 11 months now, but there has been a bunch of stuff that needed fixing after initial energization, so the six monthly maintenance thing happened a bit later. If you are asking &#8216;does it really need maintenance every six months?&#8217; the answer seems to be yes. I pushed back<p class="text-right"><span class="screen-reader-text">Continue Reading... A solar farm after 6 months: Maintenance report</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/09/11/a-solar-farm-after-6-months-maintenance-report/">Continue Reading...</a></p>]]></description>
  31. <content:encoded><![CDATA[
  32. <p>So&#8230;my site has actually been live for 11 months now, but there has been a bunch of stuff that needed fixing after initial energization, so the six monthly maintenance thing happened a bit later. If you are asking &#8216;does it really need maintenance every six months?&#8217; the answer seems to be yes. I pushed back on this, as I thought it was overkill, but have been talked around. if I owned 10 solar farms, I&#8217;d totally let one have maintenance every year or 18 months to see if it was worth it, but with a single asset I likely shouldn&#8217;t risk it.</p>
  33.  
  34.  
  35.  
  36. <p>Anyway, I just got the first report. Its VERY long and detailed. Its a 90MB PDF file, if that helps contextualize it. Here are some highlights:</p>
  37.  
  38.  
  39.  
  40. <p>Firstly, google have updated their data and there is now a proper google maps image! They add little points on the image to tell me where stuff was spotted that might need fixing, or keeping an eye on:</p>
  41.  
  42.  
  43. <div class="wp-block-image">
  44. <figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="674" height="574" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image.png" alt="" class="wp-image-6964"/></figure></div>
  45.  
  46.  
  47. <p>In general the summary of the report is this: &#8220;The inspection of the site and inverters, and testing of the DC circuits, found generally positive results, although some minor issues were identified &#8211; details in the report.&#8221; &#8211; Which is very good news because frankly so much stuff stressed me out as it was built I really could do with a few long sustained periods of just simple revenue generation from it. I think I will be at least 68 years old before it breaks even, but as long as it eventually does, I&#8217;ll be ok with that. This was not a money making scheme for me.</p>
  48.  
  49.  
  50.  
  51. <p>The report has a huge number of photos, including some cool ones. Here are ones that might be interesting:</p>
  52.  
  53.  
  54.  
  55. <p>Checking for hotspots on some panels with a thermal camera:</p>
  56.  
  57.  
  58. <div class="wp-block-image">
  59. <figure class="aligncenter size-full"><img decoding="async" width="678" height="509" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-1.png" alt="" class="wp-image-6965"/></figure></div>
  60.  
  61.  
  62. <p>Checking the DC cables going from strings to inverters still look ok:</p>
  63.  
  64.  
  65. <div class="wp-block-image">
  66. <figure class="aligncenter size-full"><img decoding="async" width="772" height="338" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-3.png" alt="" class="wp-image-6967" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-3.png 772w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-3-680x298.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-3-768x336.png 768w" sizes="(max-width: 772px) 100vw, 772px" /></figure></div>
  67.  
  68.  
  69. <p>You get before-and-after pictures showing that the fans on the inverters have been cleaned. I visited one hot day when the fans were really going for it. I could hear them from 30 feet away. Each inverter is 80-100kw output, so the fans are working pretty hard sometimes. I&#8217;m not sure these really need cleaning twice a year, but we have only had one winter so far. Maybe super stormy and muddy weather will be way worse.</p>
  70.  
  71.  
  72.  
  73. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="994" height="452" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-4.png" alt="" class="wp-image-6968" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-4.png 994w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-4-680x309.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-4-768x349.png 768w" sizes="auto, (max-width: 994px) 100vw, 994px" /></figure>
  74.  
  75.  
  76.  
  77. <p>There are pages and pages of testing data like this table, which makes sense if you are an electrician, but from my POV its just nice to have a historic benchmark for this stuff so if anything fails we can look back and see what went on:</p>
  78.  
  79.  
  80.  
  81. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="932" height="289" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-5.png" alt="" class="wp-image-6969" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-5.png 932w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-5-680x211.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-5-768x238.png 768w" sizes="auto, (max-width: 932px) 100vw, 932px" /></figure>
  82.  
  83.  
  84.  
  85. <p>You also get thermal pictures of all the isolating boxes for the inverters to check there is nothing scary going on inside them:</p>
  86.  
  87.  
  88.  
  89. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1530" height="339" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-6.png" alt="" class="wp-image-6970" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-6.png 1530w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-6-680x151.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/09/image-6-768x170.png 768w" sizes="auto, (max-width: 1530px) 100vw, 1530px" /></figure>
  90.  
  91.  
  92.  
  93. <p>They also get taken apart and cleaned. I think that might be a bit overkill too. Its tricky. On the one hand, what do I know? on the other hand people who service stuff always have misaligned incentives with regards to what is &#8216;essential&#8217;. If I had a hundred million pounds, I&#8217;d buy my own solar farm installation and maintenance company and then I&#8217;d know&#8230;</p>
  94.  
  95.  
  96.  
  97. <p>There is a ton of other stuff but I will spare you thirty pages of before-and after pictures of plastic boxes that got cleaned, or the many pictures of slight patches of rust on the edges of some supporting frame struts. I guess its good evidence that it was done thoroughly, with a lot of time spent looking for problems. Rather annoying an inverter was left OFF for half a day by error during all this, which happened to be a fairly poor generation day anyway, but that was annoying&#8230;</p>
  98.  
  99.  
  100.  
  101. <p>In any case I&#8217;ve decided to stick with the same company for the medium term carrying out these checks. At some point we will have a full years of proper generation and I can look at stats and muse as to how well or badly things are doing. I *think* its performing about as expected, which is good enough for me. I just hope the price I can sell the power for does not collapse!</p>
  102. ]]></content:encoded>
  103. <wfw:commentRss>https://www.positech.co.uk/cliffsblog/2025/09/11/a-solar-farm-after-6-months-maintenance-report/feed/</wfw:commentRss>
  104. <slash:comments>0</slash:comments>
  105. </item>
  106. <item>
  107. <title>A side effect of a potential AI mega-bubble. Maybe do not buy a house?</title>
  108. <link>https://www.positech.co.uk/cliffsblog/2025/09/08/a-side-effect-of-a-potential-ai-mega-bubble-maybe-do-not-buy-a-house/</link>
  109. <comments>https://www.positech.co.uk/cliffsblog/2025/09/08/a-side-effect-of-a-potential-ai-mega-bubble-maybe-do-not-buy-a-house/#comments</comments>
  110. <dc:creator><![CDATA[cliffski]]></dc:creator>
  111. <pubDate>Mon, 08 Sep 2025 22:42:03 +0000</pubDate>
  112. <category><![CDATA[investing]]></category>
  113. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6960</guid>
  114.  
  115. <description><![CDATA[Nobody should take financial advice from a dude who often writes sarcastic nonsense about star trek, and whose financial background is&#8230; guitar teaching and boatbuilding, but on the other hand if you are here, and reading this, then you probably know a bit about me, and know I at least put some thought into these<p class="text-right"><span class="screen-reader-text">Continue Reading... A side effect of a potential AI mega-bubble. Maybe do not buy a house?</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/09/08/a-side-effect-of-a-potential-ai-mega-bubble-maybe-do-not-buy-a-house/">Continue Reading...</a></p>]]></description>
  116. <content:encoded><![CDATA[
  117. <p>Nobody should take financial advice from a dude who often writes sarcastic nonsense about star trek, and whose financial background is&#8230; guitar teaching and boatbuilding, but on the other hand if you are here, and reading this, then you probably know a bit about me, and know I at least put some thought into these posts. Maybe this is all BS, but maybe it isn&#8217;t. Enjoy&#8230;</p>
  118.  
  119.  
  120.  
  121. <p>If you are someone who thinks AI is a bubble, and that it will pop soon, and its no different to NFTs, VR gaming or 3D TV, then you might as well quit reading now. This is not a blog post about how AI will change the world and usher in a star-trek like future of abundance and happiness. I actually think it MIGHT do that, but my main thrust here is the financial implications for somebody reading this in their twenties. If you are in your thirties, you might be in house-and-kids mode, and this advice might be useless for you. If you are older still, then it may be even less relevant. It also may sound insane, or scary, but at the least I hope it will be interesting.</p>
  122.  
  123.  
  124.  
  125. <p>I&#8217;m 55, I bought a house about 25 years ago. It was hard saving up the deposit for a house, and at the time, we thought house prices were insane, and stupid, and hated knowing we were probably buying at the top of the market. Ha ha. We were not. My first house was a 3-bed semi-detached house costing £98k. It wasn&#8217;t anywhere special, but it was ok. I think it had tripled in value when we sold it 10 years later. So far, a typical smug boomer story about how cheap houses were back in my day. Feel free to hate me.</p>
  126.  
  127.  
  128.  
  129. <p>People my age got used to the crazy certainty that house prices only went up. Many became &#8216;buy-to-let landlords&#8217;, and the default retirement plan was to buy a second home, rent it out to some poor young person who couldn&#8217;t afford the now much bigger deposit, and enjoy the fat easy profits. As someone who came from a pretty low income in my twenties (boatbuilder), I hated this and never did it, but I noted the phenomena with interest. Almost nobody ever revisited this core belief: that getting a mortgage was always an excellent investment. Nobody ever looked at a spreadsheet or did any maths. You just invested in property. Safe as houses.</p>
  130.  
  131.  
  132.  
  133. <p>I was recently chatting to friends about stock market investments. I do a lot of investing and trading. I love it, and have done well from it. I enjoy debating it and discussing it with people. I am however aware, that the advice you give people has to be tailored to their circumstances. I invest in some really risky stuff with money I can afford to lose, but many people cannot (obviously) afford to lose *anything*. How do you give advice to people in those circumstances? Its hard. But the very fact that you then find yourself recommending really &#8216;safe&#8217; investments with really low returns (but little chance of financial ruin) is kind of depressing to me. I get WHY people do this, but on the other hand its just perpetuating inequality. People on low incomes pick safe investments and make bad returns, while the real mega-gains are effectively &#8216;reserved&#8217; for people who already have enough money to take the risks.</p>
  134.  
  135.  
  136.  
  137. <p>In the UK we have official terms such as &#8220;self-certified sophisticated investor&#8221; and &#8220;high net worth individual&#8221;. These are terms used in financial services to basically fence-off some risky investments so that only people who are either very familiar with financial systems, or who have quite a lot of money, can invest in them. Sure, I get it. Nobody wants a system that robs people on low incomes of everything they have, but part of me hates how those amazing companies that go up 900% in a year only have investors who were already rich. Surely this is kind of fucked up?</p>
  138.  
  139.  
  140.  
  141. <p>Ok, so back to AI, and buying a house (or not). How is this relevant?</p>
  142.  
  143.  
  144.  
  145. <p>When I was saving a deposit for a house, I think we needed a minimum of £5,000 ($6k). That was between two of us. This seems laughably low now (it was 25 years ago remember). I did some research. In the SE of the UK, the average first-time-buyer house deposit now is £60,000, which is 110% of the average salary. This is huge. This is insane. Who can afford this without wealthy parents &#8216;helping them out&#8217;? Neither of us had wealthy relatives. We had to pay the rent AND save enough money. Who can save 110% of their salary? Thats salary, not take-home pay&#8230;</p>
  146.  
  147.  
  148.  
  149. <p>What I&#8217;m thinking&#8230; is that this might be a BAD idea anyway. Not just because its a ludicrously high amount, but because the return on investment from property might not be that great. In fact, in the SE UK over the last 3 years the average house price rise has been 1.9%. Yes ONE POINT NINE PERCENT. I think you can see where I am going here:</p>
  150.  
  151.  
  152.  
  153. <p>Nvidia stock over those 3 years rose 1,103%. If you were boring and just picked the S&amp;P500 its up on average 19% per year. So even if you had NO idea what to invest in, and just picked a US stock fund tracking the biggest names, you would make ten times as much money than if you have bought a house. And to add to this, you can invest a small amount (probably you need $1k to avoid mad fees), and build from there, unlike a house, where you are either buying the whole damn thing or not. Oh and by the way, the interest on the rest of the house cost is WAY more than 1.9%.</p>
  154.  
  155.  
  156.  
  157. <p>Thats the last three years, and the stock market has done &#8216;fairly well&#8217;, but there is a good chance its about to go really bananas, if AI lives up to its promise, and results in huge economic growth. If you pick wisely, you could get way more for that &#8216;house-deposit&#8217; money if invested in stocks than you could ever hope to get from house prices rising. Now I get it, this might sound like the idle musings of some arrogant ass who owns a house and is going all &#8216;let them eat cake&#8217;. I hope not, because its not like I do not understand the financial struggle when you want to buy a house. I totally remember paying rent for an AWFUL flat, which was freezing cold, and saving up our money to try and get enough to buy our first house. We searched for ages, and they were all awful, until we lucked into finding one that looked awful at first glance (someone had died, and the interior decor was&#8230;.bad), but was easy to do-up. I have no idea how many houses we looked at&#8230;</p>
  158.  
  159.  
  160.  
  161. <p>But anyway, my point is aimed at people who SOMEHOW manage, through hard work and effort to scrape together the money for a deposit for a house whilst working and renting, just to say *actually this might be a really bad investment right now*. Now I understand that renting sucks, and you want to own a home, and are not thinking about investment but&#8230; make the right decisions now, before AI goes insane, and it might prove to be the best financial decision you ever make. Wait a few years, watch those investments outpace house-prices, and THEN buy&#8230;</p>
  162.  
  163.  
  164.  
  165. <p class="has-text-align-center"><strong>I get that this might sound crazy. </strong></p>
  166.  
  167.  
  168.  
  169. <p>But think about it unemotionally. Don&#8217;t think about emotive terms like &#8216;my own home&#8217; and &#8216;what we have been saving for&#8217;. Just think about the numbers. You have the largest single sum of money you have ever accumulated. You saved it up for a house, whose value will accumulate at 1.9%. Or you can invest it (with careful research!) into the stock market just before AGI and humanoid robotics and self driving cars became popular. And obviously this assumes you already have somewhere to live (either rented, or with parents etc). Yes there is risk, but there is also no guarantee house prices will always rise.</p>
  170.  
  171.  
  172.  
  173. <p>Food for thought. But this is just a thought experiment. Do not blame me for any financial decisions you make! And think carefully and analyze everything, and discuss with friends &amp; family! I will just point out that I am a game developer and solar farm developer. I&#8217;m not trying to sell you stock market advice, and have no financial interest in what you do. But do look at the numbers. Always look at the numbers.</p>
  174. ]]></content:encoded>
  175. <wfw:commentRss>https://www.positech.co.uk/cliffsblog/2025/09/08/a-side-effect-of-a-potential-ai-mega-bubble-maybe-do-not-buy-a-house/feed/</wfw:commentRss>
  176. <slash:comments>3</slash:comments>
  177. </item>
  178. <item>
  179. <title>New power-purchase agreement signed</title>
  180. <link>https://www.positech.co.uk/cliffsblog/2025/08/24/new-power-purchase-agreement-signed/</link>
  181. <comments>https://www.positech.co.uk/cliffsblog/2025/08/24/new-power-purchase-agreement-signed/#comments</comments>
  182. <dc:creator><![CDATA[cliffski]]></dc:creator>
  183. <pubDate>Sun, 24 Aug 2025 22:54:31 +0000</pubDate>
  184. <category><![CDATA[solar]]></category>
  185. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6956</guid>
  186.  
  187. <description><![CDATA[I haven&#8217;t blogged about the solar farm for a little while because to be honest there has not been much to report (which is good! this is supposed to be a very stable low-maintenance project!) but I thought I would briefly update the blog to mention communications upgrades and a new PPA. The site has<p class="text-right"><span class="screen-reader-text">Continue Reading... New power-purchase agreement signed</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/08/24/new-power-purchase-agreement-signed/">Continue Reading...</a></p>]]></description>
  188. <content:encoded><![CDATA[
  189. <p>I haven&#8217;t blogged about the solar farm for a little while because to be honest there has not been much to report (which is good! this is supposed to be a very stable low-maintenance project!) but I thought I would briefly update the blog to mention communications upgrades and a new PPA.</p>
  190.  
  191.  
  192.  
  193. <p>The site has multiple means of communication, because we need to be able to connect to, and monitor the CCTV cameras, we need reporting from the meter that actually determines how much we get paid (which is reported by a neutral 3rd party who charge a frankly comical amount just to read a single number every 30 minutes and report it), and we also need (or rather we like to have&#8230;) reporting from each inverter on the site to tell us the status of each inverter, and indeed each string. When I share the really cool charts and breakdowns with a ton of data, thats from the inverters. This measures DC power, at the inverters, before its converted and then sent some small but noticeable distance along underground cables to the site substation containing the site meter. Because some power is lost in conversion and transmission, the two meter readings are not the same.</p>
  194.  
  195.  
  196.  
  197. <p>Anyway&#8230; all of that stuff has to communicate off-site somehow, and its all routed through an aerial on the top of the substation. Its a bad aerial, and it uses a mobile phone connection which sucks. The site is somewhere quite remote and mobile phone coverage isn&#8217;t that good. As a result, often the signal is below 25% strength, and we get gaps in the data. The final generation readings are always there, but losing &#8216;sight&#8217; of the plant is no fun, so we recently had all that comms stuff upgraded. The site now has a constant 48-49% signal strength which is good to see. This cost me unexpected money, but coincided with a maintenance check so the costs of sending people to site were not included.</p>
  198.  
  199.  
  200.  
  201. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="991" height="427" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/image.png" alt="" class="wp-image-6957" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/image.png 991w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/image-680x293.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/image-768x331.png 768w" sizes="auto, (max-width: 991px) 100vw, 991px" /></figure>
  202.  
  203.  
  204.  
  205. <p>In other news, we have signed a 2 year PPA (power purchase agreement) again with Ovo. That starts in November and runs out in November 2027. At that point we may stay with them, or switch if anyone offers a higher rate. One of the perverse things about owning a power station is that prices change every 30 minutes, but when you agree a price, it will then be fixed for years. Its tricky, because you are basically watching a fluctuating stock-ticker like price, but where you have to MANUALLY email people to ask for new quotes, and then pick your moment. There are services that offer more visibility into price trends, but I can&#8217;t afford them really&#8230; You can get 1 year, 2 or 3 year PPAs. I chose 2 years as the 3 year price looked pretty low :(.</p>
  206.  
  207.  
  208.  
  209. <p>And to be honest the actual &#8216;energy&#8217; price part of it is only about 65-70% of what you get paid anyway. Some of it is benefits accrued through being a remote site, or a site where extra generation is beneficial, and some of it is discounts for having consumption near generation (so you put no strain on the distribution or transmission lines). Basically if you can find a site on some remote island with tons of local businesses and houses needing more power, then go for it. Anything to avoid upgrading the transmission network, apparently! How exactly you are supposed to guess those value pre-build is beyond me. There are probably expensive consultants, or you have to know who to ask and how to ask it.</p>
  210.  
  211.  
  212.  
  213. <p>Price-wise we are roughly the same as we were for our first year. Its&#8230; ok. Its not going to make some huge ROI, but its not losing us money either. I did actually pay out some actual company dividends for the first time (OMG), although it will be another few months until I can look at proper accounts and do a real analysis of whether or not we make enough in profits to make that an annual thing&#8230; I think larger sites have way better economics.</p>
  214. ]]></content:encoded>
  215. <wfw:commentRss>https://www.positech.co.uk/cliffsblog/2025/08/24/new-power-purchase-agreement-signed/feed/</wfw:commentRss>
  216. <slash:comments>2</slash:comments>
  217. </item>
  218. <item>
  219. <title>Designing the orders system for ridiculous space battles</title>
  220. <link>https://www.positech.co.uk/cliffsblog/2025/08/15/designing-the-orders-system-for-ridiculous-space-battles/</link>
  221. <comments>https://www.positech.co.uk/cliffsblog/2025/08/15/designing-the-orders-system-for-ridiculous-space-battles/#comments</comments>
  222. <dc:creator><![CDATA[cliffski]]></dc:creator>
  223. <pubDate>Fri, 15 Aug 2025 15:03:59 +0000</pubDate>
  224. <category><![CDATA[game design]]></category>
  225. <category><![CDATA[gratuitous space battles]]></category>
  226. <category><![CDATA[ridiculousspacebattles]]></category>
  227. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6949</guid>
  228.  
  229. <description><![CDATA[Yikes, this has turned into a really complex and confusing beast. I am very happy so far with the improvements, but I need to publicly brainstorm the details. Simply put, the orders system in Gratuitous Space Battles was a mess, and I needed a much better one, PLUS I wanted to add new orders to<p class="text-right"><span class="screen-reader-text">Continue Reading... Designing the orders system for ridiculous space battles</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/08/15/designing-the-orders-system-for-ridiculous-space-battles/">Continue Reading...</a></p>]]></description>
  230. <content:encoded><![CDATA[
  231. <p>Yikes, this has turned into a really complex and confusing beast. I am very happy so far with the improvements, but I need to publicly brainstorm the details. Simply put, the orders system in Gratuitous Space Battles was a mess, and I needed a much better one, PLUS I wanted to add new orders to take into account the new gameplay style of <strong><a href="https://store.steampowered.com/app/3607230/Ridiculous_Space_Battles/">Ridiculous Space Battles</a></strong>.</p>
  232.  
  233.  
  234.  
  235. <p>In GSB there was a whole bunch of orders, and they all apparently pretended to work together to come up with an opinion on which ship a weapon should target. Orders are per SHIP, not per weapon, which frankly is a whole other story, but I think it would be stupid overkill to have the player assigning different orders to every weapon. My whole unique selling point is BIG fleets with LOTS of ships. Anyway, the original game had orders like Attack Fighters and Co-operate, but it was never clear how they all worked together. </p>
  236.  
  237.  
  238.  
  239. <p>RSB introduces three new orders entirely. Raider (race ahead of the fleet up to a given distance to engage enemies) which is used by Fighters, Last Defense, which concentrates fire on the enemy ships that have got the furthest through our lines, and Breakthrough, which is for punching a hole in enemy defenses, and only fires on ships right in front of you (or in that row anyway).</p>
  240.  
  241.  
  242.  
  243. <p>Here is my new current implementation:</p>
  244.  
  245.  
  246.  
  247. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1904" height="1041" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/screenshot_15-08-2025_15-42-21.png" alt="" class="wp-image-6950" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/screenshot_15-08-2025_15-42-21.png 1904w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/screenshot_15-08-2025_15-42-21-680x372.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/screenshot_15-08-2025_15-42-21-768x420.png 768w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/08/screenshot_15-08-2025_15-42-21-1536x840.png 1536w" sizes="auto, (max-width: 1904px) 100vw, 1904px" /></figure>
  248.  
  249.  
  250.  
  251. <p>So the big things here are categories, color coding and priorities. OH YES. To explain, this ship has one &#8216;Special&#8217; Order, which is to engage enemies at 2 squares range. Thats a movement order, so independent of all the targeting stuff.</p>
  252.  
  253.  
  254.  
  255. <p>The next order is &#8216;co-operate&#8217;. Its one of a class of (blue) orders I&#8217;m tempted to call &#8216;Discriminators&#8217; or &#8216;Tie-breakers&#8217;. There can only be ONE of these (Co-operate, Vulture, Retaliate, Breakthough or Last Defense), and essentially they are used at the end of the process to choose which out of a series of potential targets is picked.</p>
  256.  
  257.  
  258.  
  259. <p>The Green and yellow orders are Target Criteria. They describe a target size class or a defense status (shields up, or shields down but armor intact, or down to naked hull). These orders are special because they are in priority order. (I realize now I should show the numbers!). So when the ship decides who to shoot at, it first builds a simple list of all enemy ships in range and fire arc, that match any of those criteria. (You can delete one to make the ship NEVER target those ships). Once that list exists, it then goes through the target criteria from top to bottom seeing if any ships meet that criteria&#8230;</p>
  260.  
  261.  
  262.  
  263. <p class="has-text-align-center"><strong>And this is where I have a decision to make&#8230;</strong></p>
  264.  
  265.  
  266.  
  267. <p>I can either stop the processing once it has one or more targets, then pick the best using the discriminator OR I can then keep filtering down through the list as long as I have 1 or more targets and THEN use the discriminator. I cannot decide which. Are you confused? I suspect so:</p>
  268.  
  269.  
  270.  
  271. <p>Example 1: Using the above orders, I scan my target list and find 4 cruisers and 12 frigates in range. All of them have shields. Cool! So I stop there, and evaluate them all using Co-operate, firing upon the one that is the most under fire right now.</p>
  272.  
  273.  
  274.  
  275. <p>Example 2: I scan my target list and find 4 cruisers and 12 frigates in range. All of them have shields. The NEXT criteria is Fighters. There are none in my list so I ignore. The next is armor. All 16 have armor so again I ignore. The next is Frigates. Wait! only 12 are frigates, so I prune the list. The next is Hull, all check. The next is cruisers, none found. I finally use co-operate to evaluate which frigate to fire at&#8230;</p>
  276.  
  277.  
  278.  
  279. <p>Is this dilemma even making sense, let alone deciding on a system? Its very involved. My game IS a complex strategy game, but I don&#8217;t want to rely on crazily complex tutorials. Now to be fair, Gratuitous Space Battles had a completely opaque system that nobody understood and was poorly explained and it sold a bazillion copies, so maybe I am overthinking it. But I would like to do a MUCH better job&#8230; I know SOME players would be happy to literally write code to control this stuff, and might suggest I add conditional clauses and other complexity but I think that makes the game seem more like work and less like fun&#8230;</p>
  280.  
  281.  
  282.  
  283. <p>Looking at it now I KNOW I need to add priority numbers to those yellow/green strips. Maybe they should be called Filters now Criteria? Who knows. I may need to think about this a LOT.</p>
  284.  
  285.  
  286.  
  287. <p>By the way add the game to your wishlist :D Or pester a news website to cover it! Or share a screenshot somewhere you hang out. That stuff all helps :D.</p>
  288.  
  289.  
  290.  
  291. <iframe loading="lazy" src="https://store.steampowered.com/widget/3607230/" frameborder="0" width="646" height="190"></iframe>
  292.  
  293.  
  294.  
  295. <p></p>
  296. ]]></content:encoded>
  297. <wfw:commentRss>https://www.positech.co.uk/cliffsblog/2025/08/15/designing-the-orders-system-for-ridiculous-space-battles/feed/</wfw:commentRss>
  298. <slash:comments>2</slash:comments>
  299. </item>
  300. <item>
  301. <title>Are all modern entertainment/global careers impossible now?</title>
  302. <link>https://www.positech.co.uk/cliffsblog/2025/07/21/are-all-modern-entertainment-global-careers-impossible-now/</link>
  303. <comments>https://www.positech.co.uk/cliffsblog/2025/07/21/are-all-modern-entertainment-global-careers-impossible-now/#comments</comments>
  304. <dc:creator><![CDATA[cliffski]]></dc:creator>
  305. <pubDate>Mon, 21 Jul 2025 10:11:38 +0000</pubDate>
  306. <category><![CDATA[business]]></category>
  307. <category><![CDATA[personal development]]></category>
  308. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6943</guid>
  309.  
  310. <description><![CDATA[I&#8217;ve been thinking about this for a week or so. I had a bit of an epiphany when it came to how hard it to make a living from video games, and also as someone who was a musician (briefly) and who is well acquainted with a novelist. If you have ever tried to make<p class="text-right"><span class="screen-reader-text">Continue Reading... Are all modern entertainment/global careers impossible now?</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/07/21/are-all-modern-entertainment-global-careers-impossible-now/">Continue Reading...</a></p>]]></description>
  311. <content:encoded><![CDATA[
  312. <p>I&#8217;ve been thinking about this for a week or so. I had a bit of an epiphany when it came to how hard it to make a living from video games, and also as someone who was a musician (briefly) and who is well acquainted with a novelist. If you have ever tried to make a career out of making your own video games, music, writing or art, then I suspect you are aware that it is hyper-competitive and very hard to make a living. I suspect its going to get way, way worse, and its got absolutely nothing to do with AI. Just a matter of population, scale, choice overload and numbers.</p>
  313.  
  314.  
  315.  
  316. <p>First I have to burst a bubble. You are not special. You might *think* you are, and everyone ironically thinks they are both special and has above average IQ. To quote the crowd chanting in unison in a classic monty python film &#8220;We are all individuals&#8221;. In reality, you, or more specifically your tastes are not individual. At least not to the point where it really matters given the problem of choice overload.</p>
  317.  
  318.  
  319. <div class="wp-block-image">
  320. <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="281" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-6.png" alt="" class="wp-image-6946"/></figure></div>
  321.  
  322.  
  323. <p>When I was a kid, there were 3 TV channels. Just 3. I remember watching the first ever show to be broadcast on channel 4. (It was countdown). These days we have blasted way way past &#8216;too many channels to count&#8217; and we now have streaming and youtube. The amount of content available for me to watch right now is staggering. The problem thus becomes not one of availability but discoverability. There MIGHT be a youtube channel you would like 5% more than the one you are about to watch, but will you spend 8 hours scrolling to find it? As someone who sells games, I know you will not. In old language, being &#8216;above the fold&#8217; was how you got noticed. (<em>This is from which news stories you could read on a newspaper that was folded to fit in a display stand</em>). These days being on the front page of steam is a huge big deal. Being on page 2 is way worse. On page 199 you might as well not exist.</p>
  324.  
  325.  
  326.  
  327. <p>There is a limit then, to how much effort we will go to in order to find something that suits our tastes. Given 20 choices, we probably pick the most suitable. We do not go looking for 100 or 1,000 choices. This is just human nature and probably a survival instinct. Maybe buffalo #199 has more meat on it, but if we don&#8217;t decide to hunt one of the first 20 we find, we will lose the light and go hungry?</p>
  328.  
  329.  
  330.  
  331. <p>So given that we do not have hyper-individual tastes, and that choice-overload funnels us into one of the top 20 choices anyway, what are the implications? Well the implications are awesome for a tiny tiny tiny tiny proportion of content creators, and catastrophically terrible for everybody else trying to make a living. And frankly, I think there is no solution. Let me explain with some illustrative numbers.</p>
  332.  
  333.  
  334.  
  335. <p>The year is 1546 and lute-playing is the new hotness. There is no ability to record music, and no powered amplification. The lute can be heard in just one room, so maybe 50 people can attend a performance. A lute is an expensive instrument few could afford anyway. A roaming lute pop-star has to travel by horse or donkey and cannot cover that wide an area. Perhaps you are the best lute player in somerset, and wildly reknown among the locals for your l33t skillz. You earn a reasonable living. There are rumors of even better lute players in Wales, Scotland, the Midlands, Kent and Sussex, but thats many days ride away so they will never come here. You have a decent middle class income, and are &#8216;pretty good&#8217; at the lute. Life is good.</p>
  336.  
  337.  
  338.  
  339. <p>The year is now 2025 and Taylor Swift is a huge pop star. Recorded music is available and ubiquitous, deliverable to almost everyone on the planet. That population has grown by 1,632%, but thanks to the power of amplification and global media delivery, Taylor Swift can perform all over the planet, often to crowds of 90,000 or more in one night. Even if there were no recordings, she can entertain >1,500 times as many people as the lute player. The potential ceiling for revenue from entertainment stardom is staggering compared to 1546.</p>
  340.  
  341.  
  342.  
  343. <p>But hold on, with a huge global population, surely the industry can now support way, way more people than it did back in the lute days? NO. In fact probably FEWER people <strong>as a percentage of the population</strong>. In 1546 our village needed our local lute player, because local was all there was. But in 2025 Sting can &#8216;entertain&#8217; people with his lute playing on a global scale. People are still being entertained, but they have not taken advantage of the global growth in population to have a larger number of &#8216;entertainers&#8217;. They do not need them. There is already enough choice. Way, way too much choice. We used to just have Joe &#8216;the lute guy&#8217;. Now we have more than 20 lute players. Enough already.</p>
  344.  
  345.  
  346. <div class="wp-block-image">
  347. <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="640" height="340" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-4.png" alt="" class="wp-image-6944"/></figure></div>
  348.  
  349.  
  350. <p>So what does this mean as we extrapolate forwards to an even more connected world and an even more global culture (witness the rise of kpop, and korean TV dramas like squid game, both relatively new, and the global rise of anime, again in global terms very new)? It means that the top 20 choices of anything can (and will) dominate the entire planet. Thats depressing enough as it is, but it gets worse than this. Because the population goes up, but the number of megastars we support doesn&#8217;t seem to change, it means the standards go up, and up, and up, until frankly you have to be a genetic abnormality, have serious obsessive mental health issues, or a staggeringly lucky combination of the exact zeitgeist skills and looks and charisma to even have a chance of being in that top 20.</p>
  351.  
  352.  
  353.  
  354. <p>Top athletes do not have much of a social life. How could they? Competition is extreme. Top models have basically never eaten a cake. Top musicians are absolutely oblivious to anything that is not a metronome or a practice schedule. Top artists have, for a very long time, been people who have a smorgasbord of issues you would not choose, but have the fortunate side effect of helping them create great art. Van Gogh was not a chill dude with work-life balance. This applies to entrepreneurs too. Elon Musk is clearly staggeringly brilliant and hard working, but also unimaginably stressed, distressed and in need of serious psychological help. Do we really think that is uncommon? Social media heralded a mass wave of &#8216;cancelling&#8217; as people suddenly had access to the personal opinions and thoughts of celebrities who have a tenuous grip on reality, and the world outside their profession.</p>
  355.  
  356.  
  357.  
  358. <p>So my unfortunate and depressing conclusion is this: Global population growth and the persistence of choice-overload are combining to ensure that the standard of work required to be successful in entertainment is so high, that only people who dedicate every waking moment to it AND who have some sort of natural/genetic ability or mental health issue that helps them work can possibly, ever hope to succeed.  And obviously as the standard at the top rockets up, the standards at all levels also rises alongside them. Can you have work-life balance and a career in writing/art/music/indie games? Of course not.</p>
  359.  
  360.  
  361.  
  362. <p>My first released indie game in 1997 was &#8216;Asteroid Miner&#8217;. It was on the front page of &#8216;download.com&#8217; the biggest download site on the entire internet, for a week or so because &#8216;Look! someone made an asteroids game in color&#8217;. Its 2025 now and getting to the front page of steam (just one of many games stores, let alone stores in general) is staggeringly, impossibly hard. And it will only get harder and harder from now on. This is what it took in 1997:</p>
  363.  
  364.  
  365. <div class="wp-block-image">
  366. <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-5.png" alt="" class="wp-image-6945" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-5.png 800w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-5-680x510.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-5-768x576.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure></div>
  367.  
  368.  
  369. <p>Now the cheerful bit!</p>
  370.  
  371.  
  372.  
  373. <p>Do you want it though? If you have to become such a tortured soul, so in pain, so obsessed, so focused in order to &#8216;make it&#8217;, then is the price worth it? How many rock stars drunk or drugged themselves to death. Do you want to be Kurt Cobain? Do you want to turn out like Michael Jackson or Elvis? Do you want to be Elon Musk? That level of fame and recognition is impossibly hard to deal with *even for people with perfect mental health*. Be aware that when you look at people who are hugely successful in the entertainment field you work in, these people are often ill, unhappy, stressed. That might be the price you have to pay. It probably is not a price worth paying. You can get a lot of happiness and fulfilment by having a normal career and making games/writing books/making music as a hobby. Its probably a much more balanced and stable life.</p>
  374.  
  375.  
  376.  
  377. <p>And yes, I know that I have sold a ton of games and obviously done well, and don&#8217;t want to come across as telling people to give up on their dreams. I&#8217;m not the worlds perfectly balanced mental health exhibit either. I&#8217;m an anxious, stressed, hyperactive workaholic who finds it almost impossible to relax. Not many people would choose those characteristics, even it meant selling more games.</p>
  378. ]]></content:encoded>
  379. <wfw:commentRss>https://www.positech.co.uk/cliffsblog/2025/07/21/are-all-modern-entertainment-global-careers-impossible-now/feed/</wfw:commentRss>
  380. <slash:comments>2</slash:comments>
  381. </item>
  382. <item>
  383. <title>Coding a load-balanced multithreaded particle system</title>
  384. <link>https://www.positech.co.uk/cliffsblog/2025/07/13/coding-a-load-balanced-multithreaded-particle-system/</link>
  385. <dc:creator><![CDATA[cliffski]]></dc:creator>
  386. <pubDate>Sun, 13 Jul 2025 11:33:17 +0000</pubDate>
  387. <category><![CDATA[programming]]></category>
  388. <category><![CDATA[ridiculousspacebattles]]></category>
  389. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6936</guid>
  390.  
  391. <description><![CDATA[Background: I am coding a 2D space-based autobattler with ridiculous levels of effects called &#8216;Ridiculous Space Battles&#8216;. I code my own engine, for fun, in directx9 using C++ and Visual Studio. Because I love coding, yesterday I found myself wondering how well the multithreading in my game was holding up. So I fired up the<p class="text-right"><span class="screen-reader-text">Continue Reading... Coding a load-balanced multithreaded particle system</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/07/13/coding-a-load-balanced-multithreaded-particle-system/">Continue Reading...</a></p>]]></description>
  392. <content:encoded><![CDATA[
  393. <p>Background: I am coding a 2D space-based autobattler with ridiculous levels of effects called &#8216;<a href="https://www.positech.co.uk/ridiculousspacebattles/">Ridiculous Space Battles</a>&#8216;. I code my own engine, for fun, in directx9 using C++ and Visual Studio.</p>
  394.  
  395.  
  396.  
  397. <p>Because I love coding, yesterday I found myself wondering how well the multithreading in my game was holding up. So I fired up the trusty Concurrency Visualizer in Visual Studio. I love this tool and have used it a lot on previous games. One of the biggest demands on the CPU for my game is particle processing. There are a LOT of explosions, and other effects, and a crazy number of particle emitters (thousands of emitters, hundreds of thousands of particles). Obviously this would normally be a code bottleneck, so I have a task-based generic multithreading engine that handles it. The main thread builds up a bunch of tasks, the threads grab the next task on the list, and the main thread will wait until the task list is empty. If there are still tasks in the queue, the main thread will do one as well. So how did things look?</p>
  398.  
  399.  
  400.  
  401. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1662" height="680" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-2.png" alt="" class="wp-image-6937" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-2.png 1662w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-2-680x278.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-2-768x314.png 768w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-2-1536x628.png 1536w" sizes="auto, (max-width: 1662px) 100vw, 1662px" /></figure>
  402.  
  403.  
  404.  
  405. <p>Disastrous!</p>
  406.  
  407.  
  408.  
  409. <p>So what is going wrong here? I have a generic &#8216;marker&#8217; set up to show the span of the main thread&#8217;s drawing of the game (GUI_Game::Draw()). Inside that, a bunch of unlabeled stuff happens, but I added spans to show when the multithreaded task called UPDATE_PARTICLE_LIST is called. There are two massive things going wrong here. Firstly, there are only two other threads joining in to process the particles, and secondly one of those updates seems to take 20x as long as the other. Worse still, its the one the main thread chose&#8230; so its a huge bottleneck. Technically this is still a speedup, but its marginal. How have I fucked up?</p>
  410.  
  411.  
  412.  
  413. <p>Some background to my rendering algorithm is needed: The game has 2 blend modes for particles. A &#8216;Burn&#8217; mode, that saturates color and is used for fire, lasers, sparks etc, and a &#8216;Normal&#8217; mode for smoke and debris etc. The particle effects are batched as much as possible, but I cannot mix those blend modes in a draw call. Also, some particles are below the action (the ships) and some above, to give a semi-3D look and make it look like the explosions engulf the ships. So this means particle emitters fall into one of 4 lists: NormalBelow, BurnBelow, NormalAbove, BurnAbove. This is all fine and works ok. In action, the game looks like this:</p>
  414.  
  415.  
  416.  
  417. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1904" height="1041" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/screenshot_13-07-2025_11-58-52.png" alt="" class="wp-image-6938" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/screenshot_13-07-2025_11-58-52.png 1904w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/screenshot_13-07-2025_11-58-52-680x372.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/screenshot_13-07-2025_11-58-52-768x420.png 768w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/screenshot_13-07-2025_11-58-52-1536x840.png 1536w" sizes="auto, (max-width: 1904px) 100vw, 1904px" /></figure>
  418.  
  419.  
  420.  
  421. <p>Because you can freeze frame and scroll around, everything has to be properly simulated, including particle effects currently offscreen. Anyway it all works, and I have FOUR particle emitter lists. So naturally, to load-balance everything, I gave one list to each thread and considered the job done.</p>
  422.  
  423.  
  424.  
  425. <p>BUT NO.</p>
  426.  
  427.  
  428.  
  429. <p>It turns out that those 4 groups are not equal in size. They are <strong>laughably</strong> unequal. The &#8216;BurnAbove&#8217; list contains all of the fire and spark emitters on all of the pieces of all of the hulks from destroyed ships, plus sparks from fiery plasma torpedoes, expended drone explosions, and missed or intercepted missile explosions. Thats MOST of the particles. When I checked, about 95% of particles are &#8216;BurnAbove&#8217;. I had 4 lists multithreaded, <strong>but they were not vaguely really load balanced</strong>.</p>
  430.  
  431.  
  432.  
  433. <p>Once I realized that the solution was theoretically easy, but fiddly to implement and debug. I decided I would add a new load-balanced list system on top. I created 8 different lists, and when an emitter was created it was added to the &#8216;next&#8217; list (the next value circled round through all 8), and told what list it was in. When it was deleted, it was removed from the appropriate list.<em> Note that &#8216;deleted&#8217; is a vague term. I delete no emitters, they get put into a reusable pool of dead emitters, which complicates matters a lot&#8230;</em></p>
  434.  
  435.  
  436.  
  437. <p>So in theory I now have a nice load-balanced series of 8 lists that contains every particle emitter that is currently live. The original 4 lists are still valid and used for rendering and blend mode data, but this &#8216;parallel&#8217; list system existed alongside it, purely to handle load-balancing. What this means is, that a load-balanced-list may contains particles from all 4 render groups, but this does not matter as I am running update code on them, not rendering!</p>
  438.  
  439.  
  440.  
  441. <p class="has-text-align-center"><strong>It didn&#8217;t work.</strong></p>
  442.  
  443.  
  444.  
  445. <p>Crashes and bugs and corrupt data ahoy. I worked on it for ages, then watched a movie to try and forget it. Then this morning, after some digging, it was all fixed. What actually was going wrong was related to smoke plumes. Because there are a lot of smoke plumes, and they always reuse the same particle config data, they exist in a separate system, updated separately. I had forgotten this! And what was happening was my new load-balanced lists stupidly included these emitters when they should have been kept out of it. The emitters would expire and be deleted in the multithreaded code, then later accessed by the plume code. CRASH.</p>
  446.  
  447.  
  448.  
  449. <p>I worked it out this morning before breakfast! I was very pleased. You might be thinking, what about the only 2 threads thing? LOL I had hard coded the game to use  maximum of 4 threads, probably as a debug test. Idiot. I just changed it to be 10 and everything worked:</p>
  450.  
  451.  
  452.  
  453. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1253" height="806" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-3.png" alt="" class="wp-image-6939" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-3.png 1253w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-3-680x437.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-3-768x494.png 768w" sizes="auto, (max-width: 1253px) 100vw, 1253px" /></figure>
  454.  
  455.  
  456.  
  457. <p>This is more like it. I wasted ages trying to get the dumb concurrency visualiser to show my custom thread names instead of &#8216;Worker Thread&#8217; but apparently thats the category. Not much help. FFS show us the thread names! (They work in the debugger). But anyway, that image above is a snapshot inside a busy battle for the GUI_Game::Draw() showing how UpdateParticles tasks get spread over 8 threads. I&#8217;m still not sure why that sixth thread misses out on a task, which gets nabbed by the main thread&#8230;</p>
  458.  
  459.  
  460.  
  461. <p>Anyway, the point is it works now, and in theory updating particles is 8x faster than it would be with single threading. I do need to apply the multithreading to a lot more of the game code to get the best possible results. I am testing this on a fairly beefy GPU and CPU (Ryzen 9 5900X 12 Core @3.7GHZ and RTX 3080) in only 1920&#215;1080 res. I want the game to look awesome at 5120 res or on a five year old cheap laptop, so plenty more to do.</p>
  462.  
  463.  
  464.  
  465. <p>If for some reason this tips you over the edge to wishlist the game, here is the link :D.</p>
  466.  
  467.  
  468.  
  469. <iframe loading="lazy" src="https://store.steampowered.com/widget/3607230/" frameborder="0" width="710" height="190"></iframe>
  470.  
  471.  
  472.  
  473. <p></p>
  474. ]]></content:encoded>
  475. </item>
  476. <item>
  477. <title>Solar farm: six months of proper generation plus REGOs.</title>
  478. <link>https://www.positech.co.uk/cliffsblog/2025/07/01/solar-farm-six-months-of-proper-generation-plus-regos/</link>
  479. <dc:creator><![CDATA[cliffski]]></dc:creator>
  480. <pubDate>Tue, 01 Jul 2025 20:07:00 +0000</pubDate>
  481. <category><![CDATA[solar]]></category>
  482. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6931</guid>
  483.  
  484. <description><![CDATA[If you follow this blog a lot, you will know that we actually started generating power on our solar farm in October 2024, but there was some downtime in November, and then more downtime in December due to an extreme storm damaging the site (we lost 10 panels, since replaced), so we didnt have a<p class="text-right"><span class="screen-reader-text">Continue Reading... Solar farm: six months of proper generation plus REGOs.</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/07/01/solar-farm-six-months-of-proper-generation-plus-regos/">Continue Reading...</a></p>]]></description>
  485. <content:encoded><![CDATA[
  486. <p>If you follow this blog a lot, you will know that we actually started generating power on our solar farm in October 2024, but there was some downtime in November, and then more downtime in December due to an extreme storm damaging the site (we lost 10 panels, since replaced), so we didnt have a straight six months of data until yesterday.</p>
  487.  
  488.  
  489.  
  490. <p>Also, because of the way solar is generated over the year in the UK, you want either jan-june or july-dec in order to extrapolate. The output of solar panels is basically a bell curve, peaking mid year, so once you have six months of data, you can make an educated guess (but only a guess) about the whole year. Just who shallow or steep that curve is will depend on a few factors, but in general I think that improvements in panels has flattened that curve a bit. Lots of technical changes to panels mean that they are more tolerant of &#8216;partial shade&#8217; than they used to be. Handy in a cloudy country!</p>
  491.  
  492.  
  493.  
  494. <p>So how much power have we generated in six months? well its&#8230;. 766,739kwh. (766 MWH). So we can assume that if this is a typical year, that would mean 1,533MWH in a year, or 1.5 gigawatt-hours. Enough to run the average TV for 1,700 years. Or enough to fill a large electric car from empty 19,000 times. In some ways this seems a lot, but how does it compare to what we expected?</p>
  495.  
  496.  
  497. <div class="wp-block-image">
  498. <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1010" height="542" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-1.png" alt="" class="wp-image-6933" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-1.png 1010w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-1-680x365.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image-1-768x412.png 768w" sizes="auto, (max-width: 1010px) 100vw, 1010px" /></figure></div>
  499.  
  500.  
  501. <p>Well it depends&#8230; If I dig up the oldest email about the sites initial plan, the assumed generation output was just 957MWH so this sounds amazing. That was then changed to 1,245MWH it was later changed to 1,347MWH . The final setup for the export meter seems to say that the expected output is 1,339MWH. So the actual expectations are all over the place, but all below the current value. I THINK that we had a very very good April, and that is skewing the results. If we hit 1,400MWH in the year that will be very pleasing. It is too early to really be definitive about whether or not this means that the farm makes a profit. I would be nervous of judging that without a full year. Especially as a maintenance contract is still not signed yet.</p>
  502.  
  503.  
  504.  
  505. <p>In other news&#8230;</p>
  506.  
  507.  
  508.  
  509. <p>You may have read posts by me banging on about REGOs. A REGO is a Renewable Energy Guarantee of Origin certificate. When you generate a single MWH of power from a renewable source, you can tell a government regulator (ofgem), and they give you a certificate. There is no subsidy, but you can sell them. Who buys them? Companies and energy retailers who want renewable energy. To be able to sell your power to customers as 100% renewable, you need to buy REGOs to cover all your energy. There is an open and competitive market for REGOs, and currently they are worth £10-£15 per MWH. Thats equivalent to 0.1 to 0.15 pence per unit of electricity, no not a lot from a consumer POV. Like most companies, we have our REGO sales &#8216;bundled&#8217; in with the PPA (Power purchase agreement) we have with the company who buys our power. In this case OVO Energy.</p>
  510.  
  511.  
  512. <div class="wp-block-image">
  513. <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="309" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/07/image.png" alt="" class="wp-image-6932"/></figure></div>
  514.  
  515.  
  516. <p>Thats the theory. In practice, this process is HELLISH. It genuinely feels like ofgem have been told to make the process of getting accredited as impossible as they can. The amount of bureaucracy, inefficiency, radio-silence and pickiness over the grammar and punctuation in every piece of text in every document required in order to qualify is beyond insane. I applied as SOON as was possible (your site has to already be generating, which is stupid as hell), and it still took SIX MONTHS to basically have a form processed and accepted. We even had to argue basic maths with them, such as arguing that 400+500 = 900, and not as they claimed&#8230; 810.</p>
  517.  
  518.  
  519.  
  520. <p>Anyway, that insane process (which reminded me of the DNO legal process, which reminded me of the planning process&#8230;.etc) is finally complete, although not without a formal complain to ofgem about it. And I will not bore you with the details, but suffice it to say that obviously they are still arguing about it, and saying its not right, even though they have approved my site, and approved my output data, and credited me with the certificates which I have lready sold. Its insane beyond words.</p>
  521.  
  522.  
  523.  
  524. <p>And actually the entire process is a colossal waste of time, because there are already a network of organizations who entire existence is simply reading meters and verifying that they are accurate, and reporting that data online. I am charged about £250 a year for this &#8216;service&#8217; (the real cost is likely under £1, its just a meter). Now ofgem could trivially just connect to the databases for those independent companies, read everyone&#8217;s data automatically, and credit the REGOs without any human interaction whatsoever. And as for verifying that the data really is renewable, the people who 100% absolutely independently KNOW what equipment is connected, are the DNO (Energy distribution network operator). There are a handful of meter readers, and a handful of DNOs, and this would be easy&#8230;but NO! Lets set up a torturous six month minimum process that involves websites that crash, tons of paperwork, complicated rules and processes and a staggering waste of everybody&#8217;s time. Because thats the UK energy industry. Are you surprised your bills are high?</p>
  525.  
  526.  
  527.  
  528. <p>So yeah&#8230; its been interesting.</p>
  529.  
  530.  
  531.  
  532. <p>I am HOPING that within a month, I will have stopped getting irritating emails from ofgem, I will not get any more letters about lawyers and leases, from one set of lawyers to another (I would love to jettison the entire profession into the sun at this point), and have a maintenance agreement signed.. and then finally I will be able to basically forget about the farm, apart from enjoying checking the stats!</p>
  533.  
  534.  
  535.  
  536. <p>I do still LOVE the fact that I built it, and own it though. Its awesome :D.</p>
  537.  
  538.  
  539.  
  540. <p></p>
  541. ]]></content:encoded>
  542. </item>
  543. <item>
  544. <title>Optimizing load times</title>
  545. <link>https://www.positech.co.uk/cliffsblog/2025/06/29/optimizing-load-times/</link>
  546. <comments>https://www.positech.co.uk/cliffsblog/2025/06/29/optimizing-load-times/#comments</comments>
  547. <dc:creator><![CDATA[cliffski]]></dc:creator>
  548. <pubDate>Sun, 29 Jun 2025 11:36:34 +0000</pubDate>
  549. <category><![CDATA[programming]]></category>
  550. <category><![CDATA[ridiculousspacebattles]]></category>
  551. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6921</guid>
  552.  
  553. <description><![CDATA[I recently watched a 2 hour documentary on the ZX spectrum, which means little to people from the USA, but it was a really early computer here in the UK. I am so old I actually had the computer BEFORE that, which was the ZX81, just a year earlier. The ZX81 was laughable by modern<p class="text-right"><span class="screen-reader-text">Continue Reading... Optimizing load times</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/06/29/optimizing-load-times/">Continue Reading...</a></p>]]></description>
  554. <content:encoded><![CDATA[
  555. <p>I recently watched a 2 hour documentary on the ZX spectrum, which means little to people from the USA, but it was a really early computer here in the UK. I am so old I actually had the computer BEFORE that, which was the ZX81, just a year earlier. The ZX81 was laughable by modern standards, and I expect the keyboard I am using has more processing power. It had an amazing 1kb of RAM (yes kb, not MB), no storage, no color, no sound, and no monitor. You needed to tune your TV into it and use that as a black and white monitor. Its this (terrible) PC I used to learn BASIC programming on.</p>
  556.  
  557.  
  558.  
  559. <p>Anyway, one of the features of ZX81/Spectrum days was loading a game from an audio cassette, instead of the alternative, which is copying the source code (line by line) from a gaming magazine and entering the ENTIRE SOURCE CODE of the game if you wanted to play it. Don&#8217;t forget, no storage, so if your parents then wanted to watch TV and made you turn it off, you had to type the source code again tomorrow. I can now type very fast&#8230; but the documentary also reminded me of another horror of back then, which was the painfully slow process of loading a game.</p>
  560.  
  561.  
  562.  
  563. <p>These days games load&#8230;a bit quicker, but frankly not THAT much quicker, especially given the incredible speed of modern hard drives, and massively so when talking about SSDS. Everything is so fats now, from SSD to VRAM bandwidth, to the CPU. Surely games should be able to load almost instantly&#8230;and yet they do not. So today I thought I&#8217;d stare at some profiling views of loading a large battle in Ridiculous Space Battles to see if I am doing anything dumb&#8230;</p>
  564.  
  565.  
  566.  
  567. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="799" height="424" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image.png" alt="" class="wp-image-6922" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image.png 799w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-680x361.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-768x408.png 768w" sizes="auto, (max-width: 799px) 100vw, 799px" /></figure>
  568.  
  569.  
  570.  
  571. <p>This is a screengrab from the AMD UProf profiler. My desktop PC has an AMD chip. I&#8217;ve started the game, gone to the &#8216;select mission&#8217; screen, picked one, loaded the deployment screen, then clicked fight, let the game load, and then quit. These are the functions that seem to be taking up most of the time. Rather depressing to see my text engine at the top there&#8230; but its a red herring. This is code used to DISPLAY text, nothing to do with loading the actual game. So a better way to look at it is a flame graph:</p>
  572.  
  573.  
  574.  
  575. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1750" height="1045" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-1.png" alt="" class="wp-image-6923" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-1.png 1750w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-1-680x406.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-1-768x459.png 768w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-1-1536x917.png 1536w" sizes="auto, (max-width: 1750px) 100vw, 1750px" /></figure>
  576.  
  577.  
  578.  
  579. <p>I love flame graphs. They are so good at presenting visual information about where all the time is going, and also seeing the call-stack depth at various points. This shows everything I did inside WinMain() which is the whole app, but I can focus in on the bit I care about right now which is actual mission loading&#8230;</p>
  580.  
  581.  
  582.  
  583. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1749" height="610" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-2.png" alt="" class="wp-image-6924" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-2.png 1749w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-2-680x237.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-2-768x268.png 768w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-2-1536x536.png 1536w" sizes="auto, (max-width: 1749px) 100vw, 1749px" /></figure>
  584.  
  585.  
  586.  
  587. <p>And now its at least relevant. It looks like there are basically 3 big things that happen during the &#8216;loading battle&#8217; part of the game, and they are &#8220;Loading the ships&#8221; &#8220;Loading the background&#8221; &#8220;Preloading assets&#8221;. The GUI_LoadingBar code is given a big list of textures I know I&#8217;ll need in this battle, and it then loads them all in, periodically stopping to update a loading progress bar. Is there anything I can do here?</p>
  588.  
  589.  
  590.  
  591. <p>Well ultimately, although it takes a bit of a call stack to get there, it does look like almost all of the delay here is inside some direct9 functions that load in data. I am very aware of the fact that directx had some super slow functions back in directx9, in its &#8216;d3dx&#8217; API, which I mostly replaced, but ultimately I am using some of that code still, specifically D3DXCreateTextureFromFileInMemoryEx&#8230;</p>
  592.  
  593.  
  594.  
  595. <p>Now I have already tried my best to make stuff fast, because I&#8217;ve made sure to first find the texture file (normally a DDS format, which is optimised for directx to use) on disk, and load the whole file into a single buffer in RAM before I even tell directx to do anything. Not only that, but I do have my own &#8216;pak&#8217; file format, which crunches all of the data together and loads it in one go, which presumably is faster due to less windows O/S file system and antivirus accessing slowdowns. However I&#8217;m currently not using that system&#8230; so I&#8217;ll swap to it (its a 1.8GB pak file with all the graphics in) and see what difference it makes&#8230;</p>
  596.  
  597.  
  598.  
  599. <p>Wowzers. It makes almost no difference. I wont even bore you with the graph.</p>
  600.  
  601.  
  602.  
  603. <p>And at this point I start to question how accurate these timings are, so I stick some actual timers in the code. In a test run, the complete run of GUI_Game::Activate() takes 3,831ms and the background initialise is just 0.0099. This is nonsense! I switched from instruction based to time-based sampling in uprof. That doesn&#8217;t now give me a flame graph, but it does also flag up that the D3DX png reading code is taking a while. The only png of significance is the background graphic, which my timers suggest is insignificant, but I think this I because it was loaded in the previous screen. I deliberately free textures between screens, but its likely still in RAM&#8230; I&#8217;ll add timers to the code that loads that file.</p>
  604.  
  605.  
  606.  
  607. <p>Whoah that was cool. I can now put that into excel and pick the slowest loaders&#8230;</p>
  608.  
  609.  
  610.  
  611. <pre class="wp-block-code"><code>Loaded &#91;data/gfx/\backgrounds\composite3.png] in 73.0598<br>Loaded &#91;data/gfx/\scanlines.bmp] in 20.0463<br>Loaded &#91;data/gfx/\planets\planet6s.dds] in 11.8662<br>Loaded &#91;data/gfx/\ships\expanse\expanse_stormblade_frigate_damaged.dds] in 10.7132<br>Loaded &#91;data/gfx/\ships\ascendency\g6battleship.dds] in 9.3622<br>Loaded &#91;data/gfx/\ships\ascendency\g5frigate.dds] in 6.9765</code></pre>
  612.  
  613.  
  614.  
  615. <p>OMGZ. So yup, that png file is super slow, and my bmp is super slow too. The obvious attempted fix is to convert that png to dds and see if it then loads faster. Its likely larger on disk, but requires virtually no CPU to process compared to png so here goes&#8230; That swaps a 2MB png for a 16MB (!!!!) dds file, but is it faster?</p>
  616.  
  617.  
  618.  
  619. <p>NO</p>
  620.  
  621.  
  622.  
  623. <p>Its 208ms compared with 73ms earlier. But frankly this is not an accurate test as some of this stuff may be cached. Also when I compare pngs of the same size, I&#8217;m noticing vast differences between how long they take to load:</p>
  624.  
  625.  
  626.  
  627. <pre class="wp-block-code"><code>Loaded &#91;data/gfx/\backgrounds\composite11.png] in 113.9637<br>Loaded &#91;data/gfx/\backgrounds\composite3.dds] in 208.7471<br>Loaded &#91;data/gfx/\backgrounds\composite5.png] in 239.3122</code></pre>
  628.  
  629.  
  630.  
  631. <p>So best to do a second run to check&#8230;</p>
  632.  
  633.  
  634.  
  635. <pre class="wp-block-code"><code>Loaded &#91;data/gfx/\backgrounds\composite11.png] in 112.8554<br>Loaded &#91;data/gfx/\backgrounds\composite3.dds] in 84.9467<br>Loaded &#91;data/gfx/\backgrounds\composite5.png] in 108.4374</code></pre>
  636.  
  637.  
  638.  
  639. <p>WAY too much variation here to be sure of whats going on. To try and be sure my RAM is not flooded with data I&#8217;d otherwise be loading, I&#8217;ll load Battlefield 2042 to use up some RAM then try again&#8230; Interestingly it only takes up 6GB. Trying again anyway&#8230;</p>
  640.  
  641.  
  642.  
  643. <pre class="wp-block-code"><code>Loaded &#91;data/gfx/\backgrounds\composite11.png] in 114.0210<br>Loaded &#91;data/gfx/\backgrounds\composite3.dds] in 85.6767<br>Loaded &#91;data/gfx/\backgrounds\composite5.png] in 105.8643</code></pre>
  644.  
  645.  
  646.  
  647. <p>Well that IS actually getting a bit more consistent. I&#8217;ll do a hard reboot&#8230;</p>
  648.  
  649.  
  650.  
  651. <pre class="wp-block-code"><code>Loaded &#91;data/gfx/\backgrounds\composite11.png] in 104.3017
  652. Loaded &#91;data/gfx/\backgrounds\composite3.dds] in 207.8332
  653. Loaded &#91;data/gfx/\backgrounds\composite5.png] in 141.2645</code></pre>
  654.  
  655.  
  656.  
  657. <p>Ok so NO, a hard reboot is the best test, and swapping to DDS files for the huge background graphics is a FAIL. These are 2048 x 2048 images. At least I know that. The total GUI_Game::Activate is 7,847ms. That png is only about 1-2% of this, and it makes me wonder if converting all the dds files to png would in fact be the best solution to speed up load times? The only other option would be to speed up DDS processing somehow. Having done some reading, it IS possible to use multithreading here, but it looks like my actual file-access part of the code is not vaguely the bottleneck, although I&#8217;ll split out my code from the directx code to check (and swap back to a png&#8230;)</p>
  658.  
  659.  
  660.  
  661. <pre class="wp-block-code"><code>Creating texture &#91;data/gfx/\backgrounds\composite11.png]<br>PreLoad Code took 1.0205<br>D3DXCreateTextureFromFileInMemoryEx took 111.4467<br>PostLoad Code took 0.0001<br>Creating texture &#91;data/gfx/\backgrounds\composite3.png]<br>PreLoad Code took 28.4150<br>D3DXCreateTextureFromFileInMemoryEx took 71.1481<br>PostLoad Code took 0.0001<br>Creating texture &#91;data/gfx/\backgrounds\composite5.png]<br>PreLoad Code took 0.9654<br>D3DXCreateTextureFromFileInMemoryEx took 105.2158<br>PostLoad Code took 0.0001</code></pre>
  662.  
  663.  
  664.  
  665. <p>Yeah&#8230;so its all the directx code that is the slowdown here. Grok suggests writing my own D3DXCreateTextureFromFileInMemoryEx function, which sounds possible but annoying.</p>
  666.  
  667.  
  668.  
  669. <p>Ok&#8230;mad though it sounds, I&#8217;ve done that. Lets try again!</p>
  670.  
  671.  
  672.  
  673. <pre class="wp-block-code"><code>Creating texture &#91;data/gfx/\backgrounds\composite11.png]<br>PreLoad Code took 0.8327<br>D3DXCreateTextureFromFileInMemoryEx took 103.4365<br>PostLoad Code took 0.0001<br>Creating texture &#91;data/gfx/\backgrounds\composite3.png]<br>PreLoad Code took 0.6053<br>D3DXCreateTextureFromFileInMemoryEx took 73.9393<br>PostLoad Code took 0.0002<br>Creating texture &#91;data/gfx/\backgrounds\composite5.png]<br>PreLoad Code took 0.9069<br>D3DXCreateTextureFromFileInMemoryEx took 105.0180<br>PostLoad Code took 0.0001</code></pre>
  674.  
  675.  
  676.  
  677. <p>Am I just wasting my life? at least I now have the source code to the DDS loader because it is MY code bwahahaha. So I can tryu and get line level profiling of this stuff now&#8230; I&#8217;ll try the visual studio CPU profiler:</p>
  678.  
  679.  
  680. <div class="wp-block-image">
  681. <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="224" height="55" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-3.png" alt="" class="wp-image-6928"/></figure></div>
  682.  
  683.  
  684. <p>Thanks Microsoft. But there may be more&#8230;</p>
  685.  
  686.  
  687.  
  688. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1870" height="229" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-4.png" alt="" class="wp-image-6929" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-4.png 1870w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-4-680x83.png 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-4-768x94.png 768w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/image-4-1536x188.png 1536w" sizes="auto, (max-width: 1870px) 100vw, 1870px" /></figure>
  689.  
  690.  
  691.  
  692. <p>The Visual studio flame graph is saying that actually the raw reading from disk of the file IS a major component of all this, and so is a memcpy I do somewhere&#8230; Actually its inside the fast DDS loader, so the flame graph is confusing. The DDS loops doing memcpy calls for each line of data. This is very bad. With a big file, there will be 2,048 calls to memcpy just to read it in. Surely we can improve on that? and yet its clear thats what D3DXCreateTextureFromFileInMemoryEx is doing, as seen earlier. Hmmmm. And now people have come to visit and I have to stop work at this vital cliffhanger&#8230;</p>
  693. ]]></content:encoded>
  694. <wfw:commentRss>https://www.positech.co.uk/cliffsblog/2025/06/29/optimizing-load-times/feed/</wfw:commentRss>
  695. <slash:comments>7</slash:comments>
  696. </item>
  697. <item>
  698. <title>Visiting the solar farm, 8 months after energization</title>
  699. <link>https://www.positech.co.uk/cliffsblog/2025/06/17/visiting-the-solar-farm-8-months-after-energization/</link>
  700. <dc:creator><![CDATA[cliffski]]></dc:creator>
  701. <pubDate>Tue, 17 Jun 2025 08:01:47 +0000</pubDate>
  702. <category><![CDATA[solar]]></category>
  703. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6914</guid>
  704.  
  705. <description><![CDATA[Because we happened to be (vaguely) in the same part of the country, we decided to go pay a quick visit to the solar farm. Its been energized for about 8 months now, although there have been 2 periods of downtime for some work since then, so we still do not yet have a nice<p class="text-right"><span class="screen-reader-text">Continue Reading... Visiting the solar farm, 8 months after energization</span><a class="btn btn-secondary continue-reading" href="https://www.positech.co.uk/cliffsblog/2025/06/17/visiting-the-solar-farm-8-months-after-energization/">Continue Reading...</a></p>]]></description>
  706. <content:encoded><![CDATA[
  707. <p>Because we happened to be (vaguely) in the same part of the country, we decided to go pay a quick visit to the <a href="http://www.positechenergy.com">solar farm</a>. Its been energized for about 8 months now, although there have been 2 periods of downtime for some work since then, so we still do not yet have a nice clean 6 months of data to extrapolate from. Also I had my drone with me to take &#8216;finished farm&#8217; pictures :D.</p>
  708.  
  709.  
  710.  
  711. <p>The situation with the farm is that it is 99% finished. There is some tree planting to do (one of the planning constraints), which will have to wait until later in the year, and also it has a problem regarding shutdown. When the site loses power (due to a grid outage), it then does NOT come right back online automatically, which is frustrating. It should, and its back to negotiations between the construction company and the DNO as to why this doesn&#8217;t work yet, and fixing it.</p>
  712.  
  713.  
  714.  
  715. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1200" height="900" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/drone1-1.jpg" alt="" class="wp-image-6917" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/drone1-1.jpg 1200w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/drone1-1-680x510.jpg 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/drone1-1-768x576.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>
  716.  
  717.  
  718.  
  719. <p>From my point of view, there are also two other things that are still *not done* yet. These are, to get a maintenance contract in place (we are still waiting for quotes from fire suppression system inspectors) and also to get ofgem to finally accept that this is indeed a solar farm. That last point is especially irritating, but I finally think, 8 months after switching on that we are close to the end game on that one. The bureaucracy is insane. Why they need to know how many panels are on each string of each inverter is beyond me. The DNO didn&#8217;t even care about this, and we connect this kit to THEIR network&#8230; As a reminder, this is so we get accredited to produce REGOs, which are certificates to prove a MWH of power was renewable. You can sell those certificates for about £10 each to companies who want to claim their power is 100% renewable.</p>
  720.  
  721.  
  722.  
  723. <p>Anyway&#8230;</p>
  724.  
  725.  
  726.  
  727. <p>Its always pretty cool to see the site, and remember that I actually own it! I love my 10 home solar panels, so going to see the other 3,024 is pretty cool. I was surprised just how NOISY inverters are in summer. I assume this is active cooling, as we were there early afternoon in June. If you think your home inverter for your panels never makes a noise, thats likely because its a 4kw one, and 100kw ones have way more juice flowing through them. I think I could hear the inverters from about 15 feet away.</p>
  728.  
  729.  
  730.  
  731. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1280" height="400" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/sheep.jpg" alt="" class="wp-image-6918" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/sheep.jpg 1280w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/sheep-680x213.jpg 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/sheep-768x240.jpg 768w" sizes="auto, (max-width: 1280px) 100vw, 1280px" /></figure>
  732.  
  733.  
  734.  
  735. <p>Broadly things were ok, I was VERY happy to see how clean the panels are, 8 months into energization and probably a year into mounting, so this bodes well for minimal cleaning costs. How grubby panels get really depends on circumstances. This is a livestock field, so crop dust is not constantly blowing near them, which probably helps. I did encounter a bunch of things that I had to complain to the construction company about. I guess its just like having builders come work on your house, but 100x bigger in scale. I really hate that side of the project, but it comes with the territory. It was also good to meet up with the landowner, who is a great guy, very understanding, and a great &#8216;man on the ground&#8217; who can tell me about any problems directly without it being filtered through a third party.</p>
  736.  
  737.  
  738.  
  739. <p>One of the main reasons I wanted to take a look again was to try and get better drone pictures, as last time the site was not 100% finished and my drone had software issues (DJI apps suck!). This time it worked, and I took some, as you see, but it was pretty windy. Being on a hilltop does not help, and I braved the &#8216;LAND DRONE IMMEDIATELY&#8217; warnings as long as I could, but they are obviously not pro level snaps :D. I also found one broken panel, from when the site suffered storm damage, which shouldn&#8217;t be left there really. It was interesting to see a folded and broken solar panel though. You don&#8217;t see many of those.</p>
  740.  
  741.  
  742.  
  743. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1200" height="554" src="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/broken1-rotated.jpg" alt="" class="wp-image-6915" srcset="https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/broken1-rotated.jpg 1200w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/broken1-680x314.jpg 680w, https://www.positech.co.uk/cliffsblog/wp-content/uploads/2025/06/broken1-768x355.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>
  744.  
  745.  
  746.  
  747. <p>Overall I&#8217;m happy, the site is generating nicely in summer. the end of this month will be when I can do a proper financial analysis, as the output mirrors around midsummer so 6 months data gives me a great yearly prediction. I really want it to break even!</p>
  748. ]]></content:encoded>
  749. </item>
  750. <item>
  751. <title>Ridiculous Space Battles developer blog #1</title>
  752. <link>https://www.positech.co.uk/cliffsblog/2025/06/07/ridiculous-space-battles-developer-blog-1/</link>
  753. <dc:creator><![CDATA[cliffski]]></dc:creator>
  754. <pubDate>Sat, 07 Jun 2025 14:18:43 +0000</pubDate>
  755. <category><![CDATA[gratuitous space battles]]></category>
  756. <category><![CDATA[ridiculousspacebattles]]></category>
  757. <guid isPermaLink="false">https://www.positech.co.uk/cliffsblog/?p=6911</guid>
  758.  
  759. <description><![CDATA[I finally dug out my greenscreen to make a developer blog video again. Its about 20 mins long:]]></description>
  760. <content:encoded><![CDATA[
  761. <p>I finally dug out my greenscreen to make a developer blog video again. Its about 20 mins long:</p>
  762.  
  763.  
  764.  
  765. <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
  766. <iframe loading="lazy" title="Ridiculous Space Battles Developer Blog #1" width="640" height="360" src="https://www.youtube.com/embed/GglvfYcaATg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
  767. </div></figure>
  768. ]]></content:encoded>
  769. </item>
  770. </channel>
  771. </rss>
  772.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//feeds.feedburner.com/cliffski

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda