Jimmy Black
Technical level designer
Cowboy Life Simulator · Odd Qubit · Unreal Engine 5
Byłem Game Directorem gry z otwartym światem o powierzchni około 2,25 km². Finalnie moje codzienne obowiązki pokrywały role level designera, level artu, designera, producenta, tech artu i programisty.I was Game Director on an open-world game of roughly 2.25 km². In the end my day-to-day work covered the roles of level designer, level artist, designer, producer, tech artist and programmer.
Target: low na GTX 1060. Udało się medium na tym sprzęcie.Target: low settings on a GTX 1060. We got to medium on that hardware.
Duża część mojego level designu polegała więc na tym, żeby mapa była jednocześnie ciekawa i możliwa do wyrenderowania.So a large part of my level design work came down to making the map interesting and renderable at the same time.
Projekt powstawał z udziałem mało doświadczonych developerów. Ważne było, aby dać im jak największe pole do popełniania błędów.The project was made with fairly inexperienced developers. It mattered to give them as much room as possible to make mistakes.
Projekt został odziedziczony po innym zespole. Budżet pozwalał nam na gruntowny rework większości mechanik. Z czterech zastanych leveli został jeden. Miałem świadomość tego, że jeden level designer i level art nie dadzą rady stworzyć dużego i pełnego świata. Ważną zasadą było utrzymanie małego świata, ale wypełnionego treścią.The project was inherited from another team. The budget allowed us a thorough rework of most of the mechanics. Of the four levels we inherited, one survived. I was aware that one level designer and one level artist would not manage to build a large, full world. An important rule was to keep the world small, but filled with content.
Wydawca nie dawał budżetu na produkcję assetów - kupowaliśmy je ze stocka. Przysporzyło to jednak sporo problemów z optymalizacją. Assety ze stocka były często nieoptymalne pod wieloma względami:The publisher gave us no budget to produce assets - we bought them from stock. That brought a fair amount of optimization trouble with it. Stock assets were often suboptimal in many respects:
Level został postawiony na bazie tego, który wybraliśmy jako nadający się do „przetrwania" po poprzednim teamie. Nie zostało z niego jednak zbyt dużo - głównie miasteczko, które w dużej mierze wyglądało OK.The level was built on the one we picked as fit to "survive" from the previous team. Not much of it was left, though - mainly the town, which for the most part looked OK.
Po gruntownym sprzątaniu levelu powstał blockout aktualnego świata. Ważne było dla mnie oddzielenie wizualne i dystansowe najbardziej gęstych obszarów gry (pod względem renderingu i użycia CPU).After a thorough cleanup of the level, the blockout of the current world was made. What mattered to me was separating the densest areas of the game - in terms of rendering and CPU use - both visually and by distance.
Gracz ma dostęp do większości levelu praktycznie od samego początku gry. Progresja (w kontekście mechanik levelu) odbywa się tu na innych poziomach. Na początku gry gracz nie musi wychodzić daleko od swojej farmy, dopiero questy i potrzeba nowych zasobów pchają go dalej. Niektóre zasoby unlockują się dopiero po uzyskaniu odpowiednich umiejętności lub narzędzi, co pozwala na to, aby jeszcze raz przemierzyć miejsca, w których gracz już był.The player has access to most of the level practically from the very start of the game. Progression, in terms of the level's mechanics, happens on other axes. Early on the player does not need to go far from their farm; it is quests and the need for new resources that push them further. Some resources only unlock once you have the right skills or tools, which lets the player walk through places they have already been again.
Świat jest mały, ale daje wrażenie otwartości. Udało się to uzyskać dzięki częstym otwartym widokom na duże przestrzenie. Wymagało to jednak kilku sztuczek - punkt obserwacyjny zawsze był oddzielony od gęstego obszaru jakiegoś rodzaju przesłoną (obniżenie terenu, las, krzaki, zawiły korytarz), która dawała czas na podmianę HLOD-ów na docelowe assety.The world is small, but it gives an impression of openness. We got there through frequent open views onto large spaces. That took a few tricks though - the vantage point was always separated from the dense area by some kind of screen (a dip in the terrain, a forest, bushes, a winding corridor) which bought the time to swap HLODs for the final assets.
Nawigacja była dla nas pewnym wyzwaniem. Minimapa była czymś, co wyrzuciliśmy jako zbędny koszt pracy oraz CPU. Udało się ją z powodzeniem zastąpić dobrym level designem.Navigation was something of a challenge for us. The minimap was one of the things we threw out, as an unnecessary cost in both work and CPU. We managed to replace it successfully with good level design.
Gracz porusza się zawsze pomiędzy obszarami, w których nie ma dużego problemu z określaniem kierunków (np. las po lewej, pomarańczowe góry po prawej). Umieszczaliśmy w świecie dużo unikalnych POI, które gracz mijał w trakcie podróży (mgliste bagnisko, wielki siusiak, kamienny posąg).The player always moves between areas where working out which way you are facing is not much of a problem (forest on the left, orange mountains on the right, say). We put a lot of unique POIs into the world for the player to pass on the way (a foggy swamp, a giant willy, a stone statue).
Gameplay oraz sam level iterowały wraz z kolejnymi playtestami, które urządzaliśmy co plus minus pół roku. Level głównie zmieniał się pod względem ułatwiania nawigacji graczowi. Testy pozwalały nam określić, gdzie gracze chodzą, co ich przyciąga, z czym mają problemy.The gameplay and the level itself iterated along with successive playtests, which we ran roughly every six months. The level mostly changed in the direction of making navigation easier for the player. The tests let us work out where players walk, what draws them in, and what they struggle with.
Projekt przenieśliśmy z UE 4.27 na 5.2, a potem jeszcze na kolejne wersje. Wpędziło to nas w różne pułapki. Największym wyzwaniem okazał się level streaming. Powodował duże freezy - nawet do 60 sekund. Kolejne iteracje profilowania i poprawek pozwoliły nam dotrzeć do kilku ciekawych zagadnień:We moved the project from UE 4.27 to 5.2, and then on to further versions. That walked us into a number of traps. The biggest challenge turned out to be level streaming. It caused large freezes - up to 60 seconds. Successive iterations of profiling and fixes got us to a few interesting findings:
Wiele assetów, które posiadaliśmy już w projekcie, używało constructu z założeniem, że wywołuje się on jedynie w edytorze. Większość z tych problemów udało się rozwiązać z użyciem Utility tooli oraz odpowiednich skryptów tworzenia buildów.Many of the assets we already had in the project used construct on the assumption that it only ever runs in the editor. Most of those problems we managed to solve with Utility tools and the right build scripts.
Tysiące instancji foliage w momencie stream-in wywoływały swój overlap. Finalnie prawie żaden foliage w grze nie posiada domyślnie jakiejkolwiek kolizji. Natomiast ten foliage, z którym gracz może mieć dodatkowe interakcje, podmieniany jest w runtime na odpowiednich aktorów, jeśli gracz jest w odpowiedniej odległości.Thousands of foliage instances fired their overlap at the moment of stream-in. In the end almost no foliage in the game has any collision by default. The foliage the player can additionally interact with is swapped at runtime for proper actors once the player is close enough.
Był czymś, z czym bardzo długo walczyłem i co długo testowałem. Overall nie był dużym kosztem na GPU, ale przeważył koszt pamięci.Something I fought with and tested for a very long time. Overall it was not a big cost on the GPU, but the memory cost outweighed that.
Z pierwotnego planu wypadła cała lokacja kopalni wraz z kilkoma mechanikami. Okazało się, że nie zdążymy obsłużyć tej lokacji od strony narracyjnej. W momencie cięcia nie były to jeszcze dopieszczone miejsca, bo liczyliśmy się z takimi sytuacjami - dlatego praca nad wyglądem levelu miała charakter iteracyjny (blockout → draft → pass 1 → pass 2 → …). Dzięki temu mała część pracy poszła do kosza.The whole mine location fell out of the original plan, along with several mechanics. It turned out we would not have time to cover that location narratively. At the point we cut it, these were not yet polished places, because we had been counting on situations like this - which is why work on the level's look was iterative (blockout → draft → pass 1 → pass 2 → …). Thanks to that, only a small part of the work went in the bin.
Różnorodność assetów. Gdy zbliżaliśmy się do granicy ograniczeń pamięci, zacząłem eliminować z projektu assety, które były dość ciężkie, a wnosiły stosunkowo niewiele do ogólnego wyglądu gry.Asset variety. As we got close to the memory limits, I started removing assets from the project that were fairly heavy while adding relatively little to the overall look of the game.
Puzzle środowiskowe. W grze było kilka puzzli środowiskowych. Okazało się jednak, że nasi faktyczni gracze nie lubią takich zagadek i mają z nimi duże problemy. Finalnie zostały tylko dwie pomniejsze zagadki, które są „z boku" gry.Environmental puzzles. The game had several environmental puzzles. It turned out, though, that our actual players do not like that kind of puzzle and struggle with them badly. In the end only two minor puzzles are left, and they sit off to the side of the game.
Sprawdzanie perfo odbywało się głównie z użyciem Insight oraz PIX, na min specu oraz na mojej maszynie roboczej.Performance checking was done mainly with Insights and PIX, on the min spec and on my own working machine.
RAM nie był naszym problemem - wiele assetów, dla przyspieszenia ich wskakiwania na level, było zawsze trzymanych w pamięci, szczególnie te największe obiekty.RAM was not our problem - many assets were kept in memory at all times to speed up how they pop into the level, especially the largest objects.
Dużym problemem była pojemność VRAM. Problem ten w dużej mierze powiązany był z faktem, że projekt przypominał nieco zombie posklejanego z assetów. Wiele tekstur było całkowicie zbędnych w projekcie, wiele miało niepoprawne ustawienia kompresji, samo używanie kanałów w teksturze też pozostawiało wiele do życzenia (np. tekstura maski opacity posiadała RGB).VRAM capacity was a big problem. That was largely tied to the fact that the project resembled a zombie stitched together out of assets. Many textures were entirely redundant in the project, many had incorrect compression settings, and the use of channels within a texture left a lot to be desired too (an opacity mask texture carrying RGB, for instance).
Bardzo długo problemem były draw calle. Udało się jednak dobrać odpowiednie zasięgi ładowania dla assetów oraz odpowiednie zasady ładowania obiektów. Drobne propsy były ładowane bliżej gracza. Budynki ładowały swoje wnętrza dopiero w okolicy gracza - wymagało to modyfikacji przezroczystości okien wraz z dystansem od kamery, aby uniknąć poppingu. Dodatkowo sprawie pomógł plugin automatyzujący instancjonowanie assetów.Draw calls were a problem for a very long time. We did manage to find the right loading ranges for assets and the right rules for loading objects. Small props loaded closer to the player. Buildings only loaded their interiors in the player's vicinity - which required modifying window transparency with distance from the camera to avoid popping. A plugin that automated asset instancing helped as well.
Główne problemy pochodziły od systemów pochodzących od programistów - dostawali odpowiednie dane pomagające im poprawiać problemy. Znając jednak obciążenie pracy programistów, często musiałem sam wchodzić i przerabiać logikę w różnych blueprintach. Poprawki zazwyczaj sprowadzały się do:The main problems came from systems built by the programmers - they were given the data they needed to fix them. Knowing how loaded the programmers were, though, I often had to go in myself and rework the logic in various blueprints. The fixes usually came down to:
Early Access wystartował w listopadzie 2025. W momencie przygotowania tego portfolio gra miała 89% pozytywnych recenzji z 1112 opinii.Early Access launched in November 2025. At the time this portfolio was put together the game had 89% positive reviews out of 1,112.
W ostatnim roku pracy nad CLS dość intensywnie używałem AI. Głównie sprawdzał się jako twórca narzędzi oraz jako narzędzie do weryfikacji baz danych i wyszukiwania w nich anomalii.In the last year of work on CLS I used AI fairly intensively. It proved most useful as a builder of tools, and as a way to audit databases and search them for anomalies.
Stworzył mi na przykład narzędzie wyszukujące tekstury, które były używane w minimalnym stopniu, oraz narzędzie wyszukujące referencje do assetów linkowanych w martwym kodzie.For example, it built me a tool that finds textures that were barely used, and a tool that finds references to assets linked from dead code.
Za późno zaakceptowałem założenie, że będziemy budować świat głównie z kupionych assetów. Na początku wyglądało to jak oszczędność. Później dużo mojego czasu poszło na poprawianie rzeczy, które przy własnym pipelinie powstałyby od razu pod nasze wymagania.I accepted the assumption that we would build the world mainly out of purchased assets too late. At the start it looked like a saving. Later, a lot of my time went into fixing things that, with our own pipeline, would have been made to our requirements in the first place.
Brak budżetu na assety nie usuwa kosztu. Najczęściej tylko przerzuca go na później i na inną osobę.No budget for assets does not remove the cost. Most often it just shifts it to later, and onto someone else.
Od początku ustaliłbym prostą checklistę dla kupionych assetów: maksymalne rozmiary tekstur, wymagane LOD-y, kolizje, materiały oraz to, co Blueprint może robić na Ticku i w construction script.From the start I would have set a simple checklist for purchased assets: maximum texture sizes, required LODs, collision, materials, and what a Blueprint is allowed to do on Tick and in the construction script.
Finalnie i tak musieliśmy te zasady wprowadzić, tylko robiliśmy to wstecznie, asset po assecie. To była niepotrzebna robota, której dało się uniknąć.In the end we had to introduce those rules anyway, we just did it retroactively, asset by asset. That was unnecessary work, and it was avoidable.
Między innymi z takich rzeczy powstał później mój wykład o technicznej stronie level designu.Things like that are part of where my talk on the technical side of level design came from later on.