Alt-F4 #52 - Rychlost Tekuté Elektřiny 12-11-2021
přeložil oof2win2
Pro naše 52. vydání, stringweasel se vrácí pro druhou část Experimentu Tekutá Elektřina, ve které ukáže docela překvapující rychlostní dopady jeho výtvoru! Pokud se vám líbíl článek minulý týden, bude se vám líbit i druhá část tento týden. Jak milé překvapení!
Experiment Tekuté Elektřiny: Část Druhá stringweasel
Co to vlastně je?
V článku minulého týdne, mluvil jsem o historii změn módech o změnách v Factorio systému elektřiny a jak fungovaly, poté jsem vysvětlil svůj vlastní mód pod jménem Tekutá Elektřina. Doporučuji, aby jste si přečetli článek minulého týdne, ale v základě, změnil jsem distribuci elektřiny v Factoriu aby byla realističtější tím, že jsem ji simuloval jako tekutinu - s použitím již existujících mechanik tekutiny. Toto znamená, že potřebujete používat transformátory, aby jste snížili redukci napětí přes delší vzdálenosti. Také to ale znamená, že je těžší zásobovat laserové věžě elektřinou aby běžely na 100%, nebo používat továrny s mnoha majáky.
Typto nové limitace znamenají, že Tekutá Elektřina dosáhla svého cíle vytváření nové, realistické herní mechaniky, která je blíže reálné elektřině. Také to ale s sebou nese horší následky pro rychlost simulace hry s těmi všemy novými kalkulacemi. Nechtěl jsem na modový portál dát mód, který by váš počítač kompletně zastavil, pokud by jste postavili průměrnou továrnu. Proto jsem se rozhodl udělat svůj vlastní výzkum. Mají nové simulace tekutin vůbec znatelný dopad?
Je to hratelné?
Je důvod, proč Factorio implementuje elektřinu, kterým je. Dovoluje nám stavět absolutně masivní továrny v takových velikostech, že se v nich ztratíte. Přídavek realističtější energie by mohl viditelně snížit výkon hry až tak, že by jste museli stavět mnohem menší továrny, a to nikdo nechce. Otázka tedy zní: Co by byl výkon Factoria, kdyby byla tekutina tekoucí zkrz každý elektrický sloup? Potřeboval jsem mapu na stavbu, a proto jsem se rozhodl postavic novou bázi s Tekutou Elektřinou s pomocí kamaráda JanKrater.
Můj cíl pro tuto bázi byl vymyslet nejefektivnější způsob, jak ji postavit, a poté udělat pravý opak (ve většině případech). Toto mě nechalo s špagetovou bází s až moc elektrickými sloupy, zašněrovanými pásy, a až moc hladových laserových věží. Jako nejdůležitější, dokáže vyrábět 45 vědy za minutu, a využívá zhruba 600 MW, s ani jedním modulem efektivity v dohledu.
Normálně, Factorio běží zhruba na 60 aktualizacích za sekundu (nazíváno UPS), a byl jsem schopen tuto bázi spustit na 70 UPS na mém starším počítači (i7-4770k 3.5GHz CPU, DDR3-1600MHz RAM). Toto znamená, že trvalo pouhých ~14ms
, aby se celá báze zaktualizovala, čemuž se říká jeden tik, kde 60 UPS je maximální hodnota, kde pro jeden tik je maximální doba aktualizace 1/60 = ~16.6ms
. Toto číslo je také ukázáno pod “show-time-usage” debug výstupem. Zajímavě, toto ukazuje že můj mód (mod-FluidicPower
) má nepatrný dopad na hru (~0.05ms
). Toto je ale nejspíše možné, protože můj mód sám nedělá mnoho výpočtů, ale přenechává je na hře samotné, která je mnohem optimalizovanější. Hlavní informace o časové době jsou v Fluid Manager
a Electric Network
.
V výstupu nahoře, hra vám říká, kde je většina času strávena, a ze začátku mě zmátlo, že hra tráví většinu času na Electric Network
. Mé očekávání by bylo, že Fluid Manager
by bylo nejhorší pro výkon, ale místo toho, Electric Network
(~10ms
) využívá přes 70% času aktualizace (~13.7ms
), a Fluid Manager
(~0.03ms
) nevypadá, že něco vůbec dělá. Toto nedává žádný smysl, protože jsem čekal počet výpočtů tekutin mnohem vyšší. Podíval jsem se na fóra technického Factoria, kde lidé posouvají hranice Factoria. Zde mi briliantní matematik SteveTrov vysvětlil, proč časové využití hry může být mylné polkud nevíte jak jsou časové výpočty implementovány. Popsal je takto:
Jako první, časové využití hry je mylné, protože výpočty tekutiny a elektřiny běží parallelně. Toto je zhruba co se většinou děje:
- Výpočty elektrické sítě začají a časovač elektrických sítí začne
- Updaty teploty začnou
- Několik výpočtů tekutin začne
- Když časovač elektřiny skončí, čas je zapsán pod aktualizací elektrických sítí. Časovač aktualizací tekutin efektivně začne
- Až všechny výpočty tekutin přestanou (což se většinou stane před krokem 4), časovač výpočtů tekutin je zastaven
Efekt zde je, že časovač aktualizací tekutin je skoro vždy nízký.
Firstly, the time usage stats are confusing because the fluid and electric network update are run in parallel threads. This is roughly what happens most of the time:
- The electric network thread is started and the electric network update timer is started.
- The heat update thread is stated
- Multiple fluid update threads are started.
- When the electric update thread finishes the time used is recorded under electric network update. The fluid update timer is effectively started now.
- When the fluid threads have all finished (they normally do before step 4) the fluid update timer is stopped.
So the effect of this is that the fluid update time is nearly always very low.
— SteveTrov
Toto esenciálně znamená, že časové využití výpočtů tekutin jsou zapleteny v časových výpočtech elektřiny a tepla. Není možné vypočítat správnou metriku pro to, jaká část trvá déle, bez změny Factoria samotného. Potřebuji najít jiný způsob, kterým zjistím pokud Electric Network
doopravdy zabírá více času než Fluid Manager
, a o kolik.
UPS expert pod jménem flame_Sla poté navrhl, abych si stáhl Very Sleepy Profiler (Velice Ospalý Profilér), abych zjistil detailnější informace o tom, jaké funkce se v C++ kódu Factoria volají nejvíce. Jejich komunita často využívá tento nástroj, aby mohli optimalizovat největší megabáze na světě a nejefektivnější megabáse v rozměru UPS. Výstup tohoto nástroje lze vidět níže, s funkcemi které trvají nejdéle řazenými sestupně. flame_Sla také říkal, abychom se nekoukali na absolutní časy, ale místo toho to použili jako metriku pro největší pachatele snížení rychlosti hry.
Toto ukázalo něco, co jsem vůbec nečekal. Systém tekutiny (FluidSystem::update
) byl v pouhé top desítce nejhorších funkcí, a elektrická síť pořád využívala více procesujícího času! Nakonec největší problém byla funkce FlowStatistics<ID<...>...>::onFlow
, která je nejvíce volána elektrickou sítí. Tyto statistiky toku sbírají potřebná data pro shlédnutí herních grafů, například okno výroby elektřiny. To znamená, že hra nezpomaluje pouze kvůli novým výpočtům tekutin, ale také aby pozbírala informace pro kreslení grafů o nových elektrických sítích!
Je velice pravděpodobné, že sbírání statistik Electric Network
také může zabírat hodně času s Tekutou Elektřinou. Factorio je designované mít pouze pár elektrických sítí, nebo i pouze jednu. Hra musí sčítat a aktualizovat informace pro každou elektrickou síť kterou máte, což většinou je pouze pár rozdílných dat. Místo toho aby jste měli pouze pár síťí, Tekuté Elektřina je stavěna tak, že každý elektrický sloup má svou elektrickou síť. Factorio poté bude zkoušet sčítat statistiky pro zhruba 3000 elektrických sítí v mé testovací hře! To je minimálně stokrát více sítí, než pro co je Factorio designováno. Toto byla známá limitace pro mnoho módů, ale Tekutá Elektřina toto bere do nových extrémů. Na druhou stranu ale ještě nevíme dopad těchto výpočtů relativně k výpočtům tekutin. Je sběr statistik tak náročný, než samotné výpočty tekutin?
flame_Sla řekl, že se mu jednou podařilo změrit časové využití tekutinových výpočtů na celosvětově největší megabázi, a prý že používalo pouhých 0.4ms
pro 40KSPM 60UPS megabázi! To znamená, že pouhých 2.5% času na aktualizacích bylo stráveno na výpočtech tekutin! Způsobem, kterým izoloval výpočty tekutin od elektrických sítí kompletně eliminoval elektrické sítě z výpočtů. Tohoto docílil tím, že všechny stroje běžěly na dřevo, což znamenalo, že žádná elektřina nebyla použita a elektrická síť nic nedělala. Z metod jak Tekutá Elektřina funguje, nemohu lehce eliminovat efekt elektrických sítí stejným způsobem bez toho, aniž bych snížil výpočty tekutin, ale jsem schopen to obrátit na druhou stranu! Jsem schopen odstranit všechny komponenty týkající se tekutin, a místo jich použít EEI, které jsou schopny vyrábět nebo používat elektřinu. Toto bude čistě eliminovat všechny komponenty tekutin, bez toho aniž by se snížilo napětí na elektrickou síť, což je docíleno tím, že továrna běží jako normálně. Abychom mohli zapsat správný výsledek, snažil jsem se, aby Factorio běžělo pouze na jednom jádru. Spustil jsem rychlý skript, který změnil skryté komponenty tekutin zpoza elektrichých sloupů pro tento test a výsledky jsou následující:
Začátek | Modifikováno | Rozdíl | |
---|---|---|---|
Výpočty elektřiny | 9.3ms | 9.2ms | 0.1ms |
Výpočty tepla | 0.03ms | 0.03ms | 0ms |
Výpočty tekutin | 0.13ms | 0.08ms | 0.05ms |
Součet | 9.46ms | 9.31ms | 0.15ms |
Toto ukazuje, že všechny extra výpočty tekutin z módu Tekutá Elektřina trvají zhruba ~0.15ms
! Toto číslo nejspíše není přesné, protože je to v rozhledu ruchu pro špagetovou bázi, test není ideální, a měření času v paralelních vláknech není přesné. Dává nám to ale dobrou indikaci, kam většina procesujícího času jde. Toto ukazuje, že elektrická síť má zdaleka největší dopad na výkon, zatímco výpočty tekutin jsou zanedbatelné. Také to dovoluje přemýšlet, co by se stalo, kdyby elektrická síť nemusela bezdůvodně sbírat statistiky - možná by jsme viděli megabáze Tekuté Energie s gigantickými transformátory vedle nukleárních reaktorů a masivních polí solárních panelů.
Se vším všudy, Tekutá Elektřina má mnohem lepší výkon, než jsem čekal. Jakékoli viditelná zpomalení jsou nejspíše od mnohých elektrických sítí, které sbírají statistiky, a ne od samotných komponentů tekutin. Nejspíše budete schopni odpálit raketu bez toho, aniž by jste měli UPS pod 60. Také budete asi možni postavit docela větší bázi, pokud budete mít efektivní rozložení (byl jsem schopen dosáhnout 90SPM na 220 UPS!), a mód nebude nutně demolovat vaše UPS, jak Rseding91 řekl. Factorio je naštěstí vysoce optimalizováno, i když neběží, jak bylo myšleno. Toto dokazuje, že Tekutá Elektřina je definitivně hratelná z ohledu výkonu - ale to není jediný aspekt, který se počítá.
Měli by jste si zahrát?
Osobně si myslím, že Tekutá Elektřina vytváří velmi zábavnou výzvu. Možná to není pro vás, pokud chcete stavět velkou megabázi, ale pokud si chcete záhrát zajímavou, dobrodružnou hru s novými výzvami, myslím si, že tento mód je přesně pro vás. Hodně jsem si užil překonávání překážek, které jsou vytvořeny novým stylem hraní. Například, stroje nejdále od vašich parních strojů se vypnou jako první, což jsou většinou elektrické těžební stroje, které těží uhlí pro vaše elektrické boilery. Nikdy v minulosti jsem si nezahrál takovou unikátní spirálu smrti. Nebo pokud budete bránit vaše zdi s elektrickými věžmi, budete muset zajistit dostatek transformátorů s dostatečným napětím.
Moje nejoblíběnější část tohoto módu ale je fakt, že vím, že doopravdová elektřina teče zkrz elektrické vedení. Jste schopni sami vidět vlny nedostatků elektřiny zkrz vaše stroje, když vaše báze konzumuje příliš energie, napřiklad když moc elektrickžch věží páli najednou. Je to podobný pocit, který dostávám, když se podívám na obvod, který jsem nadesignoval, s tím, že vím, že funguje kvůli tekutosti elektronů zkrz měď a silikon. Staví na pocitu, že vidíte komplexní sítě pásů, které spolupracují, aby postavily raketu. Bázi to dává pocit životnosti. Jste vlastně schopni vidět její stabilní tlukot srdce, a je to velmi uspokojující.
Přispívání
Jako vždy, hledáme lidi, kteří by chtěli přispět do Alt-F4, ať už příspěvem článku, nebo pomáháním s překlady. Pokud máte něco zajímavého na mysli a chtěli by jste se podělit s komunitou upraveným způsobem, toto je místo, kde můžete učinit. Pokud si nejse úplně jisti o tom, rádi vám pomůžeme diskuzí nápadů a strukturací otázek. Pokud se vám to líbí, přidejte se na Discord aby jste začali!