[{"data":1,"prerenderedAt":643},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fadr":3,"surround:\u002Fgame-engine\u002Fadr":392,"navigation":403},{"id":4,"title":5,"body":6,"description":384,"extension":385,"meta":386,"navigation":387,"path":388,"seo":389,"stem":390,"__hash__":391},"docs\u002F01.game-engine\u002F11.adr.md","Decyzje architektoniczne",{"type":7,"value":8,"toc":367},"minimark",[9,14,28,32,145,149,175,181,185,194,199,203,208,213,217,222,231,235,244,253,257,262,267,271,289,294,298,310,315,319,328,333,337],[10,11,13],"h2",{"id":12},"po-co-adr","Po co ADR",[15,16,17,18,22,23,27],"p",{},"Każda decyzja, której cofnięcie kosztowałoby więcej niż tydzień pracy, ma swój rekord. Format jest stały: ",[19,20,21],"strong",{},"Kontekst → Decyzja → Konsekwencje → Odrzucone alternatywy",". Status ",[24,25,26],"code",{},"przyjęta"," oznacza, że kod i dokumentacja są z nią zgodne.",[10,29,31],{"id":30},"lista-decyzji","Lista decyzji",[33,34,35,51],"table",{},[36,37,38],"thead",{},[39,40,41,45,48],"tr",{},[42,43,44],"th",{},"Nr",[42,46,47],{},"Decyzja",[42,49,50],{},"Status",[52,53,54,65,75,85,95,105,115,125,135],"tbody",{},[39,55,56,60,63],{},[57,58,59],"td",{},"0001",[57,61,62],{},"Izolacja adaptera przez porty",[57,64,26],{},[39,66,67,70,73],{},[57,68,69],{},"0002",[57,71,72],{},"Wersjonowany format JSON z łańcuchem migracji",[57,74,26],{},[39,76,77,80,83],{},[57,78,79],{},"0003",[57,81,82],{},"Brak ECS — prototyp oceniony i odrzucony",[57,84,26],{},[39,86,87,90,93],{},[57,88,89],{},"0004",[57,91,92],{},"WASM opcjonalny, tylko przy mierzalnej przewadze",[57,94,26],{},[39,96,97,100,103],{},[57,98,99],{},"0005",[57,101,102],{},"Brak SPA fallback — stan w query stringu",[57,104,26],{},[39,106,107,110,113],{},[57,108,109],{},"0006",[57,111,112],{},"Jedna wersja dla wszystkich pakietów",[57,114,26],{},[39,116,117,120,123],{},[57,118,119],{},"0007",[57,121,122],{},"Bramy jakości jako blokujące komendy",[57,124,26],{},[39,126,127,130,133],{},[57,128,129],{},"0008",[57,131,132],{},"Playground jako jeden klasyczny plik HTML",[57,134,26],{},[39,136,137,140,143],{},[57,138,139],{},"0009",[57,141,142],{},"Dokumentacja jako generowana jedna strona",[57,144,26],{},[10,146,148],{"id":147},"_0001-izolacja-adaptera-przez-porty","0001 — Izolacja adaptera przez porty",[15,150,151,154,155,158,159,158,162,158,165,158,168,158,171,174],{},[19,152,153],{},"Decyzja:"," rdzeń nie importuje Phasera; cały runtime idzie przez sześć interfejsów (",[24,156,157],{},"RenderPort",", ",[24,160,161],{},"PhysicsPort",[24,163,164],{},"CameraPort",[24,166,167],{},"InputPort",[24,169,170],{},"AudioPort",[24,172,173],{},"AssetBackend",").",[15,176,177,180],{},[19,178,179],{},"Konsekwencje:"," kod gry testowalny w Node, wymienny backend, ale dodatkowa warstwa abstrakcji i konieczność feature-detection dla metod opcjonalnych. Pilnują tego ESLint i test skanujący źródła.",[10,182,184],{"id":183},"_0002-wersjonowany-format-json","0002 — Wersjonowany format JSON",[15,186,187,189,190,193],{},[19,188,153],{}," projekt ma ",[24,191,192],{},"formatVersion"," i łańcuch migracji; eksport zawiera sumę FNV-1a.",[15,195,196,198],{},[19,197,179],{}," stare projekty otwierają się w nowych wersjach silnika; migracje są addytywne i idempotentne.",[10,200,202],{"id":201},"_0003-brak-ecs","0003 — Brak ECS",[15,204,205,207],{},[19,206,153],{}," prototyp ECS został zbudowany, zmierzony i odrzucony. Zostają komponenty z fazami systemowymi.",[15,209,210,212],{},[19,211,179],{}," prostszy model mentalny i przewidywalna kolejność faz przy zachowaniu wydajności (0,72 ms\u002Fklatkę dla 20 000 obiektów). Pełny ECS wymagałby przebudowy indeksów i serializacji.",[10,214,216],{"id":215},"_0004-wasm-opcjonalny","0004 — WASM opcjonalny",[15,218,219,221],{},[19,220,153],{}," most WASM istnieje, ale moduł dodajemy tylko po benchmarku TS vs WASM.",[15,223,224,226,227,230],{},[19,225,179],{}," ",[24,228,229],{},"required: false"," nie wywala gry przy braku pliku; zespół nie utrzymuje natywnego kodu „na wszelki wypadek”.",[10,232,234],{"id":233},"_0005-brak-spa-fallback","0005 — Brak SPA fallback",[15,236,237,239,240,243],{},[19,238,153],{}," gra żyje pod stałym adresem katalogu, stan trzyma w query stringu; nieznane ścieżki zwracają ",[24,241,242],{},"404.html",".",[15,245,246,248,249,252],{},[19,247,179],{}," względne ",[24,250,251],{},".\u002Fassets\u002F…"," działają w dowolnym podkatalogu; deep-linking po ścieżkach nie istnieje i nie jest potrzebny.",[10,254,256],{"id":255},"_0006-jedna-wersja-dla-wszystkich-pakietów","0006 — Jedna wersja dla wszystkich pakietów",[15,258,259,261],{},[19,260,153],{}," wszystkie pakiety w monorepo mają tę samą wersję (lockstep).",[15,263,264,266],{},[19,265,179],{}," zero macierzy kompatybilności wewnętrznej; release jednego pakietu oznacza release wszystkich.",[10,268,270],{"id":269},"_0007-bramy-jakości-jako-blokujące-komendy","0007 — Bramy jakości jako blokujące komendy",[15,272,273,226,275,158,278,158,281,284,285,288],{},[19,274,153],{},[24,276,277],{},"typecheck",[24,279,280],{},"test",[24,282,283],{},"bench:check"," i ",[24,286,287],{},"bundle:check"," kończą się kodem 1 przy problemie.",[15,290,291,293],{},[19,292,179],{}," CI nie potrzebuje parserów wyjścia; regresja wydajności i rozmiaru blokuje merge tak samo jak błąd typów.",[10,295,297],{"id":296},"_0008-playground-jako-jeden-plik-html","0008 — Playground jako jeden plik HTML",[15,299,300,226,302,305,306,309],{},[19,301,153],{},[24,303,304],{},"npm run build:single"," tworzy ",[24,307,308],{},"playground.html"," działający bez sieci.",[15,311,312,314],{},[19,313,179],{}," grę można wysłać mailem i otworzyć z dysku; próg rozmiaru single-file to +5%.",[10,316,318],{"id":317},"_0009-dokumentacja-jako-generowana-jedna-strona","0009 — Dokumentacja jako generowana jedna strona",[15,320,321,323,324,327],{},[19,322,153],{}," kanoniczna dokumentacja to generowany ",[24,325,326],{},"docs\u002Findex.html"," z wyszukiwaniem i PL\u002FEN.",[15,329,330,332],{},[19,331,179],{}," dokumentacja działa offline i bez serwera; źródła pozostają w Markdown.",[10,334,336],{"id":335},"jak-dodać-rekord","Jak dodać rekord",[338,339,340],"steps",{},[341,342,343,350,357,360],"ol",{},[344,345,346,347,243],"li",{},"Numer kolejny, czterocyfrowy, plik ",[24,348,349],{},"NNNN-krotki-opis.md",[344,351,352,353,356],{},"Wpis w tabeli indeksu — ",[24,354,355],{},"scripts\u002Frelease.mjs --check"," zgłasza rekord bez wpisu.",[344,358,359],{},"Sekcje: Kontekst, Decyzja, Konsekwencje (także koszty), Odrzucone alternatywy.",[344,361,362,363,366],{},"Zmiana decyzji = nowy rekord ze statusem ",[24,364,365],{},"zastępuje 000N",", nie edycja historii.",{"title":368,"searchDepth":369,"depth":369,"links":370},"",3,[371,373,374,375,376,377,378,379,380,381,382,383],{"id":12,"depth":372,"text":13},2,{"id":30,"depth":372,"text":31},{"id":147,"depth":372,"text":148},{"id":183,"depth":372,"text":184},{"id":201,"depth":372,"text":202},{"id":215,"depth":372,"text":216},{"id":233,"depth":372,"text":234},{"id":255,"depth":372,"text":256},{"id":269,"depth":372,"text":270},{"id":296,"depth":372,"text":297},{"id":317,"depth":372,"text":318},{"id":335,"depth":372,"text":336},"Dziewięć rekordów ADR — decyzje, których cofnięcie kosztowałoby więcej niż tydzień pracy. Kontekst, decyzja, konsekwencje.","md",{},true,"\u002Fgame-engine\u002Fadr",{"title":5,"description":384},"01.game-engine\u002F11.adr","1tcxRMLGPBJ4_MMnqvzjbxv-qxYA6LN7U-eoK5mzuNI",[393,398],{"title":394,"path":395,"stem":396,"description":397,"children":-1},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples","[object Object]",{"title":399,"path":400,"stem":401,"description":402,"children":-1},"Przegląd","\u002Freverse-proxy","02.reverse-proxy\u002F01.index","Lekki, produkcyjny reverse proxy w Go — load balancing, health checks, circuit breaker, rate limiting, metryki Prometheus i graceful shutdown.",[404,517,576],{"title":405,"path":406,"stem":407,"children":408},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[409,410,414,418,422,448,477,490,511,515,516],{"title":399,"path":406,"stem":407},{"title":411,"path":412,"stem":413},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":415,"path":416,"stem":417},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":419,"path":420,"stem":421},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":423,"path":424,"stem":425,"children":426,"page":447},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[427,431,435,439,443],{"title":428,"path":429,"stem":430},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":432,"path":433,"stem":434},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":436,"path":437,"stem":438},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":440,"path":441,"stem":442},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":444,"path":445,"stem":446},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":449,"path":450,"stem":451,"children":452,"page":447},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[453,457,461,465,469,473],{"title":454,"path":455,"stem":456},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":458,"path":459,"stem":460},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":462,"path":463,"stem":464},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":466,"path":467,"stem":468},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":470,"path":471,"stem":472},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":474,"path":475,"stem":476},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":478,"path":479,"stem":480,"children":481,"page":447},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[482,486],{"title":483,"path":484,"stem":485},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":487,"path":488,"stem":489},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":491,"path":492,"stem":493,"children":494,"page":447},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[495,499,503,507],{"title":496,"path":497,"stem":498},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":500,"path":501,"stem":502},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":504,"path":505,"stem":506},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":508,"path":509,"stem":510},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":512,"path":513,"stem":514},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":394,"path":395,"stem":396},{"title":5,"path":388,"stem":390},{"title":518,"path":400,"stem":401,"children":519},"Reverse Proxy",[520,521,524,527,548],{"title":399,"path":400,"stem":401},{"title":411,"path":522,"stem":523},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":415,"path":525,"stem":526},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":528,"path":529,"stem":530,"children":531,"page":447},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[532,536,540,544],{"title":533,"path":534,"stem":535},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":537,"path":538,"stem":539},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":541,"path":542,"stem":543},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":545,"path":546,"stem":547},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":549,"path":550,"stem":551,"children":552,"page":447},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[553,557,561,565,568,572],{"title":554,"path":555,"stem":556},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":558,"path":559,"stem":560},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":562,"path":563,"stem":564},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":512,"path":566,"stem":567},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":569,"path":570,"stem":571},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":573,"path":574,"stem":575},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":577,"path":578,"stem":579,"children":580},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[581,582,585,606,619,639],{"title":399,"path":578,"stem":579},{"title":411,"path":583,"stem":584},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":586,"path":587,"stem":588,"children":589,"page":447},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[590,594,598,602],{"title":591,"path":592,"stem":593},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":595,"path":596,"stem":597},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":599,"path":600,"stem":601},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":603,"path":604,"stem":605},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":607,"path":608,"stem":609,"children":610,"page":447},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[611,615],{"title":612,"path":613,"stem":614},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":616,"path":617,"stem":618},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":620,"path":621,"stem":622,"children":623,"page":447},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[624,627,631,635],{"title":419,"path":625,"stem":626},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":628,"path":629,"stem":630},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":632,"path":633,"stem":634},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":636,"path":637,"stem":638},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":640,"path":641,"stem":642},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986308071]