From b1b3cd9106c7b661b77ea847bf2c025b3be68dca Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Sat, 22 Mar 2025 08:24:16 +0100 Subject: [PATCH 1/6] ch1 1st half --- ch1.tex | 97 ++++++++++++++++++++++++------------------------- img/pacing.pdf | Bin 0 -> 17662 bytes 2 files changed, 48 insertions(+), 49 deletions(-) create mode 100644 img/pacing.pdf diff --git a/ch1.tex b/ch1.tex index ad472b2..22ccfc0 100644 --- a/ch1.tex +++ b/ch1.tex @@ -1,67 +1,66 @@ -\chapter{Important first chapter} +\chapter{Co obnáší vývoj hry?} \label{chap:refs} -First chapter usually builds the theoretical background necessary for readers to understand the rest of the thesis. You should summarize and reference a lot of existing literature and research. +Vývoj her je zrovna jeden z oborů, kde každý si mylně představuje něco svého. Každý ví jak hry mají vypadat, každý ví co musí a nesmí obsahovat, kdo a jak je má dělat, kolik stát... Pravda ale je, že průměrného hráče zajíma pouze to, aby ho ta hra bavila. Jemu nezáleží za jakých podmínek pracovali vývojaři, nebo že ve hře se zabíjejí jednorožčí mláďata. Hráč a přesnějí uživatel nášeho produktu chce dostat nějaký minimum \emph{zábavy} za ním zaplacený čas a peníze. Právě protože zábava je tak subjektivní, každý má subjektivní představu her. -You should use the standard \emph{citations}\todo{Use \textbackslash{}emph command like this, to highlight the first occurrence of an important word or term. Reader will notice it, and hopefully remember the importance.}. +\section{Co udělat jako první?} +Pro nikoho snad není překvapivé, že pro vzník díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohůžel hry už z většinou odvětví nesdilí aspekt, při kterém funkčnost myšlenky lze ověřit již na začatku produkce. A je to ještě horši, protože to můžeme většinou zjistít jen až u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečist v knize ,,Blood, Sweat, and Pixels'' od Schreiera Jasona\footnote{Schreier, Jason. Blood, Sweat, and Pixels. HyperCollins US 2017. ISBN 97-800-6265-1235} o hře Uncharted. -\begin{description} -\item[Obtaining bibTeX citation] Go to Google Scholar\footnote{\url{https://scholar.google.com}}\todo{This footnote is an acceptable way to `cite' webpages or URLs. Documents without proper titles, authors and publishers generally do not form citations. For this reason, avoid citations of wikipedia pages.}, find the relevant literature, click the tiny double-quote button below the link, and copy the bibTeX entry. -\item[Saving the citation] Insert the bibTeX entry to the file \texttt{refs.bib}. On the first line of the entry you should see the short reference name --- from Scholar, it usually looks like \texttt{author2015title} --- you will use that to refer to the citation. -\item[Using the citation] Use the \verb|\cite| command to typeset the citation number correctly in the text; a long citation description will be automatically added to the bibliography at the end of the thesis. Always use a non-breakable space before the citing parenthesis to avoid unacceptable line breaks: -\begin{Verbatim} -Trees utilize gravity to invade ye -noble sires~\cite{newton1666apple}. -\end{Verbatim} -\item[Why should I bother with citations at all?] For two main reasons: -\begin{itemize} -\item You do not have to explain everything in the thesis; instead you send the reader to refer to details in some other literature. Use citations to simplify the detailed explanations. -\item If you describe something that already exists without using a citation, the reviewer may think that you \emph{claim} to have invented it. Expectably, they will demand academic correctness, and, from your perspective, being accused of plagiarism is not a good starting point for a successful defense. Use citations to identify the people who invented the ideas that you build upon. -\end{itemize} -\item[How many citations should I use?] -Cite any non-trivial building block or assumption that you use, if it is published in the literature. You do not have to cite trivia, such as the basic definitions taught in the introductory courses. +\subsection{Design dokument} Nedílnou součastí vývoje hry je iterace nápadů a celkový popis prostředí a způsobů produkce. To vše v sobě zahrnuje Design dokument. Ten může mít docela různou podobu, jelikož jeho hlavním cílem je uchovat potřebné nápady na rychlém a přehledném místě. Souhrn těchto nápadů, jejích propracovanost a to jak dobře fungují spolu, potom tvoří celou hru i výslednou zábavu. Proto dobré písemné zpracování pomůže předat myšlenky designera a jejích aktuální verzi celému týmu vývojařů. -The rule of thumb is that you should read, understand and briefly review at least around 4 scientific papers. A thesis that contains less than 3 sound citations will spark doubt in reviewers. -\end{description} +V dizajn dokumentu hry, která je nedílnou součástí této práce, jsou popsany nápady dost kratce až abstraktně. To bylo způsobeno tím, že nad hrou pracoval pouze jeden člověk. V reálném týmu by takový dokument byl úkazkovým příkladem těch špatných, i přesto že obsahuje všechny potřebné náležitostí. -There are several main commands for inserting citations, used as follows: -\begin{itemize} -\item \citet{knuth1979tex} described a great system for typesetting theses. -\item We are typesetting this thesis with \LaTeX, which is based on \TeX{} and METAFONT~\cite{knuth1979tex}. -\item \TeX{} was expanded to \LaTeX{} by \citet{lamport1994latex}, hence the name. -\item Revered are the authors of these systems!~\cite{knuth1979tex,lamport1994latex} -\end{itemize} +\section{Téma, motivy, příběh, cíl} +Hra by měla poskytovat nějakou \emph{myšlenku} relativní pro hráče, aby ten si hru zahral. Počáteční myšlenku vždy vytváří a rozvíjí vývojař. Ta následovně může být zanecháná i na konci vývoje, nebo být co nejvíc změněná samotnou hrou, její mechanikami a kreativním provedením. Krásný případ je známa desková hra ,,Landlord's Game'' od Lizzie Magie později známa jako ,,Monopoly''. Paní Magiová chtěla vytvořit hru s myšlenkou představit hrůzy kapitalismu a monopolí, poskytnutím hráčům zkušenost, kde jeden jedinec neustale a nevyhnutelně bohatné zatím co zbytek stejně tak neustale a nevyhnutelně chudne. Bohužel hráči moc tuhle myšlenku nepochitili. Místo vyztrašení z kapitalismu, ti naopak rádi zažíval hazard a možnost ekonomicky zkrachovat soupeře. -\section{Some extra assorted hints before you start writing English} +Způsobů jak předat myšlenku hráči je nezpočetně mnoho. Pro účely této práce proto probereme poskytování myšlenky v příběhových hrach. Ty by měli mít v kostře nějaké hlavní téma, které se následovně obohacuje příběhy okolo. Je velmí důležité, aby okolní příběhy měli \emph{motivy}, aby následovně i hráč měl motiv je prožít. Dokonce hráč nemusí vědět motivy až ke konci hry, stačí aby byla cítit smysluplná návaznost a pocit možné odměny. Proto za umění je povážováno i velkolepé předstírání existence motivů, které donutí hráče \emph{stravit ve hře co největší množství času}. -\paragraph{Word order} -Strictly adhere to the English word order rules. The sentences follow a fixed structure with a subject followed by a verb and an object (in this order). Exceptions to this rule must be handled specially, and usually separated by commas. +Samotna tvorba příběhů je poněkud podobná tvorbě knižní nebo kinematografické. Jen je za potřebi oživovat a propojovat nejen postavy a svět, ale i herní mechaniky s ohledem na jejích zábavu, složitost a technická omezení. +\paragraph{Cíle a jejích distribuce} pomáhají udržet hráče. \Cref{fig:pacing} znázorňuje ukázkový príklad pěkné distribuce kličových momentů. Co přesně jsou klíčové momenty je na vývojáři. Mohou to být důležité momenty v příběhu, vylepšení postavy hráče, představení nové důležité mechaniky atd.. Důležite je nechát hráče v každem okamžiku procítit jeho úspěchy na začátku tohoto momentu nebo jeho konci. Je to dost abstraktní, ale přesto fungujicí způsob jak udržet pozornost hráče a poskytnout mu zábavu. +\begin{figure} +\centering +\includegraphics[width=.6\linewidth]{img/pacing.pdf} +\caption{Úkazkový graf představující distribuci klíčových momentů a cesty k ním.\protect\footnotemark} +\label{fig:pacing} +\end{figure} +\footnotetext{\url{https://www.gamedeveloper.com/design/gameplay-fundamentals-revisited-harnessed-pacing-intensity}} -\paragraph{Sentence structure} -Do not write long sentences. One sentence should contain exactly one fact. Multiple facts should be grouped in a paragraph to communicate one coherent idea. Both the sentences and paragraphs should include various hints about their relation to the other ideas and paragraps. These are typically materialized as adverbs or short sentence parts that clarify the cause--outcome and target--method--result relationship of the sentences in a paragraph. Such `word glue' helps the readers to correctly draw the lines that hold their mental images of your thesis together, and ideally see the big picture of what you were trying to convey right from the first read. +\section{Žánr, mechaniky, reference, platforma} +Důležité je také rozmyslet si vhodné umělecké a technické aspekty hry. Některé herní žánry musí hra obsahovat a některé budou překážet zážitku. Stejně je to i s mechanikami. Například nebude moc zábavné hrát hlavní mechaniku farmařství, pokud cílový žánr hry je horor. Správná volba žánru a mechanik je tedy klíčová pro vytvoření konzistentního a poutavého herního zážitku. -Paragraphs are grouped in labeled sections for a sole purpose of making the navigation in the thesis easier. Do not use the headings as `names for paragraphs' --- the text should make perfect sense even if all headings are removed. If a section of your text contains one paragraph per heading, you might have wanted to write an explicit list instead. +\paragraph{Žánr} hry určuje její základní atmosféru, pravidla a často i cílovou skupinu hráčů. Většinou se dnes setkáváme s hybridními žánry. Které dokážou poskytnout hráči více obsahu a tím pádem i možné zábavy. -Mind the rules for placing commas: -\begin{itemize} -\item Do not use the comma before subordinate clauses that begin with `that' (like this one). English does not use subordinate clauses as often as Slavic languages because the lack of a suitable word inflection method makes them hard to understand. In scientific English, try to avoid them as much as possible. Ask doubtfully whether each `which' and `when' is necessary --- most of these helper conjunctions can be removed by converting the clause to non-subordinate. +Při výběru žánru je důležité vzít v úvahu preferované herní mechaniky a jejích složitost. Například hra zaměřená na rychlou a dynamickou akci bude pravděpodobně obsahovat prvky střílečky nebo bojové hry, zatímco narativně založená hra může využívat prvky adventury či RPG. -As an usual example, \xxx{\textit{`The sentence, which I wrote, seemed ugly.'}} is perfectly bad; slightly improved by \xxx{\textit{`The sentence that I wrote seemed ugly.'}}, which can be easily reduced to \textit{`The sentence I wrote seemed ugly.'}. A final version with added storytelling value could say \textit{`I wrote a sentence but it seemed ugly.'} -\item Use the \emph{Oxford comma} before `and' and `or' at the end of a longer, comma-separated list of items. Certainly use it to disambiguate any possible mixtures of conjunctions: \textit{`The car is available in red, red and green, and green versions.'} Remember that English `or' is typically understood more like `either this or that, but not both,' and the use of `and` is much more appropriate in cases such as possibility overviews and example listings (like in this sentence). -\item Consider placing extra commas around any parts of the sentence that break the usual word order, especially if they are longer than a single word. -\end{itemize} +\paragraph{Herní mechaniky} jsou základní interaktivní prvky, které hráč využívá k postupu ve hře. Dobrý design mechanik zajistí, že hra bude plynulá, intuitivní a zábavná. -\paragraph{Nouns} -Every noun needs a determiner (`a', `the', `my', `some', \dots); the exceptions to this rule, such as non-adjectivized names and indeterminate plural, are relatively scarce. Without a determiner, a noun can be easily mistaken for something completely different, such as an adjective or a verb. +Při jejich návrhu je třeba zvážit: jak mechaniky podporují zvolený žánr, jak se budou vyvíjet v průběhu hry a jak se kombinují s ostatními prvky hry. Například v hororové hře bude dobře fungovat správa omezených zdrojů pro zvětšení napětí, zatímco ve strategické hře budou klíčové rozhodovací prvky a řízení ekonomiky. -Name all things with appropriate nouns to help both the reader and yourself, and do not hesitate to invent good names and labels for anything that you will refer to more than once. Proper naming will save you a lot of writing effort because you will not have to repeat descriptions such as \xxx{\textit{`the third output of the second benchmarked method of the improved set,'}} instead you may introduce a labeling that will allow you to say just something like \textit{`output M2\textsuperscript{+}-3'}. At the same time, this will reduce the risk that the reader will confuse the object with another one --- for illustration, the long version of the previous example might very easily confuse with the second output of the third method. The same also applies to methods descriptions, algorithms, programs, testing datasets, theorems, use-cases, challenges and other things. As an example, \xxx{\textit{`the algorithm that organizes the potatoes into appropriate buckets'}} shortens nicely as \textit{`the potato bucketer'} and may be labeled as a procedure \textsc{BucketPotatoes()}, and \xxx{\textit{`the issue where the robot crashes into a wall and takes significant time to return to the previous task'}} may be called just \textit{`the crash--recovery lag'}. +\paragraph{Platforma} ovlivňuje technické aspekty vývoje i celkový dosah hry mezi hráči. Každá platforma má své specifické a občas i náročné požadavky. Za to ale odmění hráče vhodnějším ovládáním nebo unikátním vizuálním zážitkem. -\paragraph{Verbs} -Although English can express a whopping 65 base verb tenses and their variants, scientific literature often suppresses this complexity and uses only several basic tenses where the meaning is clearly defined. Typically, you state facts in present simple (\textit{`Theorem 1 proves that Gadget B works as intended.'}), talk about previous work and experiments done in past simple (\textit{`We constructed Gadget B from Gizmo C, which was previously prepared by Tinkerer et al.'}), and identify achieved results in present perfect (\textit{`We have constructed Technology T.'}). Avoid using future tense, except for sections that explicitly describe future work --- as a typical mistake, if you state that the thesis \emph{will} describe something in later chapters, you imply that the description is not present there yet. +Při výběru platformy je nutné zvážit: technická omezení a očekávání hráčů na dané platformě. Například mobilní hry často využívají dotykové ovládání a krátké herní smyčky, zatímco hry pro PC a konzole mohou nabídnout komplexnější mechaniky a delší herní dobu. -Do not write sentences in passive voice, unless you explicitly need to highlight that something has passively subjected itself to an action. Active voice is more preferable in the theses because it clearly highlights the actors and their contributions --- typically, \textit{`you did it'} instead of \textit{`it was done'} by a mysterious entity, which the reviewers rarely envision as yourself. Writing in active voice additionally benefits the explanation of complex processes: There, the word order forces you to identify the acting subject as the first word in the sentence, which further disambiguates how the individual process parts are triggered and ordered. +\paragraph{Kopírování} cizích a vlastních nápadů je nedílnou součástí úspěšného vývoje. Hodně se vyplatí mít přehled ve vybraném žánru a mechanikách. Není nic špatného učit se na chybách a úspěších jiných her. Důležité ale je si pamatovat, že neexistuje deterministický vzorec, jak vytvořit dokonalou kombinaci příběhů, žánrů a mechanik tak, aby hra vyhrála všechny ceny. -Try to avoid overusing gerunds (verbs that end with `-ing'). It is convenient to write shorter sentences by using gerunds as adjectives, but these are typically quite hard to understand because the readers may easily confuse the intended adjectives with verbs. If your sentence contains two gerunds close to each other, it may need a rewrite. +\paragraph{Minihry} jsou skvělou metodou, jak rozptýlit hráče od monotonie herního cyklu. Přitom je lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k relaxaci mezi náročnějšími segmenty hry. Důležité je, aby jejich design byl v souladu s celkovým stylem hry a nepůsobil rušivě. Například rytmická minihra ve fantasy RPG může být zajímavým doplňkem, ale v realistické hororové hře by působila nepatřičně. -\paragraph{Scientific writing resources} -Consult the book by \citet{glasman2010science} for more useful details and recommended terminology for writing about the scientific research. Very pragmatically, the book by \citet{sparling1989english} describes many common mistakes that Czech and Slovak (and generally Slavic) writers make when writing English. +\section{Engine} +\subsection{Programovácí jazyk} + +\subsection{Grafika} +\subsection{Renderer} +\subsection{Materiály} +\subsection{Osvětlení} +\subsection{Postprocessing} +\subsection{3D modely} +\subsection{2D modely} +\subsection{Animace} (shader a skeleton) +\subsection{Instancování/Foliáž} + +\subsection{Zvuk} +\subsection{Hudba} + +\subsection{Načítání obsahu} +\subsection{Umělá intelegence} + +\section{Umělá intelegence pro tvorbu obsahu} diff --git a/img/pacing.pdf b/img/pacing.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cc01d8b4423070b1501f87e3edf00fc909544719 GIT binary patch literal 17662 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 literal 0 HcmV?d00001 -- 2.45.2 From e2a0e302789ef49c93f8f4cb776b7524678b1e32 Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Sat, 22 Mar 2025 22:28:18 +0100 Subject: [PATCH 2/6] almost --- ch1.tex | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++------ refs.bib | 7 ++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/ch1.tex b/ch1.tex index 22ccfc0..678c74e 100644 --- a/ch1.tex +++ b/ch1.tex @@ -45,22 +45,80 @@ Při výběru platformy je nutné zvážit: technická omezení a očekávání \paragraph{Minihry} jsou skvělou metodou, jak rozptýlit hráče od monotonie herního cyklu. Přitom je lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k relaxaci mezi náročnějšími segmenty hry. Důležité je, aby jejich design byl v souladu s celkovým stylem hry a nepůsobil rušivě. Například rytmická minihra ve fantasy RPG může být zajímavým doplňkem, ale v realistické hororové hře by působila nepatřičně. \section{Engine} +Když už je rozhodnuto jak bude vypadat hra, je zapotřebí vybrat vhodné prostředí pro její tvorbu. Vývojář může vytvořit vlastní engine, ale dnes to většinou přináši pouze zbytečné komplikace. Proto se na trhu často objevují hotová řešení, která pokrývají většinu potřeb. + +Tato práce je zamyšlená jako 3D příběhová hra s více žánry a s možností dynamického načítaní nového obsahu za běhu. A pro tyto účely se nabizí 4 hlavní enginy na trhu. + +\paragraph{Unity}\footnote{https://unity.com/} je nejspíš stale nejpopularnější volbou v roce vzníku této práce. Lze na něm vytvořit hru libovolného žánru a rozsahu. Má rozhodně největší komunitu a rozsahle návody, jednodušší programovací jazyk C# a scriptování herních objektů. Zároveň již obsahuje zmíněnou v požadavku možnost načítaní obsahu. + +Má ale své problémy, které ohleduplný vývojař procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje napsaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C#. Navíc grafika často vyžaduje napsaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginu. Následovně i samotný C# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst v ~\citet{unityComparing}. + +V roce 2019 kdy hra přiložena k této práci vzníkala, byl také problém s paralelizací hlavního cyklu samotného enginu a rendrovacích úloh. V celku Unity tehdy ještě nebyl tak robustní a nenabízel tolik vývojařských možností/oprav. V den vydání této práce, je rozhodně nejlepší volbou nejen pro jednotlivce a malé týmy. + +\paragraph{Godot}\footnote{https://godotengine.org/} je velmi dikutovaná novinka, která se celkem dobře rozšiřuje. Hlavní výhoda je jeho drobnost a že je úplně zdarma za všch okolností. Má podobné problemy jako Unity a někdy ještě horší. Je ale vskutku ohromujicí, co vše může nabídnout. Ikdyž většinu nabízených technologií vývojař potřebuje přepsat vlastní rukou, jelikož často nefungují jak je zapotřebí. V dobu vzniku hry přiložené k práci, Godot byl ještě přiliš nový a nevypadal nijak perspektivně. V den vydání této práce, je solidní konkurent v některých herních žánrech. + +\paragraph{Unreal Engine}\footnote{https://www.unrealengine.com/} verze 4 byl kdysi zvolen enginem pro hru, z které potom vznikla tato práce. Jeho primární výhodou oproti konkurenci jsou vysoce standartizované postupy neboli anglicky ,,pipliny'', které zlevňují nebo vůbec umožňují tvorby her ve velkých týmech. Celý engine se navíc vychlubuje velkými ,,úspěchy'' v různých technologiích, zejména rendrovacích -- což probereme v další sekci -- a taky odvětvích jako motion design, kinematografie, design architektury a další. + +Vskutku ohromující když se snažite vybrat budoucí stavební kámen pro váši hru. Je ale potřeba brát v úvahu silnou nepřivětivost enginu k nováčkum, pokud ti chtěji udělat neco vlastního mimo již existujicí návody. Stejné lze říct o oficiální dokumentaci, která je často a velmi nedostačujicí -- jestli vůbec existuje. Navíc při snaze udělat něco kompletního pomocí nabízených pokročilých technologií, v závěru vývojař musí dané technologie ovladnout na velmi vysoké úrovně a často i modifikovat zdrojový kód. V některých případech technologie jako nanite nebo lumen nejde použit pro dokonalé a odladěné výsledky, proto se prostě zahazují. + +Jestli zapomenout na chybějicí dokumentaci, je Unreal Engine stejný engine jako ostatní. Některé technologie má nesrovnatelně lepší a nekteré horší. Lze najít návody a neoficiální dokumentaci diky velké komunitě. Dokonce samotný engine si dovoluje sebe modifikovat, protože lze dostat přístup ke zdrojácím. Což velké týmy tuto nezávislost s radostí využívají. + +\paragraph{CryEngine}\footnote{https://www.cryengine.com/} je hodně podobný Unreal Enginu za výjimkou toho, že se specialuzuje jen na vývoj her. Taky již není tolik univerzalní, dokumentace je ještě míň, komunita je mizerně malá a přivětivost je snad nejhorší možná. Je to dost úzce specializovaný engine, který potřebuje silné odborníky k jeho ovládání. + \subsection{Programovácí jazyk} +Unreal Engine umožňuje programovat pomoci vizuálních bloku tzv. Blueprintů nebo textově v jazyce C++. I při použití pouze jedné z variant lze vivinout celou hru. Veškerý potenciál se ale projevuje při jejích kombinaci. V C++ se skvěle programují komplexní a nizkoúrovňové prvky, když to Blueprinty jsou skvěly pro skriptování úrovní a objektů pomocí high-level bloků. Samozřejmě samotné vizuální bloky lze v C++ vlastnoručně vytvořit. + +Je to vše zároveň velmí obsáhlý aspekt Unreal Engine. Začatečníkovi bude celkem dlouho trvat než začné sám něco vymýšlet. A na první pohled jednoduchý vizuální programování je ve skutečností velmi komplexní už samotnou teměř nekonečnou nabídkou funkcí. \subsection{Grafika} -\subsection{Renderer} -\subsection{Materiály} -\subsection{Osvětlení} -\subsection{Postprocessing} -\subsection{3D modely} -\subsection{2D modely} -\subsection{Animace} (shader a skeleton) -\subsection{Instancování/Foliáž} +Unreal Engine poskytuje širokou nabídku technologií a nástrojů pro tvorbu grafiky nebo začlenění do hry obsahu vytvořeného v jiném softwaru. Je ale potřeba dát si záležet na veškerých nastaveních enginu. Těch nastavení je velké množství a rozhodně se budou iterovat behěm celého vývoje hry. Základní nastavení totiž jsou příliš univerzalní a nekompletní. Přestože i v základu hra snimi vypadá na dostatečné úrovní, při hraní bude stalý pocit nedokončenosti produktu nebo kopirování cizího díla. Většina vývojařu totiž si nedají zaležet, jak jejich hra vypadá kvůli lenosti nebo technické náročnosti tohoto kroku. Proto se většina her cití jak si podobný a nepřijemný pro hráče. + +\subsubsection{Materiály} +Materiál je odborné označení souboru dat a funkcí, které reprezentují výsledný vzhled objektu/efektu/světla/postprocessu. Je to de-facto vysokourovňový shader, který i přestože je dost omezený dokaže generovat skvělý a kreativní výstup. Případně lze zdrojový kód materiálů rozšířit na potřebné funkcionality a v případě nouze napsat i vlastní render pipelinu, jak to dělají velký studia nebo nezavislé github projekty. + +\paragraph{HLSL shadery} lze v Unreal Engine napsat a aplikovat. Je to ale hodně nezdokumentovaný aspekt a zahrnuje spoustu práce okolo, narozdil od toho jak to je v Unity před verzi 6. + +\subsubsection{Osvětlení} +Unreal Engine vyníká právě bohatým výběrem možsností provedení osvětlení. Lze zde najít ruzné druhy přimých a nepřimích zdrojů světel a mlhy, technik odrazů a stínů. Všechno lze velmi podrobně nastavit buď pro účely výkonu nebo grafické estetiky. + +\paragraph{Lumen}\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-global-illumination-and-reflections-in-unreal-engine} je zdánlivě revoluce v realtime herním osvětlení. Je to speciální režim osvětlení a odrazů, který umožňuje za běhu počítat dynamické osvětlení bez potřeby vytváření lightmap nebo dotěrného nastavení ploch odrazů. Vytváří velice kvalitní osvětlení za opravdu malo úsili. Nevýhodu, kterou ale již neprezentují, není tolik trochu větší zátěž na hardware, ale šum vyrendrovaného osvětlení a odrazů. Lumen totíž v reálném čase generuje buffer s odrazy a osvětlení ve velice malém rozlišení a to navíc vynacháva nahodně zhruba polovina pixelů. Potom výsledný buffer se rescaluje na potřebné rozlišení a aplikuje. Celé se to spoléha na zhlazovací metodu TAA, která akumuluje výsledky předchozích snímku a interpoluje jich do aktuálního, což šum zdanlivě dobře potlačuje ikdyž ne kompletně. Ve výsledku tak potom TAA vytváří ghosting effekt nejen na hranach objektů ale i osvetlení s odrazy, což dost bije do oka v dynamických scénach. + +\subsubsection{3D} +Unreal Engine podporuje import 3D modelů z různých formátů. Navíc k tomu poskytuje dostatečné množstí optimalizačních technik jako např.: +\paragraph{Render occlusion culling} vykresluje objekty pouze pokud se nacházi v zorném poli kamery, nebo +\paragraph{Level Of Details(LOD)} vykreslující různě detalizované verze objektu v závislosti na jeho vzdalenosti od hráče, protože proč vykreslovat detaily, které z dálky nejsou vidět. +\paragraph{Nanite}\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/nanite-virtualized-geometry-in-unreal-engine} je ještě jedná specialita Unreal Engine 5, která umožňuje vykreslování a instancování objektů s miliony až miliardy trojúhelniků v reálnem čase. Umožňuje tak použití v enginu super detalizovaných objektů, získaných pomoci skenování objektů v realitě. Technika je založená na předčasné clustarizaci a následně dynamickém streamování pouze viditelných trojúhelníků. Bohužel neumožnujě kompletního vynechání LOD systému, jak to reklamuje tvůrce enginu. Nanite sice může ušetřit spoustu času modeláři, ale reálný zisk ve výkonu je pouze ve velmi náročných scénach obsahující statické objekty. Proto LOD stale zustáva nejefektivnější technikou zlevnění vykreslovacího času objektu. +\paragraph{Instancování/Foliáž} umožňuje zmenšení paměti potřebnou pro reprezentaci skupiny stejných objektů a výsledně i zlevnění rendrovacího času. Je postavená na jednoduché myšlence, že instance objektů drží v paměti pouze transformaci a zbytek dat je referencován z jedíneho pravého objektu. Často se táto technika používa pro naplnění světa různými drobnými objekty (instancování) nebo tvorbu vegetace (foliáž). + +\subsubsection{Animace} +Unreal Engine pokrýva veškeré potřeby pro animaci libovolného druhu. Jen neposkytuje žádne high-level ovladaní přehrávání a proto užitelský ovládání a triky je potřeba dodělat manuálně. +\paragraph{Skeleton} animace je založená doslova na animování kostry přivázané k 3D modelu. Skupiny trojúhelníků jsou namapovany na úrčité kosti, tak že při pohybu kosti je stejným směrem interpolovaná pozice trojúhelníků. Daný druh 3D animace může vytvářet velkou zátěž na procesor zejména při velkém počtu instancí, jelikož ten musí propočitávat pohyb každé kostí vůči hernímu světu a až potom odesílat rendrovací požadavek na grafiku. Přesto daná technika tvoří převažnou čast všech animací ve hře. +\paragraph{Shader} animace je exotická technika s myšlenkou přeskočit krok s výpočtem na procesoru. Animace se zakóduje do textury a následovně je aplikováná ve vertex shaderu jako offset vrcholů. Výsledně lze například velmi levně animovat velké hejno ptáků, který nemusí mít kolizi ve světě. + +\subsubsection{Renderer} +V Unreal Enginu lze vybrat mezi Forward a Deffered renderem. Jsou to systémy které se starájí o zpracování grafiky a vykreslování scény. Zajišťují převod 3D objektů a jejich vlastností na obraz, který se zobrazí na monitoru. Renderer pracuje s osvětlením, stíny, materiály a postprocessingovými efekty pro dosažení realistické nebo stylizované grafiky. + +\paragraph{Forward Renderer} Forward rendering je metoda renderingu, kde se každý objekt renderuje jednotlivě se všemi aplikovanými světelnými efekty. Je vhodný pro scény s malým množstvím světel a vyžaduje menší paměťovou náročnost. Používá se často v mobilních a VR aplikacích, kde je důležitá efektivita výkonu. + +\paragraph{Deferred Renderer} Deferred rendering odkládá aplikaci světelných efektů a v první fázi ukládá informace o geometrii scény do bufferu (G-buffer). Světla se aplikují až v druhé fázi, což umožňuje efektivnější práci s větším množstvím dynamických světených zdrojů. Tato metoda se používá především v moderních AAA hrách, kde je vyžadována vysoká vizuální kvalita. Je to výchozí renderer v Unreal Engine, který navíc umožňuje použití technologií Nanite a Lumen. +Nevýhodou je nemožnost použití kvalitních zhlazovácích metod jako MSAA. MSAA funguje tak, že ukládá více vzorků na pixel během rasterizace, což dobře funguje u forward renderingu, kde se barva a hloubka určují okamžitě. V deferred renderingu se však barvy a osvětlení aplikují až v pozdější fázi, kdy se světelné výpočty provádějí na pixelech na základě uložených dat v G-bufferu. Problém je, že MSAA by muselo být aplikováno na všechny jednotlivé buffery (normály, hloubku, albedo atd.), což je extrémně výpočetně náročné a neefektivní. Proto se místo MSAA často používají jiné metody zhlazování, jako FXAA nebo TAA. Poslední ale vytváří rozmazávaní hran objektů v dinamických scénach. + +\subsubsection{Postprocessing} +Postprocessing je technika dodatečného zpracování vyrendrovaného obrazu. Většínou se jedná o manipulaci barev, ale lze tady dělat i spoustu dizajnovych a technickych triků. Např. různé glitch efekty, screen space světelné efekty, efekty tepleného/nočního vidění atd.. + +\subsubsection{2D} + \subsection{Zvuk} + + \subsection{Hudba} + \subsection{Načítání obsahu} + + \subsection{Umělá intelegence} + \section{Umělá intelegence pro tvorbu obsahu} diff --git a/refs.bib b/refs.bib index 7400589..e79d08b 100644 --- a/refs.bib +++ b/refs.bib @@ -1,3 +1,10 @@ +@misc{unityComparing, + title = {Objectively comparing Unity and Unreal Engine}, + author = {Sirawat Pitaksarit}, + year = 2019, + note = {\url{https://gametorrahod.com/objectively-comparing-unity-and-unreal-engine/} [Accessed: (03.2025)]} +} + @book{knuth1979tex, title={TEX and METAFONT: New directions in typesetting}, author={Knuth, Donald Ervin}, -- 2.45.2 From 801ff95f2db2f71e72cd1b4c1cf6436dcbd1c9d9 Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Mon, 24 Mar 2025 00:35:10 +0100 Subject: [PATCH 3/6] end wip --- ch1.tex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ch1.tex b/ch1.tex index 678c74e..0187374 100644 --- a/ch1.tex +++ b/ch1.tex @@ -107,7 +107,9 @@ Nevýhodou je nemožnost použití kvalitních zhlazovácích metod jako MSAA. M Postprocessing je technika dodatečného zpracování vyrendrovaného obrazu. Většínou se jedná o manipulaci barev, ale lze tady dělat i spoustu dizajnovych a technickych triků. Např. různé glitch efekty, screen space světelné efekty, efekty tepleného/nočního vidění atd.. \subsubsection{2D} - +V Unreal Engine je více způsobů práce s 2D grafikou. +\paragraph{UI} lze programovat v C++ pomoci Slate třídy nebo přímo pomoci Blueprintů v editoru. Programování se Slate je hodně nizkoúrovňový nýbř stejný jako slepé programování okenní windows aplikace pomocí windows.h knihovny. Mnohem pohodlnější je práce v editoru, kde rovnou lze vidět vizuální výsledek. +\paragraph{Pro 3D} bylo možné vždy vytvořit klasickou plochu s texturou/materiálem nebo rendrovat text do 3D světa. \subsection{Zvuk} -- 2.45.2 From 99ac8cfab1cec942e891709b7bc1063c100aa5b0 Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Sat, 29 Mar 2025 09:02:20 +0100 Subject: [PATCH 4/6] almost 2 --- ch1.tex | 130 +++++++++++++++++++++++++------------------ img/musicLinking.pdf | Bin 0 -> 67814 bytes 2 files changed, 77 insertions(+), 53 deletions(-) create mode 100644 img/musicLinking.pdf diff --git a/ch1.tex b/ch1.tex index 0187374..59d31b7 100644 --- a/ch1.tex +++ b/ch1.tex @@ -1,121 +1,145 @@ -\chapter{Co obnáší vývoj hry?} +\chapter{Zásady tvorby} \label{chap:refs} -Vývoj her je zrovna jeden z oborů, kde každý si mylně představuje něco svého. Každý ví jak hry mají vypadat, každý ví co musí a nesmí obsahovat, kdo a jak je má dělat, kolik stát... Pravda ale je, že průměrného hráče zajíma pouze to, aby ho ta hra bavila. Jemu nezáleží za jakých podmínek pracovali vývojaři, nebo že ve hře se zabíjejí jednorožčí mláďata. Hráč a přesnějí uživatel nášeho produktu chce dostat nějaký minimum \emph{zábavy} za ním zaplacený čas a peníze. Právě protože zábava je tak subjektivní, každý má subjektivní představu her. +Vývoj her je obor, který je často mylně interpretován širokou veřejností. Existuje všeobecná představa o tom, jak by hry měly vypadat, jaké prvky musí či nesmí obsahovat, kdo a jak je má vyvíjet a jaká by měla být jejich cenová politika. Ve skutečnosti však průměrného uživatele zajímá především míra \emph{zábavy} a herní zážitek, který za investovaný čas a finanční prostředky získá. -\section{Co udělat jako první?} -Pro nikoho snad není překvapivé, že pro vzník díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohůžel hry už z většinou odvětví nesdilí aspekt, při kterém funkčnost myšlenky lze ověřit již na začatku produkce. A je to ještě horši, protože to můžeme většinou zjistít jen až u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečist v knize ,,Blood, Sweat, and Pixels'' od Schreiera Jasona\footnote{Schreier, Jason. Blood, Sweat, and Pixels. HyperCollins US 2017. ISBN 97-800-6265-1235} o hře Uncharted. +Z pohledu hráče nejsou faktory jako pracovní podmínky vývojářů nebo kontroverzní herní mechaniky primárními rozhodovacími kritérii. Klíčovým aspektem je optimalizace uživatelského zážitku a zajištění dostatečné interaktivity, plynulosti a engagementu, které přímo ovlivňují retenci a herní ekonomiku. -\subsection{Design dokument} Nedílnou součastí vývoje hry je iterace nápadů a celkový popis prostředí a způsobů produkce. To vše v sobě zahrnuje Design dokument. Ten může mít docela různou podobu, jelikož jeho hlavním cílem je uchovat potřebné nápady na rychlém a přehledném místě. Souhrn těchto nápadů, jejích propracovanost a to jak dobře fungují spolu, potom tvoří celou hru i výslednou zábavu. Proto dobré písemné zpracování pomůže předat myšlenky designera a jejích aktuální verzi celému týmu vývojařů. +Jelikož je zábava vysoce subjektivním konceptem, neexistuje univerzální model hry, který by vyhovoval všem uživatelům. Herní design proto využívá analytických metod, jako jsou uživatelské testování, behaviorální analýza a iterativní vývoj, aby maximalizoval pozitivní odezvu v cílové skupině hráčů. -V dizajn dokumentu hry, která je nedílnou součástí této práce, jsou popsany nápady dost kratce až abstraktně. To bylo způsobeno tím, že nad hrou pracoval pouze jeden člověk. V reálném týmu by takový dokument byl úkazkovým příkladem těch špatných, i přesto že obsahuje všechny potřebné náležitostí. +\section{Průběh vývoje} +Pro nikoho snad není překvapivé, že pro vznik díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohužel hry už z většinou odvětví nesdílí aspekt, při kterém funkčnost myšlenky lze ověřit již na začátku produkce. A je to ještě horší, protože to můžeme většinou zjistit jen až u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečíst v knize ,,Blood, Sweat, and Pixels'' od Schreiera Jasona\footnote{Schreier, Jason. Blood, Sweat, and Pixels. HyperCollins US 2017. ISBN 97-800-6265-1235} o hře Uncharted 4. Celkově autor převypráví deset rozhovorů s vývojáři her různých žánrů a velikostí, které mohou začínající/ho vývojařku/e navest co je možné očekávat před, při a po vývoji. Hlavní myšlenkou ale je ukázat jak vývoj každý hry je unikátní příběh, který nemá pravidla. + +\subsection{Design dokument} Nedílnou součástí vývoje hry je iterace nápadů a celkový popis prostředí a způsobů produkce. To vše v sobě zahrnuje Design dokument. Ten může mít docela různou podobu, jelikož jeho hlavním cílem je uchovat potřebné nápady na rychlém a přehledném místě. Souhrn těchto nápadů, jejích propracovanost a to jak dobře fungují spolu, potom tvoří celou hru i výslednou zábavu. Proto dobré písemné zpracování pomůže předat myšlenky designéra a jejich aktuální verzi celému týmu vývojářů. + +V dizajn dokumentu hry, která je nedílnou součástí této práce, jsou popsany nápady dost kratce až abstraktně. To bylo způsobeno tím, že nad hrou pracoval pouze jeden člověk. V reálném týmu by takový dokument byl ukázkovým příkladem těch špatných, i přesto že obsahuje všechny potřebné náležitostí. \section{Téma, motivy, příběh, cíl} -Hra by měla poskytovat nějakou \emph{myšlenku} relativní pro hráče, aby ten si hru zahral. Počáteční myšlenku vždy vytváří a rozvíjí vývojař. Ta následovně může být zanecháná i na konci vývoje, nebo být co nejvíc změněná samotnou hrou, její mechanikami a kreativním provedením. Krásný případ je známa desková hra ,,Landlord's Game'' od Lizzie Magie později známa jako ,,Monopoly''. Paní Magiová chtěla vytvořit hru s myšlenkou představit hrůzy kapitalismu a monopolí, poskytnutím hráčům zkušenost, kde jeden jedinec neustale a nevyhnutelně bohatné zatím co zbytek stejně tak neustale a nevyhnutelně chudne. Bohužel hráči moc tuhle myšlenku nepochitili. Místo vyztrašení z kapitalismu, ti naopak rádi zažíval hazard a možnost ekonomicky zkrachovat soupeře. +Hra by měla poskytovat nějakou \emph{myšlenku} relativní pro hráče, aby ten si hru zahral. Počáteční myšlenku vždy vytváří a rozvíjí vývojář. Ta následovně může být ponechána i na konci vývoje, nebo být co nejvíc změněná samotnou hrou, její mechanikami a kreativním provedením. Krásný případ je známa desková hra ,,Landlord's Game'' od Lizzie Magie později známá jako ,,Monopoly''. Paní Magiová chtěla vytvořit hru s myšlenkou představit hrůzy kapitalismu a monopolí, poskytnutím hráčům zkušenost, kde jeden jedinec neustale a nevyhnutelně bohatne zatímco zbytek stejně tak neustale a nevyhnutelně chudne. Bohužel hráči moc tuhle myšlenku nepochitili. Místo vystrašení z kapitalismu, ti naopak rádi zažíval hazard a možnost ekonomicky zkrachovat soupeře. -Způsobů jak předat myšlenku hráči je nezpočetně mnoho. Pro účely této práce proto probereme poskytování myšlenky v příběhových hrach. Ty by měli mít v kostře nějaké hlavní téma, které se následovně obohacuje příběhy okolo. Je velmí důležité, aby okolní příběhy měli \emph{motivy}, aby následovně i hráč měl motiv je prožít. Dokonce hráč nemusí vědět motivy až ke konci hry, stačí aby byla cítit smysluplná návaznost a pocit možné odměny. Proto za umění je povážováno i velkolepé předstírání existence motivů, které donutí hráče \emph{stravit ve hře co největší množství času}. +Způsobů jak předat myšlenku hráči je nespočetně mnoho. Pro účely této práce proto probereme poskytování myšlenky v příběhových hrach. Ty by měli mít v kostře nějaké hlavní téma, které se následovně obohacuje příběhy okolo. Je velmi důležité, aby okolní příběhy měli \emph{motivy}, aby následovně i hráč měl motiv je prožít. Dokonce hráč nemusí vědět motivy až ke konci hry, stačí aby byla cítit smysluplná návaznost a pocit možné odměny. Proto za umění je považováno i velkolepé předstírání existence motivů, které donutí hráče \emph{stravit ve hře co největší množství času}. -Samotna tvorba příběhů je poněkud podobná tvorbě knižní nebo kinematografické. Jen je za potřebi oživovat a propojovat nejen postavy a svět, ale i herní mechaniky s ohledem na jejích zábavu, složitost a technická omezení. -\paragraph{Cíle a jejích distribuce} pomáhají udržet hráče. \Cref{fig:pacing} znázorňuje ukázkový príklad pěkné distribuce kličových momentů. Co přesně jsou klíčové momenty je na vývojáři. Mohou to být důležité momenty v příběhu, vylepšení postavy hráče, představení nové důležité mechaniky atd.. Důležite je nechát hráče v každem okamžiku procítit jeho úspěchy na začátku tohoto momentu nebo jeho konci. Je to dost abstraktní, ale přesto fungujicí způsob jak udržet pozornost hráče a poskytnout mu zábavu. +Samotná tvorba příběhů je poněkud podobná tvorbě knižní nebo kinematografické. Jen je zapotřebí oživovat a propojovat nejen postavy a svět, ale i herní mechaniky s ohledem na jejich zábavu, složitost a technická omezení. +\paragraph{Cíle a jejich distribuce}pomáhají udržet hráče. \Cref{fig:pacing} znázorňuje ukázkový příklad pěkné distribuce klíčových momentů. Co přesně jsou klíčové momenty je na vývojáři. Mohou to být důležité momenty v příběhu, vylepšení postavy hráče, představení nové důležité mechaniky atd.. Důležité je nechat hráče v každém okamžiku procítit jeho úspěchy na začátku tohoto momentu nebo jeho konci. Je to dost abstraktní, ale přesto fungující způsob jak udržet pozornost hráče a poskytnout mu zábavu. \begin{figure} \centering \includegraphics[width=.6\linewidth]{img/pacing.pdf} -\caption{Úkazkový graf představující distribuci klíčových momentů a cesty k ním.\protect\footnotemark} +\caption{Ukázkový graf představující distribuci klíčových momentů a cesty k ním.\protect\footnotemark} \label{fig:pacing} \end{figure} \footnotetext{\url{https://www.gamedeveloper.com/design/gameplay-fundamentals-revisited-harnessed-pacing-intensity}} \section{Žánr, mechaniky, reference, platforma} -Důležité je také rozmyslet si vhodné umělecké a technické aspekty hry. Některé herní žánry musí hra obsahovat a některé budou překážet zážitku. Stejně je to i s mechanikami. Například nebude moc zábavné hrát hlavní mechaniku farmařství, pokud cílový žánr hry je horor. Správná volba žánru a mechanik je tedy klíčová pro vytvoření konzistentního a poutavého herního zážitku. +Důležité je také rozmyslet si vhodné umělecké a technické aspekty hry. Některé herní žánry musí hra obsahovat a některé budou překážet zážitku. Stejně je to i s mechanikami. Například nebude moc zábavné hrát hlavní mechaniku farmářství, pokud cílový žánr hry je horor. Správná volba žánru a mechanik je tedy klíčová pro vytvoření konzistentního a poutavého herního zážitku. -\paragraph{Žánr} hry určuje její základní atmosféru, pravidla a často i cílovou skupinu hráčů. Většinou se dnes setkáváme s hybridními žánry. Které dokážou poskytnout hráči více obsahu a tím pádem i možné zábavy. +\paragraph{Žánr}hry určuje její základní atmosféru, pravidla a často i cílovou skupinu hráčů. Většinou se dnes setkáváme s hybridními žánry. Které dokážou poskytnout hráči více obsahu a tím pádem i možné zábavy. -Při výběru žánru je důležité vzít v úvahu preferované herní mechaniky a jejích složitost. Například hra zaměřená na rychlou a dynamickou akci bude pravděpodobně obsahovat prvky střílečky nebo bojové hry, zatímco narativně založená hra může využívat prvky adventury či RPG. +Při výběru žánru je důležité vzít v úvahu preferované herní mechaniky a jejich složitost. Například hra zaměřená na rychlou a dynamickou akci bude pravděpodobně obsahovat prvky střílečky nebo bojové hry, zatímco narativně založená hra může využívat prvky adventury či RPG. -\paragraph{Herní mechaniky} jsou základní interaktivní prvky, které hráč využívá k postupu ve hře. Dobrý design mechanik zajistí, že hra bude plynulá, intuitivní a zábavná. +\paragraph{Herní mechaniky}jsou základní interaktivní prvky, které hráč využívá k postupu ve hře. Dobrý design mechanik zajistí, že hra bude plynulá, intuitivní a zábavná. Při jejich návrhu je třeba zvážit: jak mechaniky podporují zvolený žánr, jak se budou vyvíjet v průběhu hry a jak se kombinují s ostatními prvky hry. Například v hororové hře bude dobře fungovat správa omezených zdrojů pro zvětšení napětí, zatímco ve strategické hře budou klíčové rozhodovací prvky a řízení ekonomiky. -\paragraph{Platforma} ovlivňuje technické aspekty vývoje i celkový dosah hry mezi hráči. Každá platforma má své specifické a občas i náročné požadavky. Za to ale odmění hráče vhodnějším ovládáním nebo unikátním vizuálním zážitkem. +\paragraph{Platforma}ovlivňuje technické aspekty vývoje i celkový dosah hry mezi hráči. Každá platforma má své specifické a občas i náročné požadavky. Za to ale odmění hráče vhodnějším ovládáním nebo unikátním vizuálním zážitkem. Při výběru platformy je nutné zvážit: technická omezení a očekávání hráčů na dané platformě. Například mobilní hry často využívají dotykové ovládání a krátké herní smyčky, zatímco hry pro PC a konzole mohou nabídnout komplexnější mechaniky a delší herní dobu. -\paragraph{Kopírování} cizích a vlastních nápadů je nedílnou součástí úspěšného vývoje. Hodně se vyplatí mít přehled ve vybraném žánru a mechanikách. Není nic špatného učit se na chybách a úspěších jiných her. Důležité ale je si pamatovat, že neexistuje deterministický vzorec, jak vytvořit dokonalou kombinaci příběhů, žánrů a mechanik tak, aby hra vyhrála všechny ceny. +\paragraph{Kopírování}cizích a vlastních nápadů je nedílnou součástí úspěšného vývoje. Hodně se vyplatí mít přehled ve vybraném žánru a mechanikách. Není nic špatného učit se na chybách a úspěších jiných her. Důležité ale je si pamatovat, že neexistuje deterministický vzorec, jak vytvořit dokonalou kombinaci příběhů, žánrů a mechanik tak, aby hra vyhrála všechny ceny. -\paragraph{Minihry} jsou skvělou metodou, jak rozptýlit hráče od monotonie herního cyklu. Přitom je lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k relaxaci mezi náročnějšími segmenty hry. Důležité je, aby jejich design byl v souladu s celkovým stylem hry a nepůsobil rušivě. Například rytmická minihra ve fantasy RPG může být zajímavým doplňkem, ale v realistické hororové hře by působila nepatřičně. +\paragraph{Minihry}jsou skvělou metodou, jak rozptýlit hráče od monotonie herního cyklu. Přitom je lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k relaxaci mezi náročnějšími segmenty hry. Důležité je, aby jejich design byl v souladu s celkovým stylem hry a nepůsobil rušivě. Například rytmická minihra ve fantasy RPG může být zajímavým doplňkem, ale v realistické hororové hře by působila nepatřičně. \section{Engine} -Když už je rozhodnuto jak bude vypadat hra, je zapotřebí vybrat vhodné prostředí pro její tvorbu. Vývojář může vytvořit vlastní engine, ale dnes to většinou přináši pouze zbytečné komplikace. Proto se na trhu často objevují hotová řešení, která pokrývají většinu potřeb. +Když už je rozhodnuto jak bude vypadat hra, je zapotřebí vybrat vhodné prostředí pro její tvorbu. Vývojář může vytvořit vlastní engine, ale dnes to většinou přináší pouze zbytečné komplikace. Proto se na trhu často objevují hotová řešení, která pokrývají většinu potřeb. -Tato práce je zamyšlená jako 3D příběhová hra s více žánry a s možností dynamického načítaní nového obsahu za běhu. A pro tyto účely se nabizí 4 hlavní enginy na trhu. +Tato práce je zamyšlená jako 3D příběhová hra s více žánry a s možností dynamického načítaní nového obsahu za běhu. A pro tyto účely se nabízí 4 hlavní enginy na trhu, ze kterých se v minulosti vybral Unreal Engine. Taky proto celá tato sekce s rozborem technologií enginů bude popisovat technologie dostupné právě v Unreal Engine. -\paragraph{Unity}\footnote{https://unity.com/} je nejspíš stale nejpopularnější volbou v roce vzníku této práce. Lze na něm vytvořit hru libovolného žánru a rozsahu. Má rozhodně největší komunitu a rozsahle návody, jednodušší programovací jazyk C# a scriptování herních objektů. Zároveň již obsahuje zmíněnou v požadavku možnost načítaní obsahu. +\paragraph{Unity\protect\footnote{https://unity.com/}}je nejspíš stale nejpopulárnější volbou v roce vzniku této práce. Lze na něm vytvořit hru libovolného žánru a rozsahu. Má rozhodně největší komunitu a rozsahle návody, jednodušší programovací jazyk C\# a skriptování herních objektů. Zároveň již obsahuje zmíněnou v požadavku možnost načtení obsahu. -Má ale své problémy, které ohleduplný vývojař procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje napsaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C#. Navíc grafika často vyžaduje napsaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginu. Následovně i samotný C# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst v ~\citet{unityComparing}. +Má ale své problémy, které ohleduplný vývojář procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje psaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C\#. Navíc grafika často vyžaduje psaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginu. Následovně i samotný C\# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst online ~\cite{unityComparing}. -V roce 2019 kdy hra přiložena k této práci vzníkala, byl také problém s paralelizací hlavního cyklu samotného enginu a rendrovacích úloh. V celku Unity tehdy ještě nebyl tak robustní a nenabízel tolik vývojařských možností/oprav. V den vydání této práce, je rozhodně nejlepší volbou nejen pro jednotlivce a malé týmy. +V roce 2019 kdy hra přiložena k této práci vzníkalá, byl také problém s paralelizací hlavního cyklu samotného enginu a rendrovacích úloh. V celku Unity tehdy ještě nebyl tak robustní a nenabízel tolik vývojářských možností/oprav. V den vydání této práce, je rozhodně nejlepší volbou nejen pro jednotlivce a malé týmy. -\paragraph{Godot}\footnote{https://godotengine.org/} je velmi dikutovaná novinka, která se celkem dobře rozšiřuje. Hlavní výhoda je jeho drobnost a že je úplně zdarma za všch okolností. Má podobné problemy jako Unity a někdy ještě horší. Je ale vskutku ohromujicí, co vše může nabídnout. Ikdyž většinu nabízených technologií vývojař potřebuje přepsat vlastní rukou, jelikož často nefungují jak je zapotřebí. V dobu vzniku hry přiložené k práci, Godot byl ještě přiliš nový a nevypadal nijak perspektivně. V den vydání této práce, je solidní konkurent v některých herních žánrech. +\paragraph{Godot\protect\footnote{https://godotengine.org/}}je velmi dikutovaná novinka, která se celkem dobře rozšiřuje. Hlavní výhoda je jeho drobnost a že je úplně zdarma za všech okolností. Má podobné problémy jako Unity a někdy ještě horší. Je ale vskutku ohromující, co vše může nabídnout. I když většinu nabízených technologií vývojář potřebuje přepsat vlastní rukou, jelikož často nefungují jak je zapotřebí. V dobu vzniku hry přiložené k práci, Godot byl ještě příliš nový a nevypadál nijak perspektivně. V den vydání této práce, je solidní konkurent v některých herních žánrech. -\paragraph{Unreal Engine}\footnote{https://www.unrealengine.com/} verze 4 byl kdysi zvolen enginem pro hru, z které potom vznikla tato práce. Jeho primární výhodou oproti konkurenci jsou vysoce standartizované postupy neboli anglicky ,,pipliny'', které zlevňují nebo vůbec umožňují tvorby her ve velkých týmech. Celý engine se navíc vychlubuje velkými ,,úspěchy'' v různých technologiích, zejména rendrovacích -- což probereme v další sekci -- a taky odvětvích jako motion design, kinematografie, design architektury a další. +\paragraph{Unreal Engine\protect\footnote{https://www.unrealengine.com/}}verze 4 byl kdysi zvolen enginem pro hru, z které potom vznikla tato práce. Jeho primární výhodou oproti konkurenci jsou vysoce standardizované postupy neboli pipelines, které zlevňují nebo vůbec umožňují tvorby her ve velkých týmech. Celý engine se navíc vychlubuje velkými ,,úspěchy'' v různých technologiích, zejména rendrovacích -- což probereme v další sekci -- a taky odvětvích jako motion design, kinematografie, design architektury a další. -Vskutku ohromující když se snažite vybrat budoucí stavební kámen pro váši hru. Je ale potřeba brát v úvahu silnou nepřivětivost enginu k nováčkum, pokud ti chtěji udělat neco vlastního mimo již existujicí návody. Stejné lze říct o oficiální dokumentaci, která je často a velmi nedostačujicí -- jestli vůbec existuje. Navíc při snaze udělat něco kompletního pomocí nabízených pokročilých technologií, v závěru vývojař musí dané technologie ovladnout na velmi vysoké úrovně a často i modifikovat zdrojový kód. V některých případech technologie jako nanite nebo lumen nejde použit pro dokonalé a odladěné výsledky, proto se prostě zahazují. +Vskutku ohromující když se snažíte vybrat budoucí stavební kámen pro vaši hru. Je ale potřeba brát v úvahu silnou přívětivost enginu k nováčkům, pokud ti chtějí udělat něco vlastního mimo již existující návody. Stejné lze říct o oficiální dokumentaci, která je často a velmi nedostačujicí -- jestli vůbec existuje. Navíc při snaze udělat něco kompletního pomocí nabízených pokročilých technologií, v závěru vývojář musí dané technologie ovládnout na velmi vysoké úrovně a často i modifikovat zdrojový kód. V některých případech technologie jako nanite nebo lumen nejde použit pro dokonalé a odladěné výsledky, proto se prostě zahazují. -Jestli zapomenout na chybějicí dokumentaci, je Unreal Engine stejný engine jako ostatní. Některé technologie má nesrovnatelně lepší a nekteré horší. Lze najít návody a neoficiální dokumentaci diky velké komunitě. Dokonce samotný engine si dovoluje sebe modifikovat, protože lze dostat přístup ke zdrojácím. Což velké týmy tuto nezávislost s radostí využívají. +Jestli zapomenout na chybějící dokumentaci, je Unreal Engine stejný engine jako ostatní. Některé technologie má nesrovnatelně lepší a některé horší. Lze najít návody a neoficiální dokumentaci diky velké komunitě. Dokonce samotný engine si dovoluje sebe modifikovat, protože lze dostat přístup ke zdrojovým souborům. Což velké týmy tuto nezávislost s radostí využívají. -\paragraph{CryEngine}\footnote{https://www.cryengine.com/} je hodně podobný Unreal Enginu za výjimkou toho, že se specialuzuje jen na vývoj her. Taky již není tolik univerzalní, dokumentace je ještě míň, komunita je mizerně malá a přivětivost je snad nejhorší možná. Je to dost úzce specializovaný engine, který potřebuje silné odborníky k jeho ovládání. +\paragraph{CryEngine\protect\footnote{https://www.cryengine.com/}}je hodně podobný Unreal Enginu za výjimkou toho, že se specialuzuje jen na vývoj her. Taky již není tolik univerzalní, dokumentace je ještě míň, komunita je mizerně malá a přívětivost je snad nejhorší možná. Je to dost úzce specializovaný engine, který potřebuje silné odborníky k jeho ovládání. \subsection{Programovácí jazyk} -Unreal Engine umožňuje programovat pomoci vizuálních bloku tzv. Blueprintů nebo textově v jazyce C++. I při použití pouze jedné z variant lze vivinout celou hru. Veškerý potenciál se ale projevuje při jejích kombinaci. V C++ se skvěle programují komplexní a nizkoúrovňové prvky, když to Blueprinty jsou skvěly pro skriptování úrovní a objektů pomocí high-level bloků. Samozřejmě samotné vizuální bloky lze v C++ vlastnoručně vytvořit. +Unreal Engine umožňuje programovat pomoci vizuálních bloku tzv. Blueprintů nebo textově v jazyce C++. I při použití pouze jedné z variant lze vivinout celou hru. Veškerý potenciál se ale projevuje při jejich kombinaci. V C++ se skvěle programují komplexní a nízkoúrovňové prvky, když to Blueprinty jsou skvělý pro skriptování úrovní a objektů pomocí high-level bloků. Samozřejmě samotné vizuální bloky lze v C++ vlastnoručně vytvořit. -Je to vše zároveň velmí obsáhlý aspekt Unreal Engine. Začatečníkovi bude celkem dlouho trvat než začné sám něco vymýšlet. A na první pohled jednoduchý vizuální programování je ve skutečností velmi komplexní už samotnou teměř nekonečnou nabídkou funkcí. +Je to vše zároveň velmi obsáhlý aspekt Unreal Engine. Začátečníkovi bude celkem dlouho trvat než začne sám něco vymýšlet. A na první pohled jednoduchý vizuální programování je ve skutečností velmi komplexní už samotnou téměř nekonečnou nabídkou funkcí. \subsection{Grafika} -Unreal Engine poskytuje širokou nabídku technologií a nástrojů pro tvorbu grafiky nebo začlenění do hry obsahu vytvořeného v jiném softwaru. Je ale potřeba dát si záležet na veškerých nastaveních enginu. Těch nastavení je velké množství a rozhodně se budou iterovat behěm celého vývoje hry. Základní nastavení totiž jsou příliš univerzalní a nekompletní. Přestože i v základu hra snimi vypadá na dostatečné úrovní, při hraní bude stalý pocit nedokončenosti produktu nebo kopirování cizího díla. Většina vývojařu totiž si nedají zaležet, jak jejich hra vypadá kvůli lenosti nebo technické náročnosti tohoto kroku. Proto se většina her cití jak si podobný a nepřijemný pro hráče. +V rukou máme taktéž širokou nabídku technologií a nástrojů pro tvorbu grafiky nebo začlenění do hry obsahu vytvořeného v jiném softwaru. Je ale potřeba dát si záležet na veškerých nastavení enginu. Těch nastavení je velké množství a rozhodně se budou iterovat během celého vývoje hry. Základní nastavení totiž jsou příliš univerzalní a nekompletní. Přestože i v základu hra snimi vypadá na dostatečné úrovní, při hraní bude stálý pocit nedokončenosti produktu nebo kopírování cizího díla. Většina vývojářů totiž si nedají zaležet, jak jejich hra vypadá kvůli lenosti nebo technické náročnosti tohoto kroku. Proto se většina her cítí jak si podobní a nepříjemný pro hráče. -\subsubsection{Materiály} -Materiál je odborné označení souboru dat a funkcí, které reprezentují výsledný vzhled objektu/efektu/světla/postprocessu. Je to de-facto vysokourovňový shader, který i přestože je dost omezený dokaže generovat skvělý a kreativní výstup. Případně lze zdrojový kód materiálů rozšířit na potřebné funkcionality a v případě nouze napsat i vlastní render pipelinu, jak to dělají velký studia nebo nezavislé github projekty. +\subsection*{Materiály} +Materiál je odborné označení souboru dat a funkcí, které reprezentují výsledný vzhled objektu/efektu/světla/postprocesu. Je to de-facto vysokourovňový shader, který i přestože je dost omezený dokáže generovat skvělý a kreativní výstup. Případně lze zdrojový kód materiálů rozšířit na potřebné funkcionality a v případě nouze napsat i vlastní render pipeline, jak to často dělají velký studia nebo nezavislé github projekty. -\paragraph{HLSL shadery} lze v Unreal Engine napsat a aplikovat. Je to ale hodně nezdokumentovaný aspekt a zahrnuje spoustu práce okolo, narozdil od toho jak to je v Unity před verzi 6. +\paragraph{Substrate\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-substrate-materials-in-unreal-engine}}je nově vyvíjený systém materiálů, který se primárně chlubí jednochostí vrstvení textur/materiálů a celkového návrhu. Vrstvení textur/materiálů je opravdu pohodlné a podobá se klasickému vrstvení v grafických editorech. Umožňuje to tvorbu hodně komplexních a nádherných povrchů za relativně málo úsilí. Problémem však je zjednodušenost systému s zaměřením na pohodlnost generického grafického umělce. Vytváří to ještě víc omezení pro grafické a technické možností a téměř úplnou nepoužitelnost technických triků. -\subsubsection{Osvětlení} -Unreal Engine vyníká právě bohatým výběrem možsností provedení osvětlení. Lze zde najít ruzné druhy přimých a nepřimích zdrojů světel a mlhy, technik odrazů a stínů. Všechno lze velmi podrobně nastavit buď pro účely výkonu nebo grafické estetiky. +\paragraph{HLSL shadery}lze v Unreal Engine napsat a aplikovat. Je to ale hodně nezdokumentovaný aspekt a zahrnuje spoustu práce okolo, narozdil od toho jak to je v Unity před verzi 6. -\paragraph{Lumen}\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-global-illumination-and-reflections-in-unreal-engine} je zdánlivě revoluce v realtime herním osvětlení. Je to speciální režim osvětlení a odrazů, který umožňuje za běhu počítat dynamické osvětlení bez potřeby vytváření lightmap nebo dotěrného nastavení ploch odrazů. Vytváří velice kvalitní osvětlení za opravdu malo úsili. Nevýhodu, kterou ale již neprezentují, není tolik trochu větší zátěž na hardware, ale šum vyrendrovaného osvětlení a odrazů. Lumen totíž v reálném čase generuje buffer s odrazy a osvětlení ve velice malém rozlišení a to navíc vynacháva nahodně zhruba polovina pixelů. Potom výsledný buffer se rescaluje na potřebné rozlišení a aplikuje. Celé se to spoléha na zhlazovací metodu TAA, která akumuluje výsledky předchozích snímku a interpoluje jich do aktuálního, což šum zdanlivě dobře potlačuje ikdyž ne kompletně. Ve výsledku tak potom TAA vytváří ghosting effekt nejen na hranach objektů ale i osvetlení s odrazy, což dost bije do oka v dynamických scénach. +\subsection*{- Osvětlení} +Unreal Engine vyniká právě bohatým výběrem možností provedení osvětlení. Lze zde najít různé druhy přímých a nepřímých zdrojů světel a mlhy, technik odrazů a stínů. Všechno lze velmi podrobně nastavit buď pro účely výkonu nebo grafické estetiky. + +\paragraph{Lumen\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-global-illumination-and-reflections-in-unreal-engine}}je zdánlivě revoluce v realtime herním osvětlení. Je to speciální režim osvětlení a odrazů, který umožňuje za běhu počítat dynamické osvětlení bez potřeby vytváření lightmap nebo dotěrného nastavení ploch odrazů. Vytváří velice kvalitní osvětlení za opravdu malo úsili. Nevýhodu, kterou ale již neprezentují, není tolik trochu větší zátěž na hardware, ale šum vyrendrovaného osvětlení a odrazů. Lumen totíž v reálném čase generuje buffer s odrazy a osvětlení ve velice malém rozlišení a to navíc vynacháva nahodně zhruba polovina pixelů. Potom výsledný buffer se rescaluje na potřebné rozlišení a aplikuje. Celé se to spoléha na zhlazovací metodu TAA, která akumuluje výsledky předchozích snímku a interpoluje jich do aktuálního, což šum zdanlivě dobře potlačuje ikdyž ne kompletně. Ve výsledku tak potom TAA vytváří ghosting effekt nejen na hranach objektů ale i osvetlení s odrazy, což dost bije do oka v dynamických scénach. \subsubsection{3D} -Unreal Engine podporuje import 3D modelů z různých formátů. Navíc k tomu poskytuje dostatečné množstí optimalizačních technik jako např.: -\paragraph{Render occlusion culling} vykresluje objekty pouze pokud se nacházi v zorném poli kamery, nebo -\paragraph{Level Of Details(LOD)} vykreslující různě detalizované verze objektu v závislosti na jeho vzdalenosti od hráče, protože proč vykreslovat detaily, které z dálky nejsou vidět. -\paragraph{Nanite}\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/nanite-virtualized-geometry-in-unreal-engine} je ještě jedná specialita Unreal Engine 5, která umožňuje vykreslování a instancování objektů s miliony až miliardy trojúhelniků v reálnem čase. Umožňuje tak použití v enginu super detalizovaných objektů, získaných pomoci skenování objektů v realitě. Technika je založená na předčasné clustarizaci a následně dynamickém streamování pouze viditelných trojúhelníků. Bohužel neumožnujě kompletního vynechání LOD systému, jak to reklamuje tvůrce enginu. Nanite sice může ušetřit spoustu času modeláři, ale reálný zisk ve výkonu je pouze ve velmi náročných scénach obsahující statické objekty. Proto LOD stale zustáva nejefektivnější technikou zlevnění vykreslovacího času objektu. -\paragraph{Instancování/Foliáž} umožňuje zmenšení paměti potřebnou pro reprezentaci skupiny stejných objektů a výsledně i zlevnění rendrovacího času. Je postavená na jednoduché myšlence, že instance objektů drží v paměti pouze transformaci a zbytek dat je referencován z jedíneho pravého objektu. Často se táto technika používa pro naplnění světa různými drobnými objekty (instancování) nebo tvorbu vegetace (foliáž). +Podporován je import 3D modelů z různých formátů. Navíc k tomu poskytuje dostatečné množství optimalizačních technik jako např.: +\paragraph{Render occlusion culling}vykresluje objekty pouze pokud se nachází v zorném poli kamery, nebo +\paragraph{Level Of Details(LOD)}vykreslující různě detailizované verze objektu v závislosti na jeho vzdalenosti od hráče, protože proč vykreslovat detaily, které z dálky nejsou vidět. +\paragraph{Nanite\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/nanite-virtualized-geometry-in-unreal-engine}}je ještě jedná specialita Unreal Engine 5, která umožňuje vykreslování a instancování objektů s miliony až miliardy trojúhelníků v reálném čase. Umožňuje tak použití v enginu super detalizovaných objektů, získaných pomoci skenování objektů v realitě. Technika je založená na předčasné clustarizaci a následně dynamickém streamování pouze viditelných trojúhelníků. Bohužel neumožňuje kompletního vynechání LOD systému, jak to reklamuje tvůrce enginu. Nanite sice může ušetřit spoustu času modeláři, ale reálný zisk ve výkonu je pouze ve velmi náročných scénach obsahující statické objekty. Proto LOD stale zustava nejefektivnější technikou zlevnění vykreslovacího času objektu. +\paragraph{Instancování/Foliáž}umožňuje zmenšení paměti potřebnou pro reprezentaci skupiny stejných objektů a výsledně i zlevnění renderovacího času. Je postavená na jednoduché myšlence, že instance objektů drží v paměti pouze transformaci a zbytek dat je referencován z jedíneho pravého objektu. Často se táto technika používa pro naplnění světa různými drobnými objekty (instancování) nebo tvorbu vegetace (foliáž). \subsubsection{Animace} -Unreal Engine pokrýva veškeré potřeby pro animaci libovolného druhu. Jen neposkytuje žádne high-level ovladaní přehrávání a proto užitelský ovládání a triky je potřeba dodělat manuálně. -\paragraph{Skeleton} animace je založená doslova na animování kostry přivázané k 3D modelu. Skupiny trojúhelníků jsou namapovany na úrčité kosti, tak že při pohybu kosti je stejným směrem interpolovaná pozice trojúhelníků. Daný druh 3D animace může vytvářet velkou zátěž na procesor zejména při velkém počtu instancí, jelikož ten musí propočitávat pohyb každé kostí vůči hernímu světu a až potom odesílat rendrovací požadavek na grafiku. Přesto daná technika tvoří převažnou čast všech animací ve hře. -\paragraph{Shader} animace je exotická technika s myšlenkou přeskočit krok s výpočtem na procesoru. Animace se zakóduje do textury a následovně je aplikováná ve vertex shaderu jako offset vrcholů. Výsledně lze například velmi levně animovat velké hejno ptáků, který nemusí mít kolizi ve světě. +Veškeré potřeby pro animaci libovolného druhu jsou taktéž pokryté. Jen neposkytuje žádné high-level ovládání přehrávání a proto užitelský ovládání a triky je potřeba dodělat manuálně. + +\paragraph{Skeleton}animace je založená doslova na animování kostry přivázané k 3D modelu. Skupiny trojúhelníků jsou namapovaný na určité kosti, tak že při pohybu kosti je stejným směrem interpolovaná pozice trojúhelníků. Daný druh 3D animace může vytvářet velkou zátěž na procesor zejména při velkém počtu instancí, jelikož ten musí propočítávat pohyb každé kostí vůči hernímu světu a až potom odesílat renderovací požadavek na grafiku. Přesto daná technika tvoří převážnou část všech animací ve hře. + +\paragraph{Shader}animace je exotická technika s myšlenkou přeskočit krok s výpočtem na procesoru. Animace se zakóduje do textury a následně je aplikovaná ve vertex shaderu jako offset vrcholů. Výsledně lze například velmi levně animovat velké hejno ptáků, který nemusí mít kolizi ve světě. \subsubsection{Renderer} -V Unreal Enginu lze vybrat mezi Forward a Deffered renderem. Jsou to systémy které se starájí o zpracování grafiky a vykreslování scény. Zajišťují převod 3D objektů a jejich vlastností na obraz, který se zobrazí na monitoru. Renderer pracuje s osvětlením, stíny, materiály a postprocessingovými efekty pro dosažení realistické nebo stylizované grafiky. +Z rendererů lze vybrat mezi Forward a Deferred rendererem. Jsou to systémy které se starají o zpracování grafiky a vykreslování scény. Zajišťují převod 3D objektů a jejich vlastností na obraz, který se zobrazí na monitoru. Renderer pracuje s osvětlením, stíny, materiály a postprocesovými efekty pro dosažení realistické nebo stylizované grafiky. -\paragraph{Forward Renderer} Forward rendering je metoda renderingu, kde se každý objekt renderuje jednotlivě se všemi aplikovanými světelnými efekty. Je vhodný pro scény s malým množstvím světel a vyžaduje menší paměťovou náročnost. Používá se často v mobilních a VR aplikacích, kde je důležitá efektivita výkonu. +\paragraph{Forward rendering}je metoda renderingu, kde se každý objekt renderuje jednotlivě se všemi aplikovanými světelnými efekty. Je vhodný pro scény s malým množstvím světel a vyžaduje menší paměťovou náročnost. Používá se často v mobilních a VR aplikacích, kde je důležitá efektivita výkonu. -\paragraph{Deferred Renderer} Deferred rendering odkládá aplikaci světelných efektů a v první fázi ukládá informace o geometrii scény do bufferu (G-buffer). Světla se aplikují až v druhé fázi, což umožňuje efektivnější práci s větším množstvím dynamických světených zdrojů. Tato metoda se používá především v moderních AAA hrách, kde je vyžadována vysoká vizuální kvalita. Je to výchozí renderer v Unreal Engine, který navíc umožňuje použití technologií Nanite a Lumen. -Nevýhodou je nemožnost použití kvalitních zhlazovácích metod jako MSAA. MSAA funguje tak, že ukládá více vzorků na pixel během rasterizace, což dobře funguje u forward renderingu, kde se barva a hloubka určují okamžitě. V deferred renderingu se však barvy a osvětlení aplikují až v pozdější fázi, kdy se světelné výpočty provádějí na pixelech na základě uložených dat v G-bufferu. Problém je, že MSAA by muselo být aplikováno na všechny jednotlivé buffery (normály, hloubku, albedo atd.), což je extrémně výpočetně náročné a neefektivní. Proto se místo MSAA často používají jiné metody zhlazování, jako FXAA nebo TAA. Poslední ale vytváří rozmazávaní hran objektů v dinamických scénach. +\paragraph{Deferred rendering}odkládá aplikaci světelných efektů a v první fázi ukládá informace o geometrii scény do bufferu (G-buffer). Světla se aplikují až v druhé fázi, což umožňuje efektivnější práci s větším množstvím dynamických světelných zdrojů. Tato metoda se používá především v moderních AAA hrách, kde je vyžadována vysoká vizuální kvalita. Je to výchozí renderer v Unreal Engine, který navíc umožňuje použití technologií Nanite a Lumen. +Nevýhodou je nemožnost použití kvalitních zhlazovacích metod jako MSAA. MSAA funguje tak, že ukládá více vzorků na pixel během rasterizace, což dobře funguje u forward renderingu, kde se barva a hloubka určují okamžitě. V deferred renderingu se však barvy a osvětlení aplikují až v pozdější fázi, kdy se světelné výpočty provádějí na pixelech na základě uložených dat v G-bufferu. Problém je, že MSAA by muselo být aplikováno na všechny jednotlivé buffery (normály, hloubku, albedo atd.), což je extrémně výpočetně náročné a neefektivní. Proto se místo MSAA často používají jiné metody zhlazování, jako FXAA nebo TAA. Poslední ale vytváří rozmazávání hran objektů v dynamických scénach. \subsubsection{Postprocessing} -Postprocessing je technika dodatečného zpracování vyrendrovaného obrazu. Většínou se jedná o manipulaci barev, ale lze tady dělat i spoustu dizajnovych a technickych triků. Např. různé glitch efekty, screen space světelné efekty, efekty tepleného/nočního vidění atd.. +Postprocessing je technika dodatečného zpracování vyrenderovaného obrazu. Většinou se jedná o manipulaci barev, ale lze tady dělat i spoustu dizajnových a technickych triků. Např. různé glitch efekty, screen space světelné efekty, efekty tepelného/nočního vidění atd.. \subsubsection{2D} -V Unreal Engine je více způsobů práce s 2D grafikou. -\paragraph{UI} lze programovat v C++ pomoci Slate třídy nebo přímo pomoci Blueprintů v editoru. Programování se Slate je hodně nizkoúrovňový nýbř stejný jako slepé programování okenní windows aplikace pomocí windows.h knihovny. Mnohem pohodlnější je práce v editoru, kde rovnou lze vidět vizuální výsledek. -\paragraph{Pro 3D} bylo možné vždy vytvořit klasickou plochu s texturou/materiálem nebo rendrovat text do 3D světa. +Je více způsobů práce s 2D grafikou, avšak udělat čistě 2D hru bude problematické. V oficiální nabídce je rozhraní Paper 2D\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/paper-2d-overview-in-unreal-engine}, který vývoj 2D hry sice zjednodušuje, ale přesto má pouze základní prvky 2D enginu. Místy chybí hodně optimalizace, protože soubory v editoru jsou neracionálně velký a ve větších projektech engine začíná být hodně náročný na hardware. Proto pro 2D hry Unreal Engine se moc nehodí a je doporučené rozhlédnout se po konkurenčních enginech. + +\paragraph{UI}lze programovat v C++ pomoci Slate třídy nebo přímo pomoci Blueprintů v editoru. Programování se Slate je hodně nízkoúrovňový nýbř stejný jako slepé programování okenní windows aplikace pomocí windows.h knihovny. Mnohem pohodlnější je práce v editoru, kde rovnou lze vidět vizuální výsledek. Celkově tvorba UI v Unreal Engine je jedná z jeho nejsilnějších stránek i mezi konkurenty, i když se o ní moc nemluví. + +\paragraph{Pro 3D}vždy bylo možné vytvořit klasickou plochu s texturou/materiálem nebo renderovat text do 3D světa. Samotné renderování textu ve 3D je implementováno pomoci generace 3D Meshe z vektorového fontu, což je často výkonnostní overkill nebo součástí již hotového modelu. Ještě lze použít renderování textu z předgenerované průhledné rastrové textury fontu. Poslední způsob je dost rychlý na implementaci a výkonnostně nejlepší, avšak je nemožné dosáhnout hodně kvalitního výstupu. Nejlepší možností je generovat text vektorově v UI a následně ho projektovat do 3D světa, což je umožněno pomoci již zmíněných UI tříd. \subsection{Zvuk} +Pro práci se zvuky máme taktéž bohaté vymožeností. Důležité je předem nastavit kompresi a způsob streamování zvukových dat z assetů hry. Ještě lepší je rozdělit zvuky do menších spojitých balíčků assetů. Často totiž chceme zvuk použit v okamžik nějaké udalostí hned, a je důležité aby se co nejrychleji načetl. Samozřejmě taky lze některé zvuky načíst předem a držet v paměti procesu. Ale i když se nezdá, zvuky mohou obsadit poměrně velký kus paměti aplikace a většinou zbytečně, což také většina vývojářů ignoruje. +\paragraph{Mixer a Cues} umožňují precizní modifikaci přehravaného zvuku. Cue je kontejner pro jeden a více konkrétních zvuků, který se chová jako samostatný jeden zvuk. V tomto kontejnerů lze zvuky mixovat nebo větvit, modifikovat tonalitu, attenuaci, modulaci, dělat přechody a spoustu dalšího. Navíc veškerý efekty a jejich intenzitu lze aplikovat staticky nebo dynamicky. Dohromady vše prochází přes Mixer, který funguje jako zjednodušený mixážní pult. Nastavuje a kombinuje přiřazené zvukové třídy a může na nich aplikovat equalizer. + +\paragraph{Attenuace} je struktura parametrů popisující modifikaci zvuku při rozdílné vzdálenosti posluchače od zdroje zvuku. Dohromady tak popisuje na jakou vzdálenost lze zvuk slyšet a jak bude znít ztlumení a zesílení. Parametry podrobně upřesňují jak se zvuk bude šířit, blokovat, odrážet a splývat v prostoru. Většinou je postačující pouze první základní skupina parametrů popisující objem zvukového prostoru a funkci, která provádí interpolaci hlasitosti. \subsection{Hudba} +Během existence Unreal Engine 4 neexistoval téměř žádný oficiální nástroj pro dynamickou ani statickou kompozici hudebních linek. Proto někde v zákoutí byl stvořen tým z jednoho člověka, který daný nástroj programoval a byl dokonce dostupný v dost nedokončené verzi na githubu. S příchodem Unreal Engine 5 práce nad nástrojem byla pozastavená a tedy žádný oficiální nástroj stále neexistuje a není v plánu. +Hlavní problém s hudbou je synchronizace linek. Hudba hodně netoleruje jakékoliv zpoždění neboli desynchronizaci linek, protože i milisekunda rozdílu může přeměnit nádherně zkomponovanou hudbu v neposlouchatelnou kaši. Proto jednoduché přehrání linky v potřebný okamžik nefunguje. Buď zvukový data se načtou pomalu nebo herní tik provede spuštění opožděně, protože je závislý na renderovácí frekvenci snímků. Podrobně je tento problém znázorněn na \Cref{fig:musicLinking}. +\begin{figure} +\centering +\includegraphics[width=.6\linewidth]{img/musicLinking.pdf} +\caption{Diagram znázorňující desynchronizaci hudebních linek kvůli závislosti spouštění funkcí na snímkové frekvenci hry.} +\label{fig:musicLinking} +\end{figure} + +\paragraph{FMOD\protect\footnote{https://www.fmod.com/}} ... TODO \subsection{Načítání obsahu} diff --git a/img/musicLinking.pdf b/img/musicLinking.pdf new file mode 100644 index 0000000000000000000000000000000000000000..890ac92ae150d890ff00dc62317e504f5a3e8a38 GIT binary patch literal 67814 zcmYg$WmH?u_cczj($WG2iWDtg+@WZTyW7(ix8P22C{`Rw(c%!K6bTXtUfey9;4Z-} zgqPp{)4SIFaM#RTXJ*dXcV?e6n?*}OiJOl{gpg%@V|);wuc5t_ryYZ!uplAtXKQ;~J5L5aVSYkhIeSkJ zEo*mqfU_&W#oEP_L6neJ9^eFU*LD5!?a7{kwYU8@Yn@MWguF`jPM+5847^HCUp%c9 ztiJ)Qp3JIQyVyS26?&S84xzL(p@*lt^%rMC-<-oB+z_k2M(^5_bqWd}QZfe7UWTLy z87$_|X9RRs#y&pR=5q;NK3Q3`VDD=;`>f++@67vr-C6fC+g2Z&$dB*{|D9QQOAufs zrM5%dYpmk^tAv!-F-qOZAJivr`qDN@Z`OqU1@8UVqb>61H!hjcgBrhGpB)oNg|S1` zm0humM?^Y{_+@%+z>~EY1U`RXp@d%$Pmn4XA7^0F$>n1ts`vpJTclj_5%Z_u7{Um) z;sEJ3IR9(xJk1kjL%im$<3H2$UMP#D^#*gEVzFJ4y&;TRJA3Ef>KVUt_LdHEVmhev zk_LSINiWnsQw1xaECLGalq`2+|0dmy?dyGN}Qt zxaC0Wa=(hEX>{P1xf|R)t)VfVY$oIDJb7Q?YvSM7`9Bzb z4agK#1*G&)C53fs3`wo@!89-vntT~cXzKTn!rJJOHz^@RS2u-HBsFczHJ;ZK+5|z; z0(us&A(0m9Z7wQQcG_z@$Rr|mY{>}ecRkJ%xw}&AibsU-zp!GiRht*AnXArA7RRJj*Sv!8-$L#EfGKH`jqGzd?R=Wd**1I=scUCuIxP=ey4x(tfYwqL@Ofk-=ARBy%~N=ul@X42l z9r%_iGFj5~(+Hbg(uPajJWXgOmV0Z!t_bTsn|Wd6h%2__JL!s&cKna5rwO#f1TvZ< zt2>5xu>vuP`+}HppNYrQgbSqvR^%AuCGtL*Pg<<(u}%07AZz0E4I9Mx168+yvvtJm z-%<^1zJJIfHou0PW=M5T>$B3Tzqa}xM5dRga=rw1jjz2UAj~{#r~Co-3?(Rj-fthp zS~P7Ls8Ubuhqk85dnid3}?ktP4Pm?+?EI{yTl6;F@f zhVwc>7F3X|tSc)H6I)WAitPRTX*4AfKvvv*Ov8tQY%k|7!qYc zq8g$~V8_&P;|k4pIz!ldvD{cSV8f%@3N)Ynqf(8E-5(MiU1nLpJ#LW6sfU%dMN{nM zX!&U*?JW?}>f$B+t{pIo_sDp6`i{y)^+OGj{db~T&NpT|=A=&;;}`iS1}gkUCH`Zy z_tliw3eg%kW@yBW+&qi&zn0|RNqfz`ioLM+U$C;u%7}kO)U0v`$!)iW@kV~N@>MJ| z=R7Ubuw1HxP2eSXcfx8eMtU>z>d$Sr!G}D_Ed~M`&j0opR6eq-H82LVg%1{<{QRnB7y;dimsf4|trtc#pBdd(aTa zIw!i97p%Qcn3w9uCY}O>a+!-sM1CjUV4T8*9KAlUGgUB-;OOBTivhDs)$6|APy17s zpOod6dmi<^3pR4iyecR!Hf|iH(C&req{XHB!}Hd#q67r`pt_TBOt>aTPN@62WnRn)U z#nUU>*R2ILf3_Y~tzG?`=rU>d*Pv(K9BW5S2AmfO=QrFvI1j`q-T?(F!-hVRMXhJz zb7BErD((WZ*=5{^^&gU7^!N^>N@36tZ}ddJq>5<{Pkxd9L9z4Ae{a}^-Y37jj~pt; zw(6Vh1vtdCp!$6bmZ=d~Nac;f8wcwU)Ck@c7i=B&ru~P!Kum@<^$ww$W;viS$tW}le zU^JcEB~T*mTnEaTE7&-bwG^*q*ueal&i~W&fF_%!AOXz@&>S%FIJ%w1z5v;1a(-?b z#7-HqhcA6OVwEmiUS;mHVZI6M0e}`AyehMs;UN^ z_KA42oSX{cwsUJ~1gQ4-+**{I-gwvIJN`Uvh+0vqtt}ii>1)XP62&x3Se!T*X`1#f zPD@kpfm(P)ToC)!!asAbW+$S7@V@M;v}%l&`aoQ>#jcYm$)S~|Xeb%5t;lIFv@k(p zIFptg(P|i?2_H3`tT>!IZ{xhCbXj2Ond|Bo?)ox)B?#DVhl{F=f>uRI)EfNxX{MPjgksT(8aj*gLg6-InWU&~wJ1z6 zSUf%Y!`Z=gdCI1hMNX@{IQHvnV3B7TJ%)~oM87ixhpZc?TKxAM{Pr%WM_;m9VQ0|9 zH+ZC4-Afdo$Lz+^zlR|(b+r4kP_gw4L=Aqpt-39(hm1!R-Ldtz=_^Srv$uXiwuBdA zi{xx)UW;PsY;mBoGspVXT3e8Y7f0JA>O4tN$k=bGDy(uE(bXoNu9)8P*ay}ns7?aO z$ZiFLh$jdegbNf~?@f2L#mL1N#`U&y^z-3*5F>||IC4Bqnr7d(#%W^j-AkEkVQUWj zhMnJ2Ywhhvu4hj?gx|UgzpWRda~C=E5`K%h_;oq@wjZ0p`SO0*E8tMUq6z}@T$pdB z&pWAH$vvj~w1Elek!DL?36e(5=|blX!1LPe0xMG0jRD9(J&Q2F;a507bd`^`e+n3V z5_#t~cNlgT3IOoEJ=Z^}aTImb2Bc+Pb@X&O|29EcPq!-VL&QewiRavk`I{Y3R>-NS156->&=&Nb);?1*!Htv0VV zA1Ti;>O;WsM5n@=3J|Y=k`Qq08G8s=`!5^Km-kMLNIWXuE|`X}E$<7!ET0@qgRB#x zRl&$r^66^eJk_Cy4oShhT3wus38`+H$tQ&?B_k?_DKX%T^@>o(a=t)Ig@P%Q5lYYO!WA3`eWhuk z`oixd+FdI?Fe&aOOPxVjR=GcSKA|WCyp(ai29{-wxQlS#1Y3YpLb!Ppv3a@yMpIGf9ixUUjOq$Y2mO1jXXK3_?-yy?`Bi)ndokp&eeO$id)@{6JaNQtr)t|m@=xwLRhQ{I zB7oxSZ$&>}_ND_1Z+_@#qJz2V6@Z)sZF(W#{l8DKdKm`Bj7_TBf+k*o)ap*gC;x+fR8ZkI*~{jY##^5t(Ay0Mp(F+CUN_P#T}YTYd53Yw3Wn)N9yFz=HDl}2Bg#wnb?bb=*=v8w&tf{}$utwTH_w@=1U=Hgtd#;eM|<@S{&)S| z#72<4-mK?C?3L6nGRh#?;O|O$3{&bFaYU)-N^2@)-<}+-+1k7(F^TZ5WH~5@dWq5K zD^Am1M*pt^4xs#Zd!#HC?C^eV(bD;56YdX7`~je5n7Ii}7DNHgr{e#66{3LRlG^XO6&__&pWD+2g2Cl{kP6sEN`@*(8WvNBB~2%Y-~1Ew>WRtOUId?!a~ywTFT19i2Iq{?N_ zn*US7nJqpZEF)^9iH`mU7<`w=XPL*-HyVc*RId4Ri;wOadxQ~AhzU^kJbiOZ(42Bb zfWUt~mkRatTLp)JI{}yg5Yay@I3qNHi8+B->3L5=RM<|Drf4R*2^7d=ekbi(On2Lp zzIQ*XxDB3xRz0nXKJ(ETI1Fc!2!5!}>jNyBWscf!NujPDwJf~WZsWQEOlsd(kJJn| zCjSTf#HAEe)8F@l044-3be1_<+00v{rnywP)?UXa&1A%rQCSIQ;Sf_5M#C}Un>`e! zgJ5Ry;~pI5Lln=iYo_^@RgeJ{YwXA=nhPWEy(n_K-y3A7rL$&LYU_M4*xx6ou76Ee z=mgRQ>wV^CtW&1r6br1a5EtvzC8NEkwMy5<#;vK>`$#pz+88y$%aPhKsZ(9|Ih~a% z5SW0;p<5=a*z-)$sU6eB8Mt zfZC>VuAPKR%8ZlpzAm@D!B=@Bt^I5*4lX?d*{n6ir3^x2ReA2Yz!KIViPGx)xU{KL zi(INx3TBk96-Uudrs8*6jn@)>f_0iNi6f04B=x&_v94@reSVjneh^c}*K~c>hO;+@ z`(3p7W%QpSE2mslnZ@upHry7Teu#Pc-CMT09|h7b&!sOtnRE#GtzO|fb+(ct+4@-$ z#e0!~{Unc7))2XTQ@T3k)u#8$@yh)RdNV#u?1SVfy|mT~+Rw2cq;3}n8+*O(zlpMzE#l?Fb+Na9L*!R|)*occ1Wy%- z{oQ3lt?RzBF|+FoursG5=1fQC_cwnvWYofbE^W^gG|}}f2gR_Amw!lxzdR9$O2U@u zB|0y~hP~{31;^$8e#u+v`ilqmt*?stjQ%lyPSQCT7h5B&hFIblGyThYb>}vSm|zhz z=I*>(fj-7^Pf(i(uE6*P^kvPN5s`Z;_g{UtTAg0@NAh2WMk#(RX5 zr|Os(lCV@cRZnJFhk(8CI!$S5+A7tRxo`!evip>(OD&fFo8WY;B%h1j-*&hWcTdcj zsg&g7tEgfe(924<0{*@oQx7));0hYd8(-exRSXo)i5%?a z^f^eF*rXT1FEvQICdGMjl0CleMp=S>vp(rfJ{XwR|PQ z-hI}26E>w07V#!r@lDLyo6me*QhM1T%mb`ZwL~z*c(CXUhl5MHrT$zUbN5ZT?J}hzx`EUK81ISp_j~MjHlDI;M12xaSjaY$H=V~EBpQ7oMiuAS4Yd2Ztg0_!x;P^|CJkaZ0eI5gt-c=0uSYX~;2#`1xHsPvZQBXG3UlP&{kd zu=1-5&Kuk8Y7+jKI9gptQ_lN*1Pu_x`cwIftfmnUV>KS17#=NQFNH!l^RN)xt#i&E z`X#jSdc#ZacifYDCh*Y?6kndDP4*BESG#p) zkriL4qKHZ7vhWM0)v=xrfS{LE0m6Fcr&_8Juiu4gx!toNjmOoj zn{Kp2H0W?QrhoRr;P*YRp!dV$)|FrTi-?V5MR@7X4|T5tg*<#GXqlpAKjD5$Z4CbW zH|HiRBvu&Mo7QHx4$Z$E3=$9?Vf@L?^cnQIK(KFT;nf04*Z_Oee(dje^HrZTOdk@M zUy`j8mL2U+rvJi_;P0!77}aXJ%BdDV+rMnL1^b=1l+pR_^_4}(-&VapiRk(Lta)Yt zMjQ4l%W{4CYvxULvr{T;mW}G}tX8eVia~O{Nv<{cP;Oq+xklHHVEVG@FUu=KGb$?RE znN>5EFQ-o4!(rmJJDwZ573Hhw5xJyeUc;Mpxfqutog-3OGi_2ip!Pc%8!FUgWZ*gU zjo^(pT9JH|I$?JK5$q#VrkSr8X`O!QpkGwX1z4-Sa}~|WKT0G2{iC}W&tJ)F=~7AR z)?2DeGc6q_G<`H3V?gV${!^*cT$|yEbnVtmEC;m^Iad%C@a0;=uZ6=Rwt5|Rpz@h% zoa7*2!_Q=u8OltMPoU@b3J2R0cn_D`hX^X7f z_|8!|RLb@(n-MqO;b{7nhg3pz+ZceIH=*8`KLV5L1-a_y4(6^{~ljP+~3gvBsnRui_RBtyl&4eS`vGxZhm&YkMZ|> z$CkOU?-BY!hZakcs`wwb)tV8NU!-W4Q}W)TVsp*4-M*@UFP~hcw(S2#l8ibtM!mjnV?{e?w z{++LB%$E+dm4k*7XZ*HZOfq3PClWD$d1EG7K}I=An%uR^*2r#h6}bPy$K$zLidFH^ z2tMvO@V}<@9B%iKJnxlHe7xx&uG#fCBAJKWZyC-CSvSAjmdj9G;vD;ys|+NX{#1rC z7|z|jUMy03p|9z5|CGm&M588s?P@iyaKEd(3l9@nQbt9@bpqH6z0)Gn`isX3wFMp1 z@LCp_|It&=MBLb0lj!J&W6j03HnIoH9rdadA z&f0))HN4*>=H^?vtOcxag1V8go(xTRl0HZZye*^mxHCULE*1DwLrL@cmjgUhiU=)q z1;Q;$1et7-Q=|_S&kOD9kx&N}5n9B4x0>9oGLbBuU@)X6fA-TJ`Fn~vRrNXg7Ce5j zPB4$1a_5$;U4yDK0k^jBQqRB<{rvk|u!+557o2)}lH5a0U-ysS!Dym>Fy z^ttjV&d&xUDn>5h5rpv@d3YT7+gv~M7<35+NC(W=YJ}JNOyV?5vn4jep>UvcezfTP zvSd*GOjUHu-u(!GMSVG;q~7t@1v655McszXO>VbF!Q{c2d9&U)1kt)r>Ya?hO4A-} z-u$!tgOR#NlpGfsP1esDJuCQ;a65=&rnxo!#;8`@E)(C>3Yg7+^WjHv+<3FK8Vy(U z>_^@nZ}ys9^X~t$pRpI3ViKof`bWta@@Js-m-$F#T#wX!;HHeCvYyot;fGLlqNwqo zlCxhq6ppM_#acg!k!x}I225yE{}~K(mb6OO@cYhnKD`HEZxhG_1YV&XT>?;JUrR8y zpO;o|9-ab9HEDi%c^da>_cnY-b%H{_w4T}<;nlwVZxO-z#fi)k6cI{V>=>LK!k7C7 zy+-fvA(~iA7mfcT;I;2@wJDkV;2%kE#Tn37NcoHZAdLOBUzbte)qnUpGRa8f?PL0MmLO|8s1 zMTG{38v8_Tv19!4@_e{v^8!m69_?|^aH(}(X(Ls|m4eDRJPiuIsh(oShC~v)L<*~o zNtCeV{R!|g0n#W!W;4g|AV-YQ5@BK-FYU-@Aw3u=s|@6r?kUM}!$%?NZyPaZH#g)K zNG24n@^ZqS{rCM-jHwBa-^4p)D?_-0QsFrlzFlPgz4MmuXOVrm&|!9rxsZ)nD-ypo zxP{1yzhhk*jW;Kjv>5y(^z!e>1}^f`7I!7z7anB!i#l@-Jn3F;+f|L|k+>N>MeoL5 zy%eFgH+l342On}vhA{vqz#F#jU?9uJW_Q5vH(%N?jO{oPMEL|Iee(oC&y&ad<%QV) zE5)`U1U8g>-^autpqj2zrboS2>e9?SRDxU*Dj$(YLqdEV@J?U#xPIZr{2jS;^`&lY z2NPdUf_FE>PX*V{mmR(QPEOI$RE%JSHH2-IQxf@933)ulDno=IppRK<`fnT3@!v}J zvp%OjORRmkm!H3c-gdDyn-qR?doQP@Cz)hO=33MrBFLv)lcGT9vun0M5d!{oM)1G< zT7K>7sVc?jd!W9jIvE!N&P+lKRr7tre#0;Hp^(NJ%lecGy(h4U?~}Xe*UV6+U_Jtx zWhxO|&6;2G&yvdy61RP<>6Rpz$i@?7)-pc8@cwaQwfN85MbxW73sfU(rjL<}{of2# zI$8CqURTA#ziT>n$sSOOz11i5`CNDo+7JR=(~FcP{h+_X@Sa1e<8rfN+C6J2*0w>v z(V)wO4yjZW}5Def=+tG8=2$i&)DFE3`s%o_nF_a#DC&erJTrGJvS8Is@S<*Ku z7u>&8XY^8Z8#_%2GPbo=Z){Y*Gl^5<8isoxBB?N;rLym)w)40p+8-}M&HdVltmXU~ zb>{U-So9E9@3A256(`u(cMmOp44#UmjuRM6>9c9p%2tuAOtbd^DEc11b#Goo0Igy0_f?rXoo?G0=))C37S8WlpXq z_=#y%3^-P8;T@)j6uyg&s_XhTytLVN<|{8q{$a$=qD?d+;6bim*RFQd*87+{$?D$J z_s<7glr@GOhG@JHw4zi&yEQyNSgVBV%GBNQtX~@4xk>|onsN=ZA;-=|@=|tk*$3e# zcKS?a*fTv-a2{)?!i@eihb~zcI8gf*t>PD2Qa1t6{ZPHNcf-A+>agm94{6_+guMV@ zGp>U1)H_xWkKMiAA&>s3?|LCGr&1$J*vt*S6qL+p8NcV0z_P5)$aS_)k~ku(O+5?~ zvkC#rODh5I_YNnY{nT)ugK&;l!trq_2uX#r38jR!do5y76qWO4Cbg19?1J+CS2}=c@e;khwBruX8tLTuUM5YH24@l z0^%-KWh`1!J=776Vz{9OzyVffZlmYrs>CRC<}G)l)aSKU*W`V#wYrdodPBAQ4H&fb zv?IHQZeVYv7D4U)3=$)L$9S^b z-zp{^D3Kt1*Slo_hZDNo>W)HfyiIkh_lO4D)3)HpQRl?vIk4p;=%nSO(dW^v(h9*A z3`w1?J+Yk6Nuf&Dw-KuilW`sx7kv<`RW~Zd_zyf|kkv4IxsF{n7bLYw?<4K^>5)?` zXIK=xe7*{ML_c&poAwHQB?$bbT+tm-KD-Uq;wahQwX_UqHl!b0=1-WbO#0bp8#mW6 zk^{G+Lq@xJVY=SXAMHeYU2A_9T?v0G-jkiUK9F;tR<_npAr;t6kZPenXKfR z&cEx~df=fCygZ-}Y;XS$F`#L=da<=E0i;1baWb=uCWw>kE&&6=xC5F`zNhW+6zS4L& zB!&7O<~j20xYjgZEoB04m;dm|t44~+hO7&dcNulNS11hEELfxzIq|I?nacnnpF>-p z8}?+CFu`}F{+kG5+QwTND#R@L_v?Ii{ND0(;vD}knAYs{mfo`cDNc88cW%c4$gbe$ zw>O`=_$vD@TW})~(nP-Z%PB|S!7fy;Crf86uMmDWpEBKm*YHn%-5av_NF#=|EurO6 zM^^L$Deubp?ked1dWX1mJ@(Ua$IeEg^vIytSI5X9UN--D{@`qWEXaICCxzR0Ea5EZ z-DZcEu5fh@>tv>)8HW+&O%5c4wv@ZVvg0z>5tAfjUL+mSnvrx(9}IdYnN>{U1gZv@Y1{s_VGQwv^dbR z38GwN7jc^lK7qx65s#@I54^#fEw<8c(1ZEthc}D#uXCEB^@1;>k#S(P>zor4J&YF^U^Sm-QhX+t7sypGsFPFE0 zh>;c&ch!<^ofy!)jZ~NE{`5O+<8R3Wy#c_-yVM+bJ9u;3P{?sV0oA?Sa((@9svq>| z{ymfAm8{1%;8j$xyFUV%x&wcM+TAcjxc#F?-_B7MNk8_fl3L7VdR!)mv_oycHVSQ6h+DVw22C;Ye`j=zqYRvQ5N6Wgsq){a$2@${ zt?483uhb?E836NBkO?9yeLE&Uj&?F#Bgj`By-AC2 zv_s_Qt(jdG$&B2yuD(cOX`v>EjG6UaY5HG7f1F>?XVb*J$Xq&;>Yt)|6}9ZXLH+^p zaHa|1eS15f2=_-Nn~DM+pgSiW=S|tikT!+Dq39l3*0OL-d}@9 zdWp&~uzk*_NzFW9-$=LEWAxJ-|2y8*6l)iSQr!{MRg?Rwl^IB1zS)_BA@1+#Pg;Xk zRe5Cuzl@X>Nuw7Zz$9-bK#%P*LAu7cMr9aT9cS3~4VmJVKY}jM zrkSMs55pqC+V7=C8)E9{OwMS-NKR14;P(4V|BK`R>4#0;)PLw(kj&#@7mfdQEF#jo8DGJkvs z%PBC8OruHg8ph^f8Buuzp)!tFbOR=Dq@}5=OnY9(ZkNTg6e(hLPycxn4cz`wZFS zlV4VLI2zU0QKem;K^M5Q*e2S3a<^qz?_tg2o~mNNl>E&5@z@q@K8tVkY=_s;y+Pf- zLiu+UPu|(7rf87pxcVZ_!7*V`4)5Z_kh$T-elQFmO%?RSpPWKkkpVU=ia6yUyh1t5fLfxUO$D{dc5C2OOBL>i)@=b~$H#Ex7|9ayB z{UDBM2rn;po~Cp`KbtLj001{HgXvQSa4&Vfs2-=a)=Uvf*7tByImuogvKCgZl$If)aBL;f+oxTdA zZmG&Bb4VKOvsDU2s^kN)=^y&?pAWR8v+}KS^95*iFB^vTx2mwz1?z%m?5MXO99bjp z4NZm4DyP=yJ39A9TYQFWLV`L?yPX=HOr^yE4o2pMoPJ*5b9>z>bVlCEN7OJ+JK7*> zvS-3nmfC5^RP2z_@M2x^G?Ub8>1$c~N&On8kq|^E_N5dDG8T>V5XOq`R&HG!fO4)Xfm%j?7 zKNYkDRSCf)L0iIy{5~tdYj%6L1)f;(bT2VoL|}m-G?bTOrofzMx;r)K{P<}8`F`-j zL!3`d^q}}xa=$9S#xQkx^i5}DyXZLjD*Q}bXhN@_^Rx(4o~llTg+RaUtLd#-Ck#e^ z`*htdwt94zT#KFD;y6Os;NbYmuiE&V#eNT!EACD!&5qOJlHIDflU!z_nw!HAERmFY z;c;ku{^a~O{NpoUiR+D>-y72Hc2XM|&7j25oBNG$JhR)I6STWYPPBt<8}WPb=|G#y ze=;qlhPC-9>+j`^h!w^L@F|2O@-mVW9)P;S34;ipQ)u6n$xtr)ICG z9ItZ`Vpjv2$fdrrWvH2#xk@w+6IU=X%40GFmy@BICW|qE_y0ul@PTayPEGyqK_Dv? zLW*Sxq`gM%{1w6ZQ!%UJ)amMuRP>>C$LxM}|3N~(lrY5FzI{nc_h*prK2sumekbZa zkubJF$t(PHX0ct@1+!`9+PQ=AWa6qsWaST)t+ z-trOsb9{@t(ZoZ)BwfdN@$_3ZfG%*wI#H^FOC(dg&0dYXw?IQRKC4ljXi4rpmr1%d zi{tFj2)UMd0=c3*JUGf@u`vWJh05UmvXUUd+nd={A%3@Y;Ik}w6V-@oJDJm2Y9q;k zHP)wCAN(A2Xo)%}s;_(N)~WLyb#*6!hFBFL6p?cYzm)rvLCdH1C$b{fetRo6-w4*7 zJ>ap>Wo*ZkU=5>H{tUiq)Q75x+^~a~T)>K$y}DbEqW^DXCVzWPV5 z=*jDMub{N&FNv!V#1GH%UODhwH*P|%&x+c`u<-+L@uPLApWA6!5?apWfOm(%ya#=L z8|^;7R@;^dgL_Wd^B>8-j}C~*L+*;cMFn}!7RW+xdWOqdjNfJAR6``~sOKvsMK2Oe z0nMjFfH)#5dOZfd33u!o8|%aX>g`O!$A`u~=1;Z`ou=8M`*Vd3VgE60fqQr5-nwN( z9zjCdiT~u*ZNEitpVPRsZk%PGApSa94{&zn@}puf(mQ$l%0{k&BM@Y&Kyl%i=O3g^ zNC-a)SC`1aIL6r*8tr%Hik1c3?;SOj7nMyL~Hdvr+$mNw#ve0l@tgkQ$kRz!?tQy794uR3e0+cMeKVs=G`*J-)N{!nax7|16n#L9U6(Dt7OY~ir1-1*&=PY*JzooZ4U1;yMO(Ss- z$<3#Ep!f8pA^a*8Oj@4S38o&I`%^vQP3zS9@}SCYMr?6z;hA0a*s%I+u#=JBXCobg5}^Sv zrIMw}DM1cvmV*=MLsXXx(AvU+z035X{^N#KoWhri!XM+vLh74TZEnB|#`#9Qa)%Zs zY5$k|I7o{B@{y(v1*W&bIf%luIi-Yew_U<{yPL7!+UCFw1lYogf7Gd6v9Z!H17@83 zh?Wi`gMmv61M-EtoS49X%k+6Hcq!7f6ZYwg_0?1xiOt`afQ7RIiJF$PCN>IsiDxhN z8_&KMQ84^0J|1b#JUIv+&Gp&-j$5AO`FX#72XeQ%^?)a3Y-au(#m#8p7L2e6rwerQ zF}4^ede)$VqVsDgi9cm;A6+zkd|GJiYheE7^xX+&y1-3>A*9Cy^Ks zlI^w1JQ0ZCqn^Z38-j1I3a)zaNQ&RxMd*ZqdutapCUrC%EZz$3ke}RKq_^QehaCR$ zQHpo`AP-v`jW?7Xl_|$mej7?q=JjxbG~E}NwWyp-nd8FbAR1m%@s!r@M%Fr)C+Vx+ zy60(`cnY2jbdyg%UbJQM(s#BT{w~WPM{-uHR4coG-MRS$I10G!0cV zMuSqPGX;nkbB_tn|cw|DOOY}}h_ zOs~`|4ZYHp@k860EFyHkeJ9A`B+XBSuyYvEZ|3#{=&nxvyMp{u2B z#}M?|PSfVwet;7w3Xm-FQowv2cjCVc4(t2Jvx7|S-~eGw=OlwHRYH#)IP6~b`A(xe ziYwCC#c5z@@q$<5wTo2_-f=hpboKvviSbMYmayoX6gRjr&F<%(`yzp8=tdW`&T(`Ja$FNn%>B2Z5U=|3va|cD%3&unh^MV& zo+!9pkOH#}#BLI>Lt?mcH6rj&QSpzUQgu;%+Kt3!vlYl9a2uX|(j3Vt8RzRb4w8^K z-TIe=sPt0ASZQ7N!p6S{+BD>S&8ZSff<+vaqY@%*$f@zRY)%uS^zIG@)t*BZY)%TZ z$3*m(m1pN6(5d05E5sY2Vb)V{9t!5zDV}fC_ARKKBp+KX-L6=bvm6@9phNZ zS!F;zaAr`Of4Y|~6Zsr*0)9kyJ1LbAQgkX;k_7M+MLD9oe3W@mzvMD!LmT5wG(f4$Enh@EdU=Uz)f&_BZ;#B6igb8AES zO4cR@<1ztcSH(IT{v* z!uDYMfjXj*fo^pi;6HCAocoGh)3H7oT?>VX>@4Bung231AmH>Vy6OFq90CR-1o%Ob zM*SusTl*LSTM75UL=SEAsXg9#A5EVvCL3k0 zO=Z6YowNmLotPfexZU7PaI}|D!=H~NeHL?g6VFj$cP#_={c{q68AtdeXGlYIe3v?I zR404)AElXO+byCKV2PTi^qb|Ed&CI=WB9C}kwAf`U7#8$P^y-ql&w)e*~@jE=&2yp zw>R&IJR0w~*Rp65k)%_rWO z!NHom8jm2J;JXgk{l)e&YGE8Y$T=xI$PO*Zwk9Ywv7Tasgiq>?6sPNFFu)7Z-XIG5 zrnBg7!1QfqiR#K0Se7!=%{9D+UvI6oMNL=wdLd;`9uahV8-08~dATsqerFkcp8iB^ zZ}o#jp|}4j$YWFf)bCC9LFVq%HXm|4k&4vSYWXM4?XXoR>|eooI}$9;M9EOY0_dil zxAdDA;LS}-V<7OBl_$^yQ*NwK$lxXK(y1kHOj8&0-S?)1Y>P=hO( zvf$vO^IA~0)k~36GY{mTFpK|XA^6$8Ij$?qvPqOpKS^0f?!_G~wwMTU$JKO}K)m`b zT$md7{qd*m&y~+VH-L?#564tD7tz+0Q*LxVj_=oraK3St8U=o!fR;?!lkJ6V%$mK2 zmPlATDf<<4=~X*s=nFb>jO;JV2UrGO<&}wIyR@8-Sw0-kA|4;|E!9w8`(yhME++nu z=3ukyU60|jA}p9KB1!ruLWPLNdLQTVEU`46axmg+GX8B4qq64ce1I zX|%wj*-U)1;DeuDrn9U@Tt%^D%`doM-1;RUU>}c~yMxvZe^u<)rN1j(`-Ah=iCa;# zRHhv9I_WpCe97BX&SPJvt{>qcp|jf#-1|Hn7_kSHR9`071CF5q6Dx_;GEJ0|>ApPW zTEBnKkj+%rbA%w!$Cs1=mq%?(_pd)XDy9~!9_D1%MkL=HY@h@}z$8)K0tb&>dqImt zC&3m~|2}-x`rvDr9`jTKjibzmoV6ZYZDnHj&I-NWq|H7n!j##E9o*HHX%4e5-0y%b zsC^f`Y9G&wHdMr1wacd*>h-3p#umYM3AQd9W`48PJ}cK#Fevb#ClUJQx(_ltECMib z9Uc|2xE?tN5vfdSW8GHsi~%GFS_&NGWY+!F->n}pY=TvokfvLtk%)eIvB_6zDW_cv zh6{h&P!#{#+KK0y-dObqZuh3t(zicOS_FxWOM3mwNBB8kAi5qj4n!OGni}!KO6qnkj&;a1$C5MJ#qv*XzP+d^r-$$vi0n| zpV|dP4gmgjWDWr=6@dXa%%@-f=och9)9@fkx#*va!erW=G8!ci zP539aBll=Y)pL+RD&yVI4WaVTCZ3w>| zK;1stJK=oH_yjSFA}8U(u6}Yy?6B}HMEK*p-UD}X%*}u7^RMnA&d+w*wScPC&K27k z$7z$_Isa7lO)lxMRLDGx8`d2C+q>M5d9YO->k7oJEeb*H6YOnE3U$&>0B7L0Rn({Ht49&}OsWjHdXg%&~kq zj*!IhZL88F@#Pe9R3)P9=-tD1WLgC~JY^4sPu!~(_<-MjwwCmkR+9c%B?Xegf|iR=++HO7N6}Nc_1zZ}a-=pPClnw1hoxCXBqp|K}vdB~Y$E>Th13 zVwifq7#DtjwST^u4_z|%<*?N52a(0a6TbiR-WKi*hP!Vt@z#!TSMxuK3MJx_jU;hA zP4R$4iHi3TqR`naK^ZL|EZyUwwHn%}tQ`N^s4`P`V*bkwl45~Y@LJvIPB}jq*fm=u+e_UdQ)x4chUuOfvm^u zfOqJ6L`}S(RD`Y8Jd2eGDLB=9Z<<4n!3j3#fb9D5LlI7;8c?Ta0?jn_& z(1>ZdMy3li?buZBgk_=y8wqH6dXxJ%bm752ra|+%sTnuUe?NPS#U|#_&m6=?!_j|A zOXJlrpXJ5&e6#FuTeWU?xpUZyRp}#0jX9}HauqZ%zD?Qjzg~k}tp)G@DsZ|h*Nv)I z1BsR@yCU1^=r$q&+F4$oc7iUJ5;~nuIsz6m)Om;~Vb7TI2+B$Dw!jm=2CMn-pCkZj zh<)EwEFgYDK5_+V+N~`y`4)P$XHW)sRA8?28XQ#WQ2-y9IH&gf%ydY z9YW^eFk=v3og}{dCGIwLzdZ7LNYvuf6(Q{>oqfk*(2a3`k#re*)f`^+ofC z{fcwVoe#hIrG$9bs!TC|jRZ>6nZ*j}q4!>Y3D%XH^Yhe=$|`e7asJ}FuYl>`H@k&7 z$|i-?SdhK(eNMkCU;bc7StSW;V3NaRRBez*xEo)1;Ss>w9fgHZKXs=3tb^lk@B8q; zUcWq9Tdp<9jYi(uvA?~%fA4Facw=8VPiGcZHI)iV=5cymIq1HhuQ+o=*<1!1GB+JX`}ojc4rrKvIDev%^9#9*vew|~TkFJH^K0q_nvq#0ep+wR&YxG)+FiFU|cGxJ}tTz>FZuQW6gT+;# zZO;Dp&At0waqXxL+uY3(w4QR7GwxE5UhUe~o_~>Z#f^*R4{d2JMIT|ehy;g`#@v&= za>gk&m2LRRy;t7$sKH>G3ulaYr+2?TH_rM3HKj0>G@tm}%P;ofJh|`0rg-#4 zYFkxueECO)ue<#4{9Fv{c*`JK|R zyJXYU4>|pM|M<1ntfq3*&H6M^uM$NUA*!0wNL19?n9b93hRdBiC<~;1)Rs<*qbHi*wfg{`tH5aX42#@bK)@CE6BMRih&7 z?80a69XMd{Ekm~-lNrSrbj74ls*isC{)>b9a{Bgpe8!PHt);rss4Ew(dFsJy2i|bY zzh^CzS1UBuT1{)Ew!U!Uu-C8a)tl3o^X|H%RYsMJ5?|TjxD>=QW%Gy*^vJubf!k(lvOc35k}@h`I$d zNDv?R>u>Mv)9A;G?g6}ARVq-J)k=%_%%Sm*_vzQC*PHtrWH5zQHB0%W8-D%tO&rb@zaBQP+@KK| zG_t&vR|A~?=&3Ka?gW&U8EP~bibqm#X7y_?JUO5jXYl<`&dw>uIFL;;jj00Kk;ePd zk_cn5JX(_AssZp;P$>Ys<@85>3&m5I6TyeIta+32+f;1KoWF>vEBf2WxzE$-u6+U^ zst`aG_)_+Qcc6dvfB5AhWhvv~(TX}8S(my;juy1cp?-$-`Gz%G@I_TkY*SvRAZ_Z7Ry?QX` z2rRw*URZteZSt*Oy?!V3q3drOoFyfyONXMSV8$=+?bCO_PxC6pxU=Tr9US|MD>AJawGJ^+N6)hHrP4aF@IR zc>9|-7nq0xh1YOs&cB`oynS`iCcxXEtBkSbA6xwUhcEAU{TAws$|OjF5;mH&DAM_2dh)$i4RepOYA2i!m{8pU~_JyRf@V_jM%`Xp?4z=8Ex4Z#=3dQ zJj*_T&2Q7$CtO^-y>$FmWD!X$stU7O)==`ZUq8m_+xMo29~iNC-tOav_a8qnWaJk= zee#amZ@=pH%LZ`nd3?hDd;kGSqgHKCIamDhy}y+RF09Gq2 znia|h-iFnq?;kwq+S~7+aUe@-l2z3e|Khp3U@+eD$lVj>FFJ7a@Xq6_Kl^&bPaeJN zfqO2yt~ck(2Ol4GEMHE-{*ZW*ip>00r#}vO`(w_PKWKj2CA{sn{#Hnr`9Y^tk@d~f zgE{^Ba(?!wzwO+yQc!;Q_<^-kKKt$Mcl3JbZfNg*kNoMMTICtES!yk4;xBseM}7PC zzx?$-zPxkKs`7%p+vk7$%(Hjh_2>gv4ZfxCv+p$-ixK@=6;9R8um9f@1NvU};DdKe zSTemNXV>wqh?_(^w~Hc);0bi^$tE)Jw?1|M z)ptI4dlBF*T(K6+9Q|ibpI&c&{V&vhwDCjDC*J!tr+?pP4jo&Yh{1?)Ae|*gR*wL@ zef<3UiqHVnqS96I)-C+v=^x)Q@R}<*1AF%wz`603yMFuL--o>ao9p^; z{F?I^h z8#~0MYO6|Cr#-Xo@30ho@n2sQ*P;Fv!=NF*m5WN&{rrXdFTduR)!b5|HI?Qbo%|S( zsJ`zUsuST9W|B)9r2@r~G4H6Hh1U(n8xD>8@JU!o{(SK!^vqx9?FXYf^5zr6vA z8uUo<7*KNP4+(lxl7v~i@_(M+DlGKi8zsn!CTY2>;G1vPemeYLfBE$9!^e+0batPx zL7_LucI_MW_b)%4xpp6LGrb9(si-un#G10zyHa1FwSte2zPg^?Sqc7h3+o+)nH!b05^0#lD^Ut9lt;)%P89`+= zDeD9~x6gX#Qog5;l3R+{yOBd zd7Jk^iy$o|)tHXoq6bQoQd(2G?c0Ta{Pg`%`;LigMN+f=hsbX`?bR2^ZyCFc1O_K3 zlmWiAmN!ZdZCW{e{II_c|LUC$>&6IqCxUGfm*wR08AFGT_^L{ABGe`zxUFEUWd_~x zb>B=HKlG1N$Ncrs(QUTsoEH6oMKiyiv}kUdsfckYVeyN4SC5!!=8Ce`teNxW(Et2t z#+-3l@nKudsddXnPoMCCu{I}Y(*ka|D-O(^@c#4>quS~U;H7wGgp-R$digYhy!D%A zd@}OO-;NydkE|o>sw#<_8wPuk5Sw8!dU%nj=0S%7!+qNXj8AOP9$7m5gT?c|)Ys%- zj0J1a$%FHTfA#+MowI@5G9J0#lC^E=sINXAs+1mM+%kGV7>WHTljm%nJn9eMZl2?5 z76G*SEjfp`O`A0Qy<>-0haKe@tr0_nl}2o5wyd5o@{2#MTsgr~BVYn5rkP*M-MxO< z@Zm$=9{2U%cW#@jZ7Dp35qCWjawwZ5p}*ybdRn9FcNTE5xuvje(@BTUDhb53`LbEXsnhKs{*tmBgb~Z?3E` zYb6ajKoX@<1DK|2A}2K%nX#1pVs)k1a5mi{K zDx2%HZ56;#brv14U-%V=(eF%W(kL6N z)K(0-tFz#VlkfzYQHq;@2A#MG?JjCsBwDLVRi~CW%Je3gyip}>MBRwYf+5Qk4JwsE zPmoGOy?V)tBX+U_u^WkbK#;g+YQ0qtAA(9k4kPxRz6 zw-O2;wQDfqE*`!hB8~&GbHoxS+K~M+McBp#5*uvAqj|{Aoq!w!CJ481&0Yy^JYg7c zxXzEX$Q`X1@+$xngq@sk3t(>JhFkdP``}c-6ce-+Gj>h54GKo~zg#4o8obNH!+YGM zN&|BAckm)T&<*w)285VhljxEc2m72Oo8<#NPzZtn?_DR$;^n z4^jGUrTBHuVkp1QUI_UBIa-LZDMIdA{Mc61nc#tvPLazafp;bFHsEIAZHMz6B1{1A z_J_`It4vxzT0k?9x;8}(o;6lkZPwJ8ssT>`cmcAM7=gS>ZK=YT*ciAKfC4c`VnkWl zq^hx1X${XfZRGpfZ3V3xzQw2O3 zfEVDU(xOEh-Fl4l1s65VT1~SYW4T!Iyjqz>s)NNix~geNsPj&kEtR-Jhk2nbHeKbpUKJnPf_X6uwSlz|iFY*9sF2ORK=M)i46NUfrUrYOO+CHS2)0>6)sltUADd z^c{}RcM6LZuIpP=H^#p`Y{;;S&t`W&{BIU>h%NC+>J{azs}=m6-4MkmG>>&)tfs z4-X-Nnnd<%mykg2HBe)ITRAxdO&hX_v7+2u1aKQab~>kn%mp^!ZCBbSTa^QZru(EZ2$=15^zd9!KAdr$5xR)C295H&w#&UuM=L*f#0mEpl_UvQ8p3 z$bcf!Xe|JP6-Z)5@KT_QYI3Lz&_abtE3v55Rt;QHlY<^A0n?DtNrCvqI4$n=tLUK# z8a#Cu-cpHO7|9$%AYyDT0A8~+;Z7^7mjN=%5Y=@x zO;S9?2BSl$CA9)57@nBZq^&S$q2$%3MqRU7WflR($`NTbK-!f?40lGt%V0=YiAk?8 zilG?NI-#Ob1pGFBu37THHOg8^L&WmG0`RD-YG@XZi0-kd2BBzxBFLH_DX4Hr}N<%Jr$jc)DQtG$!NrHv80(hFw4NO($ z_aOGVJ@OEcVJywb%_DH@Vqk&W+n0Cxnl@WXj=u05!tee z9DE?hkg#nc#55P4@_+{}xTHwrY;q`@x3!${lI?f^AE%0*9Y*a6;=5hsN-H;F15Pdv zwUv@%Yj}u(=o29hwGs$&Y0>c2h9yDWhznyl;9vx~J4tB7NWZEiT{Ma}1BylfmY^yZknqUdEG%C1nUEu`^+%tdn7- zWV4B!OYX$exG1Pb9La;rBlP6lcs^mYAM=2S`9Tmm=SYTLX_p+bj#t{B?2t?mJpGo= zDH0luJQkC@(8_hx0l?%3_(mpB1*-OHj$!uorGp}$m01}3@+j#AtqK#Vsa*LO!{3hTqSs$K<1P) zyW>ZtcP7~omp(5_LL5QSNZbsJbt*bV+T?Z0TGPQPU7jlgA6HpiO?U4W6`S`bp zSl^W?-}O6Vc$i_gr+m{jc)dOOi4awNol}e*8A0)Uu>Hh106jN~%cF zq>FoyPG%@)8u`QKx6w=NUzU;IiV}fP5-hhpekM_rvR0x87PI)Rn9Xn5GRbe-%Wjj; zH0PJGIqmm^-zH=azx^TeTNUNEl+&{FUFNq*6=-^Xo4m6_K84?EQuu9$+HRL`4|8_kx0l4f zjPTnqo8Pi_w<+Gzdt#_d0;ELZX09nH2mF@sNs70kP8n=w*~4!yF2DU>^)Kt;w>|u} zhu`+_+a7+~!*6@|Z4bZwj`?krMrZBexBs{KZ5o!<4T{($4#OVKmzXbMBJK&7P@emH zQ}OE3$?lftQdfSr*E?wvnZl%6Gah*^h4@<&3^&g>I1`Im*mew$TOx)AV| z9CjdPNEGgLrUEPm+a*bSX8B#09q1)R{_~TaQ8?nm+YNas$t2U>&#NmbF|}Qygdy7S zTy^BPin7ffcPkSPrn67TFpsChTlPs1u@io&QzYfL#0r#Z5@^01WL>0uY!Hzc3zy>g zsd>oIbcyocCw%+9l_vv)b~lmWy$HPWMj7BO$8X7 zX6Co(J{k9;Oq_z6VtCWTZ+rM{TKrGLZ~f#1UYZj9itV(UlGq3Dw)5>}NqWL>gq*ws zS9d zlZv-N7T$KkZy7(}ZFTuvz}qhK+jceyne#D}u(J>&V?M&dmIw=8qHIj~AL5hWxAL(0 zZDrX6YM+q6+Z6w@3)J5xEXt_t;kVxf=5(_@d-!b+zwP0-mk|GZ`0Wod|GmMt?^}6# z_-zlr{XUoHzsqmQ80jdxGrm}|ip1#d7>tXY=Mq0tGHLvONhFQLNXtM|{4|`-<;A*3 zPu`0G%pp&{wA%EY;9D9=Yan(i5P>h+3YVI1D=e&cv3M*y_;8v)#O-;nMUHrjQq4D) ztS_FaH){jYaJTs_gZ2r!;^kh$5ysBNvs&yLGd^8Ldn=z zl6?>GZ3Ka?Y>jnUrYTRzkt_r8(ZEB)qpS_POC{4Vd>REkcJ7ajC7tx_@=GOy#NUB& z@d0o3MZ~`>>iN$2tq#vD&}h(+Cze+?p;HgZtGbe>C`9vgbkn@dlFZX_r^mBmWB3z$ z&Lzml5V8sLVrw$5HfPFr{rU8}#8#;~IkQNUs7vzN7`{na-z#N3=i=w(toen`IBFK^ z()y=J*zx|0n`dJz`@J;Lvzt5S+qt$`uqI6)a4b)C5iAeB zi<^%)xyWx_D#C9^5q^vK=wpZ>0g)6%zyJDM%I-9*Q6G!@%^F|ICJh;zmr7EMr8tuk zbv%Q-@O#*`A!Q*6#pg>Woj7>=JR@m`Q@&w66 zm1)XjV{1-Wvb*2gO&N0Hxi%4&q$l0b^BhC0D-1mWhphT9on-JhPT;pfqQBin;wSjN zGkzO)>Q^Q5an7bmj-ZTrigGlsH)&Y+B=c3KWPFuMWAgf?$kXzuW4eW8USdh+#nxoL zyU*8~k}8+>8VuHT@}(4K;=fg~o^vtt8rBzeY!Lyu-Y&8YOL255^64V#Xk&Gf%-0)} zd3}>8nUBp5+63Mz8WpHdun5kJ-}+FWP&z)rZ((#N_^rn+WUqwsv z(?Hsjd3t~jO_WFe-0G-3lgdP9sWI=h*-C*K=km4Tu?W%6;w=WNB1 zQcZSN<&jeDk%Fq@r4?D3WnRV6V%=#fyL(R#)PVjB$fAlfxs^wYYI2HdP8L?2$=4q# z(w^!>R^t6s=8`K^7HLo9>rQ|y(H=Ra-My2$SkokALJa%-GTOIkRFJfG=}e2mWvVV( z&{(mm)v(J|f6&pmwXI>lyK%d>{!mBht^d~1u)pil-?+nNIM|uo6|6rRY(VKZ?Dp3l zWg7Rm4JQJoUGOVUL+lCm`hC8-ZB)Xqg5&|=fQ8Or+MPa^1R8ba;Jh^nKwC+Cuu6lPwh&6O~I6n`7E)7O+hnz^xfHpo?_$vl*8Wx>>M@~4AbUyRq+lk4m}`<{(>efq}YnIKn|VSZf+ z=HXp%!`giK*ohm?PW)!~CmV9$SJTOF;ZIXhUV{8;l83jal<^&(R$owrG^13}tP}$eP08isK(u9Q{C(`<1%j zD_#BwRl%3K{I5Z3^M(^Sgk1lcN_r(G^M_JN{`xh&C;8WcFQM2_638p_zo^LhQjztA2_6PjIP?TP5v01Ekb7!)- z>(XvDxZ7HsRzm|^2)KS(~j6r^D9%Vj_iG9F1}OswOKn#cbn1QVsEn>;h)XTbzW2L;sfi;XU#Iz)!?t}Z6IAR za9W|RnyG{*xNcvlf5z6<~=Si zC>T0KC*!tR%$`<*v&BlEoP2(ZmCAJ2yDKf;ZC-eot;Y;BcrC)|V5ZiQ;Obh5Rz#@S+GTB`LY_HLUp#2}WpIUIIZD|DemV)v_b ziQUKA{fS;75?bEwuzTDtkZ>i;gu)C1l9)Bd@_u6CNb-@cU>TACr7efJr_l5{xFEgT0X4!-N>@YtS)6KDfv*F8EEPLp;U+ ziO0xZ&9U>qTuf4R_K;7dJ2qe&M%@v{%V1mLvzVxl!B~6@xk4K|8iL=2QFbK{zYXK> zaQM*2Fr=%*J6<@}`y#&5xhweNCbc!U!a#^(cf?P@-xA4SCyRt40sLzyl6WTmH5$u@ z!cb3cyeHa5eib3t@o`w6L7y+^r{95f!!RC_50LWEuhSP4=l$y+jb&nA82WIS1brpd zK)ZK`Z|Qiw+j%n3$VWhVLQoGjdu#dV@r4UlSzBA_^8>LOBl&0$YnaGOk%v;i5Qbvt z4(&fO^gXLc0sJunE zG#Uy12|F8%)(9$0vOoT^e8Pn0N)avQ3K((R{r#m*!eH#Lc*iH8hBiP6gQKmY9bq)AL` za}>(~y_(KEN%a)_y{VshzI8^CR&768>>g0yg$8h2$k?u&eaFih;ePIls z1pOR7J;b_BXU{NB+lg?{FkGYTO)<8fE#0@k@2w?yr$-DI&YnSrbQDjq>WOUxK1NRh9bU-eLIS$OwSuVnj!mov3^1V`I1>a>JFrB#7yIt)rX-e zi8QFc)Cj7^}x0@2jjAF|0C#J6@+qf?pa9 zlZK%46g}1xB}3m84Tanu>C%;gd2^Jjz6pEXbW9~|?-LNw?m8)Ec zjQyBSK1z`a;4W;J@Qa3gnKyc3u(3XbNJZEp!z36WDFfSXiZ#Yrc-xUNCi02)YIi+K zE0z$X)~4c#;|k`_*X`KGggptoC4@4ThnLW{!+)i8E<@%8r}|-UfZOM-OI? znaCS6hVi-xlO#`I=yZd17z%puOT$SFVSf>=iZJV_)@X-1fi)c5!?1mnDCCls#sAl2 zIP>|}!pYN`O7rOCn`9$2g#(@9ZQ>qmj!5!`2&;IB(~1FaaYWK_NxqKYEx8hbwTN50 zVPo0UDZ+URX&W&ScGv0_-gf?1I!N2i2n28AYe^h2c7-VKtN#>@o#?Hqg}DakdYs(G zQlei)STh=(qoXmr^#>yfBG+zaWY3||_J5@^hPSq6?#vmy+4CxPZe;=DXZYM)$oJjb*`E8^#Ts;TgI^Bx(Yq|616@Kw$ zxYb7ZEd}#S%x_~LgUUK4w;cY)u==i<)!ZQQmq8pqqT z{5BGHnoVU3msGD?yMMxjkj;T%0>i28e(Crv(JVqA47VOV#v3;Z_-$Po@4M%>v|lm0 zilR}Yb?aA(mMjc9?1{;XjaT1KeoHBnuh}G>JGXMn*3z$rHp}GXk1T#ms?p~UWhh(P zdQQ)86H|Ypw_8r+mrR_hUbq<6@=#qNdKeLD>k#3$e!_1f@xIDN304_8=eN-g{FW%E zA~8v|R6(D;x~_QQbj$ud*~3S>YwIsHzh&6`7W+1Bm#}!v8pXmn#ZzY1p3b5W7>Q}* zE;ZgpnK*Yc3V6UOYxnOH%$XZ)vml@nyp4Sa!POv(-?Ba=*)s{=w&S| zz$26B0MIj&{5HTI*DQYPk8}daiSn@dZ6wBNS^O4=Wo=#Qw3+6;yUq?D-Bw$V+Tc*? z$6g|SOV!#yWkFW$*ddxaK{#`+^6&{LXEd(7g+B!@J--bQyls)oN`{YY+`UIIXSUne zNWh$Qzetkb`oEw2HWGwx!06Q6vEv#J9TZKPtUjF;YCqRp2)|9ys3iDpG`_(1lO-~A zSH|H}FIuZxx1r+OZ%-^-zy#rA{Y2@9U>m(K3`y2=8h%SBZ=fzMLf)ClGpza9rzTEm zEHC{I_-*X5?W!xBKXrm`^LFXVRhqSHpbJx87N>AAn7Ty#HcIt3(V+FvQ5aUvtdr8I z)65NZ$#w2`$ZsnH&1EA;8x9@e&YUAXdKC9cqI5IpqVd~AUA1pYcm=Rc+%sYvF4Z^7 z1*_H?4(vHPdy%uXm1=${v&Aotq~*8t9_(FdZb*zTinr7sq@#p^+bZCnnLN#rfA+-q zNezX0FmmC?8TwVaMn6A(8>0HIXdrL;jEW84%Ga#bFI|pWW!ze2;&>9wfCCqW-_rG0 z>xr!L2@~8|M}?E8G^$j-cvF7=`7M+leihWni^q(y=ATu}nWNpdlcEsmOMyiH3}*C4 zPCtH=iOp~0LmMY7viBGEx?KEei>i0;uHL^dd-62K;|auve<-fMrTmtOvg<$jsOW|9 zTQYO^7 zGA{+*QZ9v$3wV^DICQtK}7K&!fsXlxdN(|rH5h5-wzoqsG0o<;|nKbNm z0?)7AcSOHst9a}rHr|q+9K6*0maI8K`aK6=J#Nm;=1-i|Boz7LDo4tTC_VFrzNh>a zo@709nm28lyR4*P{rWS@R{6Z1OU-YYn67|~oiJ9HyxEXHbdo1Oza=|sAM|Qi%QJpz zZ4$Wj{5C>WP;GYYw(Y_dYy8}j^0^D;TemaOn1=1r@mscfgubFlt2;A#cw26P?eNj! z;iH2NdrYg!>cE$d-$uxLy!IB^;uVb>w)pb0Wz(kf3i8pNoM@3FEGvazBoJe^q@Sno z+X$N9g)W5O=5h02<>)CcGi~2>e8Iwi%NDB%*197c2qgB)n2W@3$^3@=7S~_8>XOl; znzGN@a!wr_J=IiE1)vf|-#4Odh-Bio!HoPi(t+PH)Dn;Jr^-N3zh^&p@v5R<5gAzb;ag zEt)k;1nco|s3Y1CGo*`-w-k~&Y}zjT9vw-uf~U@B70Fm*0@OxrMv(!ibd;0GJmD;+faLyV3i>gzYV10 zx1>@%wpQiJH5D7S1cls+Z`LWk*+A49(RkBz&Tr|O@jUr0YD;2&AxsA6Xmh!sc+~iy zQ0y!yEEqD}QD+Q=X@~s|@HV#p;WwMg=PtG#I2`1bYv<0Z-+jRE@zAw%+z#Qp;J2Ec z`;{|ixus%TR#wrtSpk!gp~k5(i!A&v67o|0f0VUGNU4gn{Fcn8K^DJdqV4!CfL((| zS2ldOJ1@^unqNF>Y;BnU2Y85rZ4CCk(a!A?62=TE{FY%AkG)?8D=er_L_FwLVbl`G z^Fh%!>ve0_`-J6H8amRY ztBm)T=y$_!;gfwWt!49;S$6NViMaaZ%geWH_xrptyOc1&YVrhEFcX%Z2i`(YrpXud zCla(OTiTON@ezfyq)7mG|S{swtpq5KzIWCkhPA< z>+?cNxfmkrEGpT0Hkf?y+)F4tkXyee81^?GJ5w-es#`7!NTfxx=T&~Y8~5k}@Sn#Q zA2rY!h=*PG%Fr%F0$2ltnLxXf3PcGc0#UTS;q3U)ssjgoB7WQcBfKfoTFhp+?(*X^ zBSGw|?nsaxB-d$TpA*`pa+0Menz@7`-Vjz4<8){?Z#+AHkw+q7c;!VS$7pj-qjkLx zs?QrCC>nqs=JT@85>0tN`ZmHU#p~&AT`}ly;bnZ@Hm&-^gsCmrIgD6Rvw7>`w4<3~43#PI3ZYsi^^RKmBC6I5f4naRFK-a@N_?Y7yKx`J*A zT?LJ`BjMK5XUiu|vh(>qfq*x6nQFtjV89*pV;_K4gGmxQ6><6O*zN%HI2VN5@!P~- zai17!EJEf!7#@D8D{N4lrpVVNB-7kfI$>Pp{=I&&#BurzfBH;Qh0GUlwL4oj9CCZy z8Jt*g_;|3K;n>^TRTOrKfRCI=8%g|?2|`i4PzD^Q9*<_nw$ddl+(Ho}kQ7arraPMx z_W2@E!eG=xfdVE!s7x|mkjKU)4Dc|KFx)&|mj~(z+6z5y{PeG+A!r++bbE-GcNANP zeGk+&aO|AvQ=3j44-3nxw|#qj$#S=?IYeqWNa{ZvKZi8j{#;0QN(|Br_dsRR%8B)v zNUV!uHHHFICOU13#D>6wgTpEJgqc7z;Ngy*Sh;(bS1h-c6c&!3ZZ0WjfOv z%JodZh0O)6i7OU-rZ+BnK~(Pq+~UQH#Vfx7ka3AbqNy`Xdv-&yp@U+lCAJ*Y(YxKe)*kk0kHT`MnHS=9 z$(BNO0W@?JL0Eg_3~$aXmq6$i3KVNM zNars=eQ&^v-g9B}R)ZGw2hrC)6u?(MaYQmQJ!1nb|4P90>?YmOm8o z1MP`0FixXEr)2d?>B?15hOk`0ojI@S+wBp*-x~#VX2`q~qAWeY>Q@m~2H64`K2YJ| zID#eaiO)f?SvW*2MiT86>sn0ED3O#;n$nt^*`b}=B zFf0%o4<6=^n-TQbfKA1midg)%yJcV}Hos*{V$U58b9trX#xxg~1mt3Gb}n!1#7e20 zj+7u-Z$`;3Nn)YVF|pgLE9HzPT_$6WoJ^CYc-(}VBgdduGXieI`iOJVH8Z=Bntlt^hC49Kz$(96D0CaH+kdBq9a+N5cG`A^I*hlDDhRc#W`;E&11IOr=KZf$&?RYUn5<0)FYRVQmF@&?~%o zc>p+-<@o?hDc^$JwfzUCq;P%sX8{0=A4GNG24s$}WJ8cDU`kL?47QAG^Q7N?*{dmRF0EK~x+q3DtLYitKU z$kd+5%AGaKTUHVh@fuGa-#%u%v$lrzIW}I=IG^nKot=_PjP%vT_UDbTbYd5xzYRuw zOQj(N%rGTg)Fw^ZR13u^!$)!J6H zU{&?rJ$8xECla^h6%-7c0Bb0qA4GFYHr1e(kjn&Uc_QtUR}2g8A|0+LOTy;2)a;2w zQGh=IR|!|2JSChy)hQHur9yjAk!1R;hQhP>t4M&o%YY+`_2fuL9aOuyrjy!;k*nCg z5=Bue!hx!aQs_c?`5~FyE0tOg>@S}&lX3Z|pIt)x6bhfi96EF^{cWNQ?1cOlz{c-Z zuHUL&yxh($_rR(rKR0K@7>llw?&c7XiIPYZUDDsC^v{%(C?pe27L0zNO|H!wJIYpC z6qKtS0-k2oD)ri}LAMi281*OG*B?n@S4Wj*B(A^hv=W$juRz3(BwLDZ{P}`TSQ(Zq zSy#7tBY=!oEUG_wGJnW$yV*qMKH3e){sLKg#C7rv`*Ub3v-xeuV$gX9c{uTIp!-uH zmJhW)_pET@1ZNo!^$Dfr;@NX6jvWV@lJcC)K?tMg(%;f*XWu{@n$8N2hH79SmXjx3 z5{X+XwH!QBJZ_TT(j16S8-X*~ zSh&bm&JD;E5t*WX=eL4+b7&M1x-g_)8ca{>5>46J08hhjV+Q>AC%_oDQkgS-t}!de zCFBMbB7a$V{-`k(QUODvRm3avBG@Oe`E4X-r9k$ga7QjIS+z#Kd^L1wsEROOpjol} z#JbJVxYbai(k`NXLfl(9_6{sWQF;EDajoU$K9Mjg=C|b*9GW=EUs;7*GVagIu>5(M z&h|&nyROJ~SlAG>E2mD^?%ErW$eGh|MqfRyKXK$cHy1;K~p2=vR;3I}2 zeui#iq8SMjh^meqJUL^!Pa+GcR3VYHZqF{+%vmn81(zwT3eP-hA{qC~qAZ+YmyJ|) zkQfNoo}4n%dNK>j04uLR39n%IC_Rr0x5QRwNbTA!%-g@69zDRMxqDG(HmkqY7vLHElDzwPdR8RH4^ zr%#t}`IeMH?hy!!=grsb-$B_I?GK4{Q-;p}-?C2#Mg5w!tL00VyM-dZR2i1ajr)%X zX3PlLTWLonn1HqC37mu9Qk`~&ds6sqC>F2_yLzicdV1=7YhHmK^v$(B?Ho!QX(A^^()5hbA zSp1egGaT31;vj8r#FZ!y)qI8+>b@K2w^4#o;ZVt(#hUeNd{VhrDE3LD)!TMJUuAr$ zkaE!g(m*Z0?Gs29kr^|})aT}wO`YcAmI5L1DC9O?Id}9#E4Q5777WGtE!DxM)Nr&T zzm4~bWQSq#hqU}Q=q(*J+PHU5P$~;aRj?LTty(7iW(7l#CmgGJ92&mh#mC!=z;6w$ zWs@iC_wOgmC20uw%*o?|aT82N1Le1gFTLpeHWZr>!y?9AbtWr+_CkLd&m-msB>bpU zs+qs&?14R`Q81ox^a3!X-3{sZZIE$VtVf28a-YnKNMvrYG$0Td_V3;@cB;qiV&Wba zOq^R@G=3YUc+13`cHOSJO*<-9l<5DCR}jCKyQ?~;@j_dqTlzm3M0FmV~hO%7XIYu@Pbreg=)Vm{1(QL)f?^w{=squs4- z>H1Z=M(;Ymjl?EFZzE~=Ex8BHNGf*hEnT|SQ_gdXg#n2$s8m+1S}Rz+ zo^hjPT^PN7alFL*fG(Kd#`X#c(uN4Xg&Jy7>&^}v?=LFxOJ#1M7`l`B_@U!peC=qm z5I=Ehix?##XajNYuuzKZF25!HIUI|B2oJT}Mc=Hi-LTOolK|cVlW}wT!r60l2aZP2 zdMG)LE}4HB602$+w`k~aUtwWHBKJxZcA?00F7RKYq*3k{fXU0`P`{fjpc$+oZr%&CTQ{V=C`pCO89MjeT%KZbi5`WGb7Z~A) zFDm?cn3Kzk!ek+lGGbY{T)>+$MSA*3fUrTb|BA))_}!VeK0Dv?ggNaAp8e zwCW)ds#{t#3l>yu-3}{gn6rXX3GO@|J9&2QEKfs?JM3fVl0RY@9-=VIlThqYcffbC_$^ZRnA=~F z@p;|G`l6XLnvNU`3uG|BgA#s7B&pxDS-gCax7A7~KB}>#Bq$NWTAnE`%Kv&ui(ElQ3@(bv4p9{K{NYf1_cD@9G@evALgObS;$C*F zD|(J9C5kbB3gRith~*`d#*Ci6c3>cC~nsahaOquAats+GY`5A(`#1fct ziOxG-`uGWKybVXaXnheT_JJ6*9qQ53n4f=e%CxXp9Fj@N=n%9O6`dMCuBoViAw-dQ zRp1~)S`|rsb;>?bDDE55X*toVExy}DbS(I3OwjGOSjuM1HXl6h6^dY-M&!r`8n*8i z&z~1*vr>j0rH!7^K7nDyyGWh;*liSu?JGtT{R+P{>e_#lKW>Vnoa>h=f$B3-HB(fc zJ9Jc|Oiq+?Vfq#%dq~+#POC!D2?H5G-hgIJ)2!V zVS=l?9M(z^i6kJCLpAExtcHm!gm~+T(Yi<&oj6hlIQtl4hBbbZ*V!x--7Co0B(U$t zJ&`a`gV>ve6DKw9I_?#V7zs>UB9}yB&dDtuJISrrGGT8h=wWCiC=z8f9tAqCA#d*n zNR+Fc%s4Sg`7IhAM?w^DBh*IDU$JX<*_?UE=!Bw(KpGKBq9Unq`t16H2V%a85oE?_ zgN+SAXjp{BZ)xRs6K}~n2xm0J+fcv_%Z&-6EXPlJVC5*0`lLd@Tf?56!r3#tt#;

S{Sz>){>HYyc!M~?@q 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 Date: Thu, 3 Apr 2025 09:59:49 +0200 Subject: [PATCH 5/6] final --- ch1.tex | 43 +++++++++++++++++++++++++++++++++++++------ refs.bib | 22 ++++++++++++++++++++++ thesis.tex | 2 ++ 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/ch1.tex b/ch1.tex index 59d31b7..c2201a6 100644 --- a/ch1.tex +++ b/ch1.tex @@ -8,7 +8,7 @@ Z pohledu hráče nejsou faktory jako pracovní podmínky vývojářů nebo kont Jelikož je zábava vysoce subjektivním konceptem, neexistuje univerzální model hry, který by vyhovoval všem uživatelům. Herní design proto využívá analytických metod, jako jsou uživatelské testování, behaviorální analýza a iterativní vývoj, aby maximalizoval pozitivní odezvu v cílové skupině hráčů. \section{Průběh vývoje} -Pro nikoho snad není překvapivé, že pro vznik díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohužel hry už z většinou odvětví nesdílí aspekt, při kterém funkčnost myšlenky lze ověřit již na začátku produkce. A je to ještě horší, protože to můžeme většinou zjistit jen až u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečíst v knize ,,Blood, Sweat, and Pixels'' od Schreiera Jasona\footnote{Schreier, Jason. Blood, Sweat, and Pixels. HyperCollins US 2017. ISBN 97-800-6265-1235} o hře Uncharted 4. Celkově autor převypráví deset rozhovorů s vývojáři her různých žánrů a velikostí, které mohou začínající/ho vývojařku/e navest co je možné očekávat před, při a po vývoji. Hlavní myšlenkou ale je ukázat jak vývoj každý hry je unikátní příběh, který nemá pravidla. +Pro nikoho snad není překvapivé, že pro vznik díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohužel hry už z většinou odvětví nesdílí aspekt, při kterém funkčnost myšlenky lze ověřit již na začátku produkce. A je to ještě horší, protože to můžeme většinou zjistit jen až u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečíst v knize \textit{Blood, Sweat, and Pixels} \cite{schreier2017blood} o hře Uncharted 4. Autor převypráví rozhovory s vývojáři her různých žánrů a velikostí, které znázorňují unikátní a zároveň společné překážky/problémy v oboru vývoje videoher. \subsection{Design dokument} Nedílnou součástí vývoje hry je iterace nápadů a celkový popis prostředí a způsobů produkce. To vše v sobě zahrnuje Design dokument. Ten může mít docela různou podobu, jelikož jeho hlavním cílem je uchovat potřebné nápady na rychlém a přehledném místě. Souhrn těchto nápadů, jejích propracovanost a to jak dobře fungují spolu, potom tvoří celou hru i výslednou zábavu. Proto dobré písemné zpracování pomůže předat myšlenky designéra a jejich aktuální verzi celému týmu vývojářů. @@ -24,10 +24,9 @@ Samotná tvorba příběhů je poněkud podobná tvorbě knižní nebo kinematog \begin{figure} \centering \includegraphics[width=.6\linewidth]{img/pacing.pdf} -\caption{Ukázkový graf představující distribuci klíčových momentů a cesty k ním.\protect\footnotemark} +\caption{Ukázkový graf představující distribuci klíčových momentů a cesty k ním. Převzato z článku \protect\textit{Gameplay Fundamentals Revisited: Harnessed Pacing \& Intensity} \protect\cite{pacingIntensity}.} \label{fig:pacing} \end{figure} -\footnotetext{\url{https://www.gamedeveloper.com/design/gameplay-fundamentals-revisited-harnessed-pacing-intensity}} \section{Žánr, mechaniky, reference, platforma} Důležité je také rozmyslet si vhodné umělecké a technické aspekty hry. Některé herní žánry musí hra obsahovat a některé budou překážet zážitku. Stejně je to i s mechanikami. Například nebude moc zábavné hrát hlavní mechaniku farmářství, pokud cílový žánr hry je horor. Správná volba žánru a mechanik je tedy klíčová pro vytvoření konzistentního a poutavého herního zážitku. @@ -55,7 +54,7 @@ Tato práce je zamyšlená jako 3D příběhová hra s více žánry a s možnos \paragraph{Unity\protect\footnote{https://unity.com/}}je nejspíš stale nejpopulárnější volbou v roce vzniku této práce. Lze na něm vytvořit hru libovolného žánru a rozsahu. Má rozhodně největší komunitu a rozsahle návody, jednodušší programovací jazyk C\# a skriptování herních objektů. Zároveň již obsahuje zmíněnou v požadavku možnost načtení obsahu. -Má ale své problémy, které ohleduplný vývojář procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje psaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C\#. Navíc grafika často vyžaduje psaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginu. Následovně i samotný C\# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst online ~\cite{unityComparing}. +Má ale své problémy, které ohleduplný vývojář procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje psaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C\#. Navíc grafika často vyžaduje psaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginu. Následovně i samotný C\# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst online \cite{unityComparing}. V roce 2019 kdy hra přiložena k této práci vzníkalá, byl také problém s paralelizací hlavního cyklu samotného enginu a rendrovacích úloh. V celku Unity tehdy ještě nebyl tak robustní a nenabízel tolik vývojářských možností/oprav. V den vydání této práce, je rozhodně nejlepší volbou nejen pro jednotlivce a malé týmy. @@ -135,16 +134,48 @@ Hlavní problém s hudbou je synchronizace linek. Hudba hodně netoleruje jakék \begin{figure} \centering \includegraphics[width=.6\linewidth]{img/musicLinking.pdf} -\caption{Diagram znázorňující desynchronizaci hudebních linek kvůli závislosti spouštění funkcí na snímkové frekvenci hry.} +\caption{Diagram znázorňující desynchronizaci hudebních linek kvůli závislosti spouštění na snímkové frekvenci hry.} \label{fig:musicLinking} \end{figure} -\paragraph{FMOD\protect\footnote{https://www.fmod.com/}} ... TODO +\paragraph{FMOD\protect\footnote{https://www.fmod.com/}}je middleware audio engine pro hry poskytující velice silné rozhraní pro práci se zvuky nebo jejich manipulací. Nejčastějí se k němu přiklání pro tvorbu dynamických hudebních doprovodů, což vyplňuje hudební mezeru v Unreal Engine. Je to nejpopulárnější řešení, které se používa od indie po AAA hry. Taktéž v populárních enginech má integrovanou podporu nebo poskytuje engine v podobě samostaného procesu, který potom může komunikovat s procesem hry. FMOD také poskytuje editor zvukových stop a s nimi spojených eventů, pro jednoduché ovládání audia přímo ve hře. \subsection{Načítání obsahu} +Integrace nového obsahu do hry za běhu obnáší ošetření spousty technických problémů. Nejzávažnější z ních jsou načténí nového obsahu a jeho kompatibilita. Tyto dvě věci ani nejde ošetřit bez značných omezení a proto jsou ponechány na vývojářech. +\paragraph{Načtení}i těch menších assetů může značně pozastavit hru v načítání. Proto je potřeba načítání nového obsahu provést hned při načtení celé hry, nebo zapracovat nad vhodným malým streamingem dat, který nezpůsobí velkou zátěž na hardware. + +\paragraph{Kompatibilita}nového a starého kódu je něco co může zhavarovat celou aplikaci. Naštěstí Unreal Engine řeší havarijní stavy a hra poběží dál, ale potřebné nám assety se již nenačtou. Nejvíc tento problém se projevuje s klasickým kódem v C++, kde výsledný strojový kód očekáva nějakou proměnnu nebo funkci v přesně daném místě paměti. O něco lepší je to se vším ostatním, protože vše je propojeno a voláno ralativními resp. globálními cesty a názvy. Tak například funkce v blueprintech jsou vždy voláné pomoci názvů funkcí v řetězcové podobě. Stejně tak proměnné jsou uložené ve slovníku variantů. Takové využití víceúrovňové reflexe, umožňuje ošetřit libovolný problém s kompatibilitou a zaručit bezpečný běh za cenu trochu většího zatížení prostředků. Navíc stejnou reflexi v C++ lze jednoduše udělat pomoci maker, které Unreal Engine poskytuje. Ovšem ošetření kompatibility není součástí této práce. \subsection{Umělá intelegence} +Nehratelné postavy resp. NPC jsou součastí většíny her, protože pomáhají vyprávět příběh nebo obohatit/oživit prostředí. NPC jako každý herní prvek lze napevno navrhnout a naprogramovat všechny potřebné varianty vzhledů a použití. Ale z dizajnových a časových důvodů ve většíně případu chceme, aby NPC byli více univerzální . Chceme aby mohli samostatně v prostředí orientovat, chodit a občas dokonce, aby NPC reagovali a ovlivňovali prostředi. +\paragraph{Behavior tree}resp. strom pravidel je nejčastěji způsob kódování chování NPC. Takový strom umožňuje efektivní rozhodování a řízení chování umělé inteligence. Hlavní výhodou oproti jiným přístupům, jako například konečné automaty nebo plánování, je modularita, škálovatelnost, snadná údržba a současně přehlednost. Samozřejmě má i nevýhody mezi které zejména patří optimalizace a náročný návrh složitých viceúrovňových chování. + +NPC začíná rozhodování v kořenu stromu od kterého postupuje k vrcholům s pravidly. Listy jsou vždy akční úzly a jak napovídá název, úrčují akci, kterou objekt provede. Cestu od kořene k listům vytvárí řídicí vrcholy, každý z kterých určuje pořadí a podmínky přechodu na podřízené vrcholy. Nejčastějí používáné jsou: +\begin{itemize} +\item sekvenční resp. Sequence, který cyklicky spouští své podřízené vrcholy postupně, dokud některý nevrátí přerušení, +\item selektor resp. Selector, vybírá první podřízený vrchol, který v zadaném pořádí má pozitivně zhodnocené pravidlo, +\item paralelní resp. Parallel, který spouští podřízený vrcholy současně, +\item a podmínkové vrcholy, které rozhodují, zda pokračovat v dané větvi nebo se vrátit ke kořenu. +\end{itemize} \section{Umělá intelegence pro tvorbu obsahu} +Celé toto téma je technicky a odborně velice zkrácené s ohledem na rozsah bakalářky. Taky tak jednotlivé modely a práce s nimi nejsou součastí této práce. Táto práce zakláda pouze potřebný koncept pro integraci umělé inteligence. + +V současné době díky výkonostním pokrokum se rozšířují hranice použitelností uměle intelegence a to zejmena velké jazykové modely neboli LLM. LLM ukazují skvělé výsledky v generování obsahu různeho charakteru v poměru lidského času a ceny. Nejlepší výsledky jsou zatím v textových nebo grafických modelech. + +Již dnes se objevují hry, které integrují dánou technologii. NPC tak umí poměrně realisticky a nekonečně držet konverzaci s hráčem v textové a dokonce i hlasové podobě. Textury a sprity jsou na pohled snad nekonečné, a k tvorbě nevyžadují umělecký cit nebo znalostí. Vývojáři můžou poměrně rychle vygenerovat jednoduchý kód nebo velké konfigurační soubory a struktury. + +\paragraph{Udržení kontextu}je největší problém této technologie. Nejvíc se to projevuje při generování videí, kde je zřetelný jak umělý model má potíže udržet konstantní/konkretní obsah nebo myšlenku jednotlivých scén a nasledovně i vzhled vizuálních objektů. LLM z každou další iteraci má poměrně vysokou šanci změnit směr ,,myšlenky''. A to proto, že LLM nemyslí, LLM je pouze konvoluce velkého množství pravděpodobnostní. Tak například LLM nevytváří logicky souvislý text ale pouze predikuje další pravděpodobnostně nejvhodnější sekvence textu na základě trenovaných dat. + +Proto zásadní chybou je použití LLM k úplné tvorbě nového obsahu. A spravně je používat LLM pouze jako nástroj buď pro tvorbu počáteční verze obsahu nebo vedlejší obohacení již existujicího díla. Pravě s touto myšlenkou byl doprovázen vzník této práce, déky niž bude možné otestovat jak dobře LLM bude obohacovat již hotovou počítačovou hru. + +\paragraph{Halucinace}jsou další významnou slabinou LLM. Jedná se o situace, kdy model generuje nesprávné, zavádějící nebo zcela smyšlené informace. V kontextu počítačových her tak může docházet například k halucinacím při generování herních dialogů, questů nebo vizuálních prvků, kde model vymýšlí neexistující herní mechaniky, postavy či události, které nepatří do hry. Kořen tohoto problému je stejný jak v udržení kontextu, kde navíc se to prohlubuje slabým natrenováním modelu. + +\paragraph{Řešení nejsou dokonalá,}ale mohou výrazně polepšit stav problémů. K dispozici je větší množství metod a některé dokonce proprietární. V teorii se ale většinou jedná o metody: +\begin{itemize} +\item retrieval-augmented generation (RAG), která kombinuje model s databází obsahující ověřené informace, +\item jemné doladění modelu (fine-tuning), které spočívá v dotrenování modelu na specifických datech (na datech naši hry), +\item a omezení generativní volnosti pomocí pravidel a pevně definovaných scénářů, které se zároveň kryjí s kontrolními mechanismy a validaci výstupů. +\end{itemize} \ No newline at end of file diff --git a/refs.bib b/refs.bib index e79d08b..beaca25 100644 --- a/refs.bib +++ b/refs.bib @@ -1,3 +1,20 @@ +@book{schreier2017blood, + title={Blood, Sweat, and Pixels: The Triumphant, Turbulent Stories Behind How Video Games Are Made}, + author={Schreier, J.}, + isbn={9780062651242}, + lccn={2017034583}, + url={https://books.google.cz/books?id=-bK-DQAAQBAJ}, + year={2017}, + publisher={HarperCollins} +} + +@misc{pacingIntensity, + title = {Gameplay Fundamentals Revisited: Harnessed Pacing \& Intensity}, + author = {Mike Lopez}, + year = 2018, + note = {\url{https://www.gamedeveloper.com/design/gameplay-fundamentals-revisited-harnessed-pacing-intensity} [Accessed: (03.2025)]} +} + @misc{unityComparing, title = {Objectively comparing Unity and Unreal Engine}, author = {Sirawat Pitaksarit}, @@ -5,6 +22,11 @@ note = {\url{https://gametorrahod.com/objectively-comparing-unity-and-unreal-engine/} [Accessed: (03.2025)]} } + + + + + @book{knuth1979tex, title={TEX and METAFONT: New directions in typesetting}, author={Knuth, Donald Ervin}, diff --git a/thesis.tex b/thesis.tex index 25bdd3f..38b427e 100644 --- a/thesis.tex +++ b/thesis.tex @@ -110,6 +110,8 @@ \input{macros} % use this file for various custom definitions +% setup urls +\usepackage{xurl} \begin{document} -- 2.45.2 From b2c16e7e92872c9ea2d7d258640b5486d370009a Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Thu, 3 Apr 2025 15:43:56 +0200 Subject: [PATCH 6/6] clean ch1 --- ch1.tex | 153 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 85 insertions(+), 68 deletions(-) diff --git a/ch1.tex b/ch1.tex index c2201a6..ed4bc2e 100644 --- a/ch1.tex +++ b/ch1.tex @@ -1,25 +1,27 @@ \chapter{Zásady tvorby} \label{chap:refs} -Vývoj her je obor, který je často mylně interpretován širokou veřejností. Existuje všeobecná představa o tom, jak by hry měly vypadat, jaké prvky musí či nesmí obsahovat, kdo a jak je má vyvíjet a jaká by měla být jejich cenová politika. Ve skutečnosti však průměrného uživatele zajímá především míra \emph{zábavy} a herní zážitek, který za investovaný čas a finanční prostředky získá. +Vývoj her je obor, který je často mylně interpretován širokou veřejností. Existuje všeobecná představa o tom, jak by hry měly vypadat, jaké prvky musí či nesmí obsahovat, kdo a jak je má vyvíjet a jaká by měla být jejich cenová politika. Ve~skutečnosti však průměrného uživatele zajímá především míra \emph{zábavy} a herní zážitek, který za investovaný čas a finanční prostředky získá. -Z pohledu hráče nejsou faktory jako pracovní podmínky vývojářů nebo kontroverzní herní mechaniky primárními rozhodovacími kritérii. Klíčovým aspektem je optimalizace uživatelského zážitku a zajištění dostatečné interaktivity, plynulosti a engagementu, které přímo ovlivňují retenci a herní ekonomiku. +Z pohledu hráče nejsou faktory jako pracovní podmínky vývojářů nebo kontroverzní herní mechaniky primárními rozhodovacími kritérii. Klíčovým aspektem je~optimalizace uživatelského zážitku a zajištění dostatečné interaktivity, plynulosti a engagementu, které přímo ovlivňují retenci a herní ekonomiku. Jelikož je zábava vysoce subjektivním konceptem, neexistuje univerzální model hry, který by vyhovoval všem uživatelům. Herní design proto využívá analytických metod, jako jsou uživatelské testování, behaviorální analýza a iterativní vývoj, aby maximalizoval pozitivní odezvu v cílové skupině hráčů. \section{Průběh vývoje} -Pro nikoho snad není překvapivé, že pro vznik díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohužel hry už z většinou odvětví nesdílí aspekt, při kterém funkčnost myšlenky lze ověřit již na začátku produkce. A je to ještě horší, protože to můžeme většinou zjistit jen až u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečíst v knize \textit{Blood, Sweat, and Pixels} \cite{schreier2017blood} o hře Uncharted 4. Autor převypráví rozhovory s vývojáři her různých žánrů a velikostí, které znázorňují unikátní a zároveň společné překážky/problémy v oboru vývoje videoher. +Pro nikoho snad není překvapivé, že pro vznik díla je potřeba nějaká myšlenka, která mu předchází. V tomto hry jsou stejný jako každé odvětví. Je potřeba, aby~myšlenka byla funkční/potřebná, a v našem případě zábavná. Bohužel hry už~z~většinou odvětví nesdílí aspekt, při kterém funkčnost myšlenky lze ověřit již~na~začátku produkce. A je to ještě horší, protože to můžeme většinou zjistit pouze u konce. Spousta her proto potom jsou zamítnuté, neviditelné nebo dokonce předělány hned před koncem. O jednom takovém případu -- který skončil šťastně -- doporučuji si přečíst v knize \textit{Blood, Sweat, and Pixels} \cite{schreier2017blood} o hře Uncharted 4. Autor převypráví rozhovory s vývojáři her různých žánrů a velikostí, které znázorňují unikátní a zároveň společné překážky/problémy v oboru vývoje videoher. -\subsection{Design dokument} Nedílnou součástí vývoje hry je iterace nápadů a celkový popis prostředí a způsobů produkce. To vše v sobě zahrnuje Design dokument. Ten může mít docela různou podobu, jelikož jeho hlavním cílem je uchovat potřebné nápady na rychlém a přehledném místě. Souhrn těchto nápadů, jejích propracovanost a to jak dobře fungují spolu, potom tvoří celou hru i výslednou zábavu. Proto dobré písemné zpracování pomůže předat myšlenky designéra a jejich aktuální verzi celému týmu vývojářů. +\subsection{Design dokument} Nedílnou součástí vývoje hry je iterace nápadů a celkový popis prostředí a způsobů produkce. To vše v sobě zahrnuje Design dokument. Ten může mít docela různou podobu, jelikož jeho hlavním cílem je uchovat potřebné nápady na rychlém a~přehledném místě. Souhrn těchto nápadů, jejích propracovanost a to jak dobře fungují spolu, potom tvoří celou hru i výslednou zábavu. Proto dobré písemné zpracování pomůže předat myšlenky designéra a jejich aktuální verzi celému týmu vývojářů. -V dizajn dokumentu hry, která je nedílnou součástí této práce, jsou popsany nápady dost kratce až abstraktně. To bylo způsobeno tím, že nad hrou pracoval pouze jeden člověk. V reálném týmu by takový dokument byl ukázkovým příkladem těch špatných, i přesto že obsahuje všechny potřebné náležitostí. +V dizajn dokumentu hry, která je nedílnou součástí této práce, jsou popsany nápady dost kratce až abstraktně. To bylo způsobeno tím, že nad hrou pracoval pouze jeden člověk. V reálném týmu by takový dokument byl ukázkovým příkladem těch špatných i přesto, že obsahuje všechny potřebné náležitostí. \section{Téma, motivy, příběh, cíl} -Hra by měla poskytovat nějakou \emph{myšlenku} relativní pro hráče, aby ten si hru zahral. Počáteční myšlenku vždy vytváří a rozvíjí vývojář. Ta následovně může být ponechána i na konci vývoje, nebo být co nejvíc změněná samotnou hrou, její mechanikami a kreativním provedením. Krásný případ je známa desková hra ,,Landlord's Game'' od Lizzie Magie později známá jako ,,Monopoly''. Paní Magiová chtěla vytvořit hru s myšlenkou představit hrůzy kapitalismu a monopolí, poskytnutím hráčům zkušenost, kde jeden jedinec neustale a nevyhnutelně bohatne zatímco zbytek stejně tak neustale a nevyhnutelně chudne. Bohužel hráči moc tuhle myšlenku nepochitili. Místo vystrašení z kapitalismu, ti naopak rádi zažíval hazard a možnost ekonomicky zkrachovat soupeře. +Hra by měla poskytovat nějakou \emph{myšlenku} relativní pro hráče, aby ten si hru zahral. Počáteční myšlenku vždy vytváří a rozvíjí vývojář. Ta následovně může být ponechána i na konci vývoje, nebo být co nejvíc změněná samotnou hrou, její mechanikami a kreativním provedením. Krásný případ je známa desková hra ,,Landlord's Game'' od Lizzie Magie později známá jako ,,Monopoly''. Paní Magiová chtěla vytvořit hru s myšlenkou představit hrůzy kapitalismu a monopolí, poskytnutím hráčům zkušenosti, kde jeden jedinec neustale a nevyhnutelně bohatne zatímco zbytek stejně tak neustale a nevyhnutelně chudne. Bohužel hráči moc tuhle myšlenku nepochitili. Místo vystrašení z kapitalismu, ti naopak rádi zažíval hazard a možnost ekonomicky zkrachovat soupeře. -Způsobů jak předat myšlenku hráči je nespočetně mnoho. Pro účely této práce proto probereme poskytování myšlenky v příběhových hrach. Ty by měli mít v kostře nějaké hlavní téma, které se následovně obohacuje příběhy okolo. Je velmi důležité, aby okolní příběhy měli \emph{motivy}, aby následovně i hráč měl motiv je prožít. Dokonce hráč nemusí vědět motivy až ke konci hry, stačí aby byla cítit smysluplná návaznost a pocit možné odměny. Proto za umění je považováno i velkolepé předstírání existence motivů, které donutí hráče \emph{stravit ve hře co největší množství času}. +Způsobů jak předat myšlenku hráči je nespočetně mnoho. Pro účely této práce proto probereme poskytování myšlenky v příběhových hrach. Ty by měli mít v kostře nějaké hlavní téma, které se následovně obohacuje příběhy okolo. Je~velmi důležité, aby okolní příběhy měli \emph{motivy}, aby následovně i hráč měl motiv je prožít. Dokonce hráč nemusí vědět motivy až ke konci hry, stačí aby byla cítit smysluplná návaznost a pocit možné odměny. Proto za umění je považováno i~velkolepé předstírání existence motivů, které donutí hráče \emph{stravit ve hře co největší množství času}. Samotná tvorba příběhů je poněkud podobná tvorbě knižní nebo kinematografické. Jen je zapotřebí oživovat a propojovat nejen postavy a svět, ale i herní mechaniky s ohledem na jejich zábavu, složitost a technická omezení. + +\newpage \paragraph{Cíle a jejich distribuce}pomáhají udržet hráče. \Cref{fig:pacing} znázorňuje ukázkový příklad pěkné distribuce klíčových momentů. Co přesně jsou klíčové momenty je na vývojáři. Mohou to být důležité momenty v příběhu, vylepšení postavy hráče, představení nové důležité mechaniky atd.. Důležité je nechat hráče v každém okamžiku procítit jeho úspěchy na začátku tohoto momentu nebo jeho konci. Je to dost abstraktní, ale přesto fungující způsob jak udržet pozornost hráče a poskytnout mu zábavu. \begin{figure} \centering @@ -29,108 +31,123 @@ Samotná tvorba příběhů je poněkud podobná tvorbě knižní nebo kinematog \end{figure} \section{Žánr, mechaniky, reference, platforma} -Důležité je také rozmyslet si vhodné umělecké a technické aspekty hry. Některé herní žánry musí hra obsahovat a některé budou překážet zážitku. Stejně je to i s mechanikami. Například nebude moc zábavné hrát hlavní mechaniku farmářství, pokud cílový žánr hry je horor. Správná volba žánru a mechanik je tedy klíčová pro vytvoření konzistentního a poutavého herního zážitku. +Důležité je také rozmyslet si vhodné umělecké a technické aspekty hry. Některé herní žánry musí hra obsahovat a některé budou překážet zážitku. Podobné je to i~s~mechanikami. Například nebude moc zábavné hrát hlavní mechaniku farmářství, pokud cílový žánr hry je horor. Správná volba žánru a mechanik je tedy klíčová pro vytvoření konzistentního a poutavého herního zážitku. \paragraph{Žánr}hry určuje její základní atmosféru, pravidla a často i cílovou skupinu hráčů. Většinou se dnes setkáváme s hybridními žánry. Které dokážou poskytnout hráči více obsahu a tím pádem i možné zábavy. -Při výběru žánru je důležité vzít v úvahu preferované herní mechaniky a jejich složitost. Například hra zaměřená na rychlou a dynamickou akci bude pravděpodobně obsahovat prvky střílečky nebo bojové hry, zatímco narativně založená hra může využívat prvky adventury či RPG. +\newpage +Při výběru žánru je důležité vzít v úvahu preferované herní mechaniky a~jejich složitost. Například hra zaměřená na rychlou a dynamickou akci bude pravděpodobně obsahovat prvky střílečky nebo bojové hry, zatímco narativně založená hra může využívat prvky adventury či RPG. -\paragraph{Herní mechaniky}jsou základní interaktivní prvky, které hráč využívá k postupu ve hře. Dobrý design mechanik zajistí, že hra bude plynulá, intuitivní a zábavná. +\paragraph{Herní mechaniky}jsou základní interaktivní prvky, které hráč využívá k~postupu ve hře. Dobrý design mechanik zajistí, že hra bude plynulá, intuitivní a~zábavná. -Při jejich návrhu je třeba zvážit: jak mechaniky podporují zvolený žánr, jak se budou vyvíjet v průběhu hry a jak se kombinují s ostatními prvky hry. Například v hororové hře bude dobře fungovat správa omezených zdrojů pro zvětšení napětí, zatímco ve strategické hře budou klíčové rozhodovací prvky a řízení ekonomiky. +Při jejich návrhu je třeba zvážit: jak mechaniky podporují zvolený žánr, jak se~budou vyvíjet v průběhu hry a jak se kombinují s ostatními prvky hry. Například v hororové hře bude dobře fungovat správa omezených zdrojů pro zvětšení napětí, zatímco ve strategické hře budou klíčové rozhodovací prvky a řízení ekonomiky. \paragraph{Platforma}ovlivňuje technické aspekty vývoje i celkový dosah hry mezi hráči. Každá platforma má své specifické a občas i náročné požadavky. Za to ale odmění hráče vhodnějším ovládáním nebo unikátním vizuálním zážitkem. Při výběru platformy je nutné zvážit: technická omezení a očekávání hráčů na dané platformě. Například mobilní hry často využívají dotykové ovládání a krátké herní smyčky, zatímco hry pro PC a konzole mohou nabídnout komplexnější mechaniky a delší herní dobu. -\paragraph{Kopírování}cizích a vlastních nápadů je nedílnou součástí úspěšného vývoje. Hodně se vyplatí mít přehled ve vybraném žánru a mechanikách. Není nic špatného učit se na chybách a úspěších jiných her. Důležité ale je si pamatovat, že neexistuje deterministický vzorec, jak vytvořit dokonalou kombinaci příběhů, žánrů a mechanik tak, aby hra vyhrála všechny ceny. +\paragraph{Kopírování}cizích a vlastních nápadů je nedílnou součástí úspěšného vývoje. Hodně se vyplatí mít přehled ve vybraném žánru a mechanikách. Není nic špatného učit se na chybách a úspěších jiných her. Důležité ale je si pamatovat, že~neexistuje deterministický vzorec, jak vytvořit dokonalou kombinaci příběhů, žánrů a mechanik tak, aby hra vyhrála všechny ceny. -\paragraph{Minihry}jsou skvělou metodou, jak rozptýlit hráče od monotonie herního cyklu. Přitom je lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k relaxaci mezi náročnějšími segmenty hry. Důležité je, aby jejich design byl v souladu s celkovým stylem hry a nepůsobil rušivě. Například rytmická minihra ve fantasy RPG může být zajímavým doplňkem, ale v realistické hororové hře by působila nepatřičně. +\paragraph{Minihry}jsou skvělou metodou, jak rozptýlit hráče od monotonie herního cyklu. Přitom je lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k relaxaci mezi náročnějšími segmenty hry. Důležité je, aby jejich design byl v souladu s celkovým stylem hry a nepůsobil rušivě. Například rytmická minihra ve fantasy RPG může být zajímavým doplňkem, ale v realistické hororové hře by~působila nepatřičně. \section{Engine} Když už je rozhodnuto jak bude vypadat hra, je zapotřebí vybrat vhodné prostředí pro její tvorbu. Vývojář může vytvořit vlastní engine, ale dnes to většinou přináší pouze zbytečné komplikace. Proto se na trhu často objevují hotová řešení, která pokrývají většinu potřeb. -Tato práce je zamyšlená jako 3D příběhová hra s více žánry a s možností dynamického načítaní nového obsahu za běhu. A pro tyto účely se nabízí 4 hlavní enginy na trhu, ze kterých se v minulosti vybral Unreal Engine. Taky proto celá tato sekce s rozborem technologií enginů bude popisovat technologie dostupné právě v Unreal Engine. +Tato práce je zamyšlená jako 3D příběhová hra s více žánry a s možností dynamického načítaní nového obsahu za běhu. Pro tyto účely se nabízí 4 hlavní enginy na trhu, ze kterých se v minulosti vybral Unreal Engine. Taky proto celá tato sekce s rozborem technologií enginů bude popisovat technologie dostupné právě v Unreal Engine. -\paragraph{Unity\protect\footnote{https://unity.com/}}je nejspíš stale nejpopulárnější volbou v roce vzniku této práce. Lze na něm vytvořit hru libovolného žánru a rozsahu. Má rozhodně největší komunitu a rozsahle návody, jednodušší programovací jazyk C\# a skriptování herních objektů. Zároveň již obsahuje zmíněnou v požadavku možnost načtení obsahu. +\paragraph{Unity\protect\footnote{https://unity.com/}}je nejspíš stale nejpopulárnější volbou v roce vzniku této práce. Lze na~něm vytvořit hru libovolného žánru a rozsahu. Má rozhodně největší komunitu a rozsahle návody, jednodušší programovací jazyk C\# a skriptování herních objektů. Zároveň již obsahuje zmíněnou v požadavku možnost načtení obsahu. -Má ale své problémy, které ohleduplný vývojář procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje psaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C\#. Navíc grafika často vyžaduje psaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginu. Následovně i samotný C\# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst online \cite{unityComparing}. +Má ale své problémy, které ohleduplný vývojář procití už v polovině vývoje. Tvorba dobré grafiky často vyžaduje psaní vlastních HLSL shaderů, což moc nekoreluje s jednoduchostí C\#. Navíc grafika často vyžaduje psaní vlastních optimalizačních algoritmů nebo manuální adaptaci cizích pluginů. Následovně i samotný C\# vytváří komplikace s rychlostí běhu programu, obsahem zabrané paměti a garbage collectoru. Všechny tyto problémy lze částečně opravit a vylepšit, jen je potřeba hromada těžších znalostí navíc. Lze o tom přečíst online \cite{unityComparing}. V roce 2019 kdy hra přiložena k této práci vzníkalá, byl také problém s paralelizací hlavního cyklu samotného enginu a rendrovacích úloh. V celku Unity tehdy ještě nebyl tak robustní a nenabízel tolik vývojářských možností/oprav. V den vydání této práce, je rozhodně nejlepší volbou nejen pro jednotlivce a malé týmy. -\paragraph{Godot\protect\footnote{https://godotengine.org/}}je velmi dikutovaná novinka, která se celkem dobře rozšiřuje. Hlavní výhoda je jeho drobnost a že je úplně zdarma za všech okolností. Má podobné problémy jako Unity a někdy ještě horší. Je ale vskutku ohromující, co vše může nabídnout. I když většinu nabízených technologií vývojář potřebuje přepsat vlastní rukou, jelikož často nefungují jak je zapotřebí. V dobu vzniku hry přiložené k práci, Godot byl ještě příliš nový a nevypadál nijak perspektivně. V den vydání této práce, je solidní konkurent v některých herních žánrech. +\paragraph{Godot\protect\footnote{https://godotengine.org/}}je velmi diskutovaná novinka, která se celkem dobře šíří trhem. Hlavní výhoda je jeho drobnost a že je úplně zdarma za všech okolností. Má podobné problémy jako Unity a někdy ještě horší. Je ale vskutku ohromující, co vše může nabídnout. I když většinu nabízených technologií vývojář potřebuje přepsat vlastní rukou, jelikož často nefungují jak je zapotřebí. V dobu vzniku hry přiložené k práci, Godot byl ještě příliš nový a nevypadál nijak perspektivně. V den vydání této práce, je solidní konkurent v některých herních žánrech. -\paragraph{Unreal Engine\protect\footnote{https://www.unrealengine.com/}}verze 4 byl kdysi zvolen enginem pro hru, z které potom vznikla tato práce. Jeho primární výhodou oproti konkurenci jsou vysoce standardizované postupy neboli pipelines, které zlevňují nebo vůbec umožňují tvorby her ve velkých týmech. Celý engine se navíc vychlubuje velkými ,,úspěchy'' v různých technologiích, zejména rendrovacích -- což probereme v další sekci -- a taky odvětvích jako motion design, kinematografie, design architektury a další. +\paragraph{Unreal Engine\protect\footnote{https://www.unrealengine.com/}}verze 4 byl kdysi zvolen enginem pro hru, z které potom vznikla tato práce. Jeho primární výhodou oproti konkurenci jsou vysoce standardizované postupy neboli pipelines, které zlevňují nebo vůbec umožňují tvorby her ve velkých týmech. Celý engine se navíc vychlubuje velkými ,,úspěchy'' v~různých technologiích, zejména rendrovacích -- což probereme v další sekci -- a~taky odvětvích jako motion design, kinematografie, design architektury a další. -Vskutku ohromující když se snažíte vybrat budoucí stavební kámen pro vaši hru. Je ale potřeba brát v úvahu silnou přívětivost enginu k nováčkům, pokud ti chtějí udělat něco vlastního mimo již existující návody. Stejné lze říct o oficiální dokumentaci, která je často a velmi nedostačujicí -- jestli vůbec existuje. Navíc při snaze udělat něco kompletního pomocí nabízených pokročilých technologií, v závěru vývojář musí dané technologie ovládnout na velmi vysoké úrovně a často i modifikovat zdrojový kód. V některých případech technologie jako nanite nebo lumen nejde použit pro dokonalé a odladěné výsledky, proto se prostě zahazují. +Vskutku ohromující když se snažíte vybrat budoucí stavební kámen pro vaši~hru. Je ale potřeba brát v úvahu silnou nepřívětivost enginu k nováčkům, pokud ti chtějí udělat něco vlastního mimo již existující návody. Stejné lze říct o oficiální dokumentaci, která je často a velmi nedostačujicí -- jestli vůbec existuje. Navíc při snaze udělat něco kompletního pomocí nabízených pokročilých technologií, v~závěru vývojář musí dané technologie ovládnout na velmi vysoké úrovně a často i modifikovat zdrojový kód. V některých případech technologie jako nanite nebo lumen nejde použit pro dokonalé a odladěné výsledky, proto se prostě zahazují. -Jestli zapomenout na chybějící dokumentaci, je Unreal Engine stejný engine jako ostatní. Některé technologie má nesrovnatelně lepší a některé horší. Lze najít návody a neoficiální dokumentaci diky velké komunitě. Dokonce samotný engine si dovoluje sebe modifikovat, protože lze dostat přístup ke zdrojovým souborům. Což velké týmy tuto nezávislost s radostí využívají. +Jestli zapomenout na chybějící dokumentaci, je Unreal Engine stejný engine jako ostatní. Některé technologie má nesrovnatelně lepší a některé horší. Lze~najít návody a neoficiální dokumentaci diky velké komunitě. Dokonce samotný engine si dovoluje sebe modifikovat, protože lze zcela zdarma dostat přístup ke~zdrojovým souborům. Což velké týmy tuto nezávislost s radostí využívají. \paragraph{CryEngine\protect\footnote{https://www.cryengine.com/}}je hodně podobný Unreal Enginu za výjimkou toho, že se specialuzuje jen na vývoj her. Taky již není tolik univerzalní, dokumentace je ještě míň, komunita je mizerně malá a přívětivost je snad nejhorší možná. Je to dost úzce specializovaný engine, který potřebuje silné odborníky k jeho ovládání. \subsection{Programovácí jazyk} -Unreal Engine umožňuje programovat pomoci vizuálních bloku tzv. Blueprintů nebo textově v jazyce C++. I při použití pouze jedné z variant lze vivinout celou hru. Veškerý potenciál se ale projevuje při jejich kombinaci. V C++ se skvěle programují komplexní a nízkoúrovňové prvky, když to Blueprinty jsou skvělý pro skriptování úrovní a objektů pomocí high-level bloků. Samozřejmě samotné vizuální bloky lze v C++ vlastnoručně vytvořit. +Unreal Engine umožňuje programovat pomoci vizuálních bloků tzv. Blueprintů nebo textově v jazyce C++. I při použití pouze jedné z variant lze vivinout celou hru. Veškerý potenciál se ale projevuje při jejich kombinaci. V C++ se skvěle programují komplexní a nízkoúrovňové prvky, když to Blueprinty jsou skvělý pro skriptování úrovní a objektů pomocí high-level bloků. Samozřejmě samotné vizuální bloky lze v C++ vlastnoručně vytvořit. Je to vše zároveň velmi obsáhlý aspekt Unreal Engine. Začátečníkovi bude celkem dlouho trvat než začne sám něco vymýšlet. A na první pohled jednoduchý vizuální programování je ve skutečností velmi komplexní už samotnou téměř nekonečnou nabídkou funkcí. \subsection{Grafika} -V rukou máme taktéž širokou nabídku technologií a nástrojů pro tvorbu grafiky nebo začlenění do hry obsahu vytvořeného v jiném softwaru. Je ale potřeba dát si záležet na veškerých nastavení enginu. Těch nastavení je velké množství a rozhodně se budou iterovat během celého vývoje hry. Základní nastavení totiž jsou příliš univerzalní a nekompletní. Přestože i v základu hra snimi vypadá na dostatečné úrovní, při hraní bude stálý pocit nedokončenosti produktu nebo kopírování cizího díla. Většina vývojářů totiž si nedají zaležet, jak jejich hra vypadá kvůli lenosti nebo technické náročnosti tohoto kroku. Proto se většina her cítí jak si podobní a nepříjemný pro hráče. +V rukou máme taktéž širokou nabídku technologií a nástrojů pro tvorbu grafiky nebo začlenění do hry obsahu vytvořeného v jiném softwaru. Je ale potřeba dát~si~záležet na veškerých nastavení enginu. Těch nastavení je velké množství a~rozhodně se budou iterovat během celého vývoje hry. Základní nastavení totiž jsou příliš univerzalní a nekompletní. Přestože i v základu hra snimi vypadá na dostatečné úrovní, při hraní bude stálý pocit nedokončenosti produktu nebo kopírování cizího díla. Většina vývojářů si totiž nedají zaležet, jak jejich hra vypadá kvůli lenosti nebo technické náročnosti tohoto kroku. Proto se většina her cítí jak si podobní a nepříjemný pro hráče. -\subsection*{Materiály} -Materiál je odborné označení souboru dat a funkcí, které reprezentují výsledný vzhled objektu/efektu/světla/postprocesu. Je to de-facto vysokourovňový shader, který i přestože je dost omezený dokáže generovat skvělý a kreativní výstup. Případně lze zdrojový kód materiálů rozšířit na potřebné funkcionality a v případě nouze napsat i vlastní render pipeline, jak to často dělají velký studia nebo nezavislé github projekty. +\subsection*{- Materiály} +Materiál je odborné označení souboru dat a funkcí, které reprezentují výsledný vzhled objektu/efektu/světla/postprocesu. Je to de-facto vysokourovňový shader, který i přestože je dost omezený, dokáže generovat skvělý a kreativní výstup. Případně lze zdrojový kód materiálů rozšířit na potřebné funkcionality a v případě hodně velké nouze napsat i vlastní render pipeline, jak to často dělají velký studia nebo nezavislé github projekty. -\paragraph{Substrate\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-substrate-materials-in-unreal-engine}}je nově vyvíjený systém materiálů, který se primárně chlubí jednochostí vrstvení textur/materiálů a celkového návrhu. Vrstvení textur/materiálů je opravdu pohodlné a podobá se klasickému vrstvení v grafických editorech. Umožňuje to tvorbu hodně komplexních a nádherných povrchů za relativně málo úsilí. Problémem však je zjednodušenost systému s zaměřením na pohodlnost generického grafického umělce. Vytváří to ještě víc omezení pro grafické a technické možností a téměř úplnou nepoužitelnost technických triků. +\paragraph{Substrate\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-substrate-materials-in-unreal-engine}}je nově vyvíjený systém materiálů, který se primárně chlubí jednoduchostí vrstvení textur/materiálů a celkového návrhu. Vrstvení textur/materiálů je opravdu pohodlné a podobá se klasickému vrstvení v grafických editorech. Umožňuje to tvorbu hodně komplexních a nádherných povrchů za relativně málo úsilí. -\paragraph{HLSL shadery}lze v Unreal Engine napsat a aplikovat. Je to ale hodně nezdokumentovaný aspekt a zahrnuje spoustu práce okolo, narozdil od toho jak to je v Unity před verzi 6. +Problémem však je zjednodušenost systému s zaměřením na pohodlnost generického grafického umělce. Vytváří to ještě víc omezení pro grafické a technické možností a téměř úplnou nepoužitelnost technických triků. + +\paragraph{HLSL shadery}lze v Unreal Engine napsat a aplikovat. Je to ale hodně nezdokumentovaný aspekt a zahrnuje spoustu práce okolo, narozdil od toho jak to je v~Unity před verzi 6. \subsection*{- Osvětlení} -Unreal Engine vyniká právě bohatým výběrem možností provedení osvětlení. Lze zde najít různé druhy přímých a nepřímých zdrojů světel a mlhy, technik odrazů a stínů. Všechno lze velmi podrobně nastavit buď pro účely výkonu nebo grafické estetiky. +Unreal Engine vyniká právě bohatým výběrem možností provedení osvětlení. Lze~zde~najít různé druhy přímých a nepřímých zdrojů světel a mlhy, technik odrazů a stínů. Všechno lze velmi podrobně nastavit buď pro účely výkonu nebo grafické estetiky. -\paragraph{Lumen\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-global-illumination-and-reflections-in-unreal-engine}}je zdánlivě revoluce v realtime herním osvětlení. Je to speciální režim osvětlení a odrazů, který umožňuje za běhu počítat dynamické osvětlení bez potřeby vytváření lightmap nebo dotěrného nastavení ploch odrazů. Vytváří velice kvalitní osvětlení za opravdu malo úsili. Nevýhodu, kterou ale již neprezentují, není tolik trochu větší zátěž na hardware, ale šum vyrendrovaného osvětlení a odrazů. Lumen totíž v reálném čase generuje buffer s odrazy a osvětlení ve velice malém rozlišení a to navíc vynacháva nahodně zhruba polovina pixelů. Potom výsledný buffer se rescaluje na potřebné rozlišení a aplikuje. Celé se to spoléha na zhlazovací metodu TAA, která akumuluje výsledky předchozích snímku a interpoluje jich do aktuálního, což šum zdanlivě dobře potlačuje ikdyž ne kompletně. Ve výsledku tak potom TAA vytváří ghosting effekt nejen na hranach objektů ale i osvetlení s odrazy, což dost bije do oka v dynamických scénach. +\newpage +\paragraph{Lumen\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-global-illumination-and-reflections-in-unreal-engine}}je zdánlivě revoluce v realtime herním osvětlení. Jedná se o~speciální režim osvětlení a odrazů, který umožňuje za běhu počítat dynamické osvětlení bez~potřeby vytváření lightmap nebo dotěrného nastavení ploch odrazů. Vytváří velice kvalitní osvětlení za opravdu malo úsili. + +Nevýhodu, kterou ale již neprezentují, není tolik trochu větší zátěž na hardware, ale šum vyrendrovaného osvětlení a odrazů. Lumen totíž v reálném čase generuje buffer s odrazy a osvětlení ve velice malém rozlišení a to navíc vynecháva náhodně zhruba polovinu pixelů. Potom výsledný buffer se rescaluje na~potřebné rozlišení a aplikuje. Celé se to spoléha na zhlazovací metodu TAA, která~akumuluje výsledky předchozích snímku a interpoluje jich do aktuálního, což~šum zdanlivě dobře potlačuje ikdyž ne kompletně. Ve výsledku tak potom TAA vytváří ghosting efekt nejen na hranach objektů ale i osvetlení s odrazy, který~dost~bije do oka v dynamických scénach. + +\subsection*{- 3D} +Podporován je import 3D modelů z různých formátů. Navíc k tomu UE poskytuje dostatečné množství optimalizačních technik jako např.: + +\paragraph{Render occlusion culling}vykreslující objekty pouze pokud se nachází v zorném poli kamery, nebo + +\paragraph{Level Of Details (LOD)}vykreslující různě detailizované verze objektu v závislosti na jeho vzdalenosti od hráče, protože proč vykreslovat detaily, které z dálky nejsou vidět. + +\paragraph{Nanite\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/nanite-virtualized-geometry-in-unreal-engine}}je ještě jedná specialita Unreal Engine 5, která umožňuje vykreslování a instancování objektů s miliony až miliardy trojúhelníků v reálném čase. Umožňuje tak použití v enginu super detalizovaných objektů, získaných pomoci skenování objektů v realitě. + +Technika je založená na předčasné clustarizaci a následně dynamickém streamování pouze viditelných trojúhelníků. Bohužel neumožňuje kompletního vynechání LOD systému, jak to reklamuje tvůrce enginu. Nanite sice může ušetřit spoustu času modeláři, ale reálný zisk ve výkonu je pouze ve velmi náročných scénach obsahující statické objekty. Proto LOD stale zustava nejefektivnější technikou zlevnění vykreslovacího času objektu. -\subsubsection{3D} -Podporován je import 3D modelů z různých formátů. Navíc k tomu poskytuje dostatečné množství optimalizačních technik jako např.: -\paragraph{Render occlusion culling}vykresluje objekty pouze pokud se nachází v zorném poli kamery, nebo -\paragraph{Level Of Details(LOD)}vykreslující různě detailizované verze objektu v závislosti na jeho vzdalenosti od hráče, protože proč vykreslovat detaily, které z dálky nejsou vidět. -\paragraph{Nanite\protect\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/nanite-virtualized-geometry-in-unreal-engine}}je ještě jedná specialita Unreal Engine 5, která umožňuje vykreslování a instancování objektů s miliony až miliardy trojúhelníků v reálném čase. Umožňuje tak použití v enginu super detalizovaných objektů, získaných pomoci skenování objektů v realitě. Technika je založená na předčasné clustarizaci a následně dynamickém streamování pouze viditelných trojúhelníků. Bohužel neumožňuje kompletního vynechání LOD systému, jak to reklamuje tvůrce enginu. Nanite sice může ušetřit spoustu času modeláři, ale reálný zisk ve výkonu je pouze ve velmi náročných scénach obsahující statické objekty. Proto LOD stale zustava nejefektivnější technikou zlevnění vykreslovacího času objektu. \paragraph{Instancování/Foliáž}umožňuje zmenšení paměti potřebnou pro reprezentaci skupiny stejných objektů a výsledně i zlevnění renderovacího času. Je postavená na jednoduché myšlence, že instance objektů drží v paměti pouze transformaci a zbytek dat je referencován z jedíneho pravého objektu. Často se táto technika používa pro naplnění světa různými drobnými objekty (instancování) nebo tvorbu vegetace (foliáž). -\subsubsection{Animace} -Veškeré potřeby pro animaci libovolného druhu jsou taktéž pokryté. Jen neposkytuje žádné high-level ovládání přehrávání a proto užitelský ovládání a triky je potřeba dodělat manuálně. +\subsection*{- Animace} +Veškeré potřeby pro animaci libovolného druhu jsou taktéž pokryté. Akorát UE neposkytuje žádné high-level ovládání přehráváných sekvencí a proto užitelské ovládání je potřeba dodělat navíc manuálně. -\paragraph{Skeleton}animace je založená doslova na animování kostry přivázané k 3D modelu. Skupiny trojúhelníků jsou namapovaný na určité kosti, tak že při pohybu kosti je stejným směrem interpolovaná pozice trojúhelníků. Daný druh 3D animace může vytvářet velkou zátěž na procesor zejména při velkém počtu instancí, jelikož ten musí propočítávat pohyb každé kostí vůči hernímu světu a až potom odesílat renderovací požadavek na grafiku. Přesto daná technika tvoří převážnou část všech animací ve hře. +\paragraph{Skeleton}animace je založená doslovně na animování kostry přivázané k 3D modelu. Skupiny trojúhelníků jsou namapovaný na určité kosti, tak že při pohybu kosti je stejným směrem interpolovaná pozice trojúhelníků. Daný druh 3D animace může vytvářet velkou zátěž na procesor zejména při velkém počtu instancí, jelikož ten musí propočítávat pohyb každé kostí vůči hernímu světu a až potom odesílat renderovací požadavek na grafiku. Přesto daná technika tvoří převážnou část všech animací ve hrach díky jednoduchosti tvorby a práci s ní. \paragraph{Shader}animace je exotická technika s myšlenkou přeskočit krok s výpočtem na procesoru. Animace se zakóduje do textury a následně je aplikovaná ve vertex shaderu jako offset vrcholů. Výsledně lze například velmi levně animovat velké hejno ptáků, který nemusí mít kolizi ve světě. -\subsubsection{Renderer} -Z rendererů lze vybrat mezi Forward a Deferred rendererem. Jsou to systémy které se starají o zpracování grafiky a vykreslování scény. Zajišťují převod 3D objektů a jejich vlastností na obraz, který se zobrazí na monitoru. Renderer pracuje s osvětlením, stíny, materiály a postprocesovými efekty pro dosažení realistické nebo stylizované grafiky. +\subsection*{- Renderer} +Z rendererů lze vybrat mezi Forward a Deferred rendererem. Jsou to systémy které se starají o zpracování grafiky a vykreslování scény. Zajišťují převod 3D objektů a jejich vlastností na obraz, který se zobrazí na monitoru. Renderer pracuje s~osvětlením, stíny, materiály a postprocesovými efekty pro dosažení realistické nebo stylizované grafiky. -\paragraph{Forward rendering}je metoda renderingu, kde se každý objekt renderuje jednotlivě se všemi aplikovanými světelnými efekty. Je vhodný pro scény s malým množstvím světel a vyžaduje menší paměťovou náročnost. Používá se často v mobilních a VR aplikacích, kde je důležitá efektivita výkonu. +\paragraph{Forward rendering}je metoda renderingu, kde se každý objekt renderuje jednotlivě se všemi aplikovanými světelnými efekty. Je vhodný pro scény s malým množstvím světel a vyžaduje menší paměťovou náročnost. Dnes se převážně používá v mobilních a VR aplikacích, kde je důležitá rychlost výkonu. -\paragraph{Deferred rendering}odkládá aplikaci světelných efektů a v první fázi ukládá informace o geometrii scény do bufferu (G-buffer). Světla se aplikují až v druhé fázi, což umožňuje efektivnější práci s větším množstvím dynamických světelných zdrojů. Tato metoda se používá především v moderních AAA hrách, kde je vyžadována vysoká vizuální kvalita. Je to výchozí renderer v Unreal Engine, který navíc umožňuje použití technologií Nanite a Lumen. -Nevýhodou je nemožnost použití kvalitních zhlazovacích metod jako MSAA. MSAA funguje tak, že ukládá více vzorků na pixel během rasterizace, což dobře funguje u forward renderingu, kde se barva a hloubka určují okamžitě. V deferred renderingu se však barvy a osvětlení aplikují až v pozdější fázi, kdy se světelné výpočty provádějí na pixelech na základě uložených dat v G-bufferu. Problém je, že MSAA by muselo být aplikováno na všechny jednotlivé buffery (normály, hloubku, albedo atd.), což je extrémně výpočetně náročné a neefektivní. Proto se místo MSAA často používají jiné metody zhlazování, jako FXAA nebo TAA. Poslední ale vytváří rozmazávání hran objektů v dynamických scénach. +\paragraph{Deferred rendering}odkládá aplikaci světelných efektů a v první fázi ukládá informace o geometrii scény do bufferu (G-buffer). Světla se aplikují až v druhé fázi, což umožňuje efektivnější práci s větším množstvím dynamických světelných zdrojů. Tato metoda se používá především v moderních AAA hrách, kde~je~vyžadována vysoká vizuální kvalita. Je to výchozí renderer v Unreal Engine, který~navíc umožňuje použití technologií Nanite a Lumen. -\subsubsection{Postprocessing} -Postprocessing je technika dodatečného zpracování vyrenderovaného obrazu. Většinou se jedná o manipulaci barev, ale lze tady dělat i spoustu dizajnových a technickych triků. Např. různé glitch efekty, screen space světelné efekty, efekty tepelného/nočního vidění atd.. +Nevýhodou je nemožnost použití kvalitních zhlazovacích metod jako MSAA. MSAA funguje tak, že ukládá průměr více vzorků na pixel během rasterizace, což~dobře funguje u forward renderingu, kde se barva a hloubka určují okamžitě. V~deferred renderingu se však barvy a osvětlení aplikují až v pozdější fázi, kdy~se~světelné výpočty provádějí na pixelech na základě uložených dat v~G-bufferu. Problém je, že MSAA by muselo být aplikováno na všechny jednotlivé buffery (normály, hloubku, albedo atd.), což je extrémně výpočetně náročné a~neefektivní. Proto se místo MSAA často používají jiné metody zhlazování, jako FXAA nebo TAA. Ty jsou podstatně méně kvalitní a TAA dokonce vytváří rozmazávání hran objektů v dynamických scénach resp. ghosting efekt. -\subsubsection{2D} +\subsection*{- Postprocessing} +Postprocessing je technika dodatečného zpracování vyrenderovaného obrazu. Většinou se jedná o triviální manipulaci barev, ale lze tady dělat i spoustu dizajnových a technickych triků. Např. různé glitch efekty, screen space světelné efekty, efekty tepelného/nočního vidění atd.. + +\subsection*{- 2D} Je více způsobů práce s 2D grafikou, avšak udělat čistě 2D hru bude problematické. V oficiální nabídce je rozhraní Paper 2D\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/paper-2d-overview-in-unreal-engine}, který vývoj 2D hry sice zjednodušuje, ale přesto má pouze základní prvky 2D enginu. Místy chybí hodně optimalizace, protože soubory v editoru jsou neracionálně velký a ve větších projektech engine začíná být hodně náročný na hardware. Proto pro 2D hry Unreal Engine se moc nehodí a je doporučené rozhlédnout se po konkurenčních enginech. -\paragraph{UI}lze programovat v C++ pomoci Slate třídy nebo přímo pomoci Blueprintů v editoru. Programování se Slate je hodně nízkoúrovňový nýbř stejný jako slepé programování okenní windows aplikace pomocí windows.h knihovny. Mnohem pohodlnější je práce v editoru, kde rovnou lze vidět vizuální výsledek. Celkově tvorba UI v Unreal Engine je jedná z jeho nejsilnějších stránek i mezi konkurenty, i když se o ní moc nemluví. +\paragraph{UI}lze programovat v C++ pomoci Slate třídy nebo přímo pomoci Blueprintů v editoru. Programování se Slate je hodně nízkoúrovňový nýbř stejný jako slepé programování okenní windows aplikace pomocí windows.h knihovny. Mnohem pohodlnější je práce v editoru, kde rovnou lze vidět vizuální výsledek. -\paragraph{Pro 3D}vždy bylo možné vytvořit klasickou plochu s texturou/materiálem nebo renderovat text do 3D světa. Samotné renderování textu ve 3D je implementováno pomoci generace 3D Meshe z vektorového fontu, což je často výkonnostní overkill nebo součástí již hotového modelu. Ještě lze použít renderování textu z předgenerované průhledné rastrové textury fontu. Poslední způsob je dost rychlý na implementaci a výkonnostně nejlepší, avšak je nemožné dosáhnout hodně kvalitního výstupu. Nejlepší možností je generovat text vektorově v UI a následně ho projektovat do 3D světa, což je umožněno pomoci již zmíněných UI tříd. +Celkově tvorba UI v Unreal Engine je jedná z jeho nejsilnějších stránek i mezi konkurenty, i když se o ní moc nemluví. + +\paragraph{Pro 3D}bylo vždy možné vytvořit klasickou plochu s texturou/materiálem nebo renderovat text do 3D světa. Samotné renderování textu ve 3D je implementováno pomoci generace 3D Meshe z vektorového fontu, což je často výkonnostně přehnané řešení neboť mesh texty jsou již součástí hotového modelu. Ještě lze použít renderování textu z předgenerované průhledné rastrové textury fontu. Poslední způsob je dost rychlý na implementaci a výkonnostně nejlepší, avšak je~nemožné dosáhnout hodně kvalitního výstupu. Nejlepší možností je generovat text vektorově v UI a následně ho projektovat do 3D světa, což je umožněno pomoci již zmíněných UI tříd. \subsection{Zvuk} -Pro práci se zvuky máme taktéž bohaté vymožeností. Důležité je předem nastavit kompresi a způsob streamování zvukových dat z assetů hry. Ještě lepší je rozdělit zvuky do menších spojitých balíčků assetů. Často totiž chceme zvuk použit v okamžik nějaké udalostí hned, a je důležité aby se co nejrychleji načetl. Samozřejmě taky lze některé zvuky načíst předem a držet v paměti procesu. Ale i když se nezdá, zvuky mohou obsadit poměrně velký kus paměti aplikace a většinou zbytečně, což také většina vývojářů ignoruje. +Pro práci se zvuky máme taktéž bohaté vymožeností. Důležité je předem nastavit kompresi a způsob streamování zvukových dat z assetů hry. Ještě lepší je rozdělit zvuky do menších spojitých balíčků assetů. Často totiž chceme zvukovou stopu použít hned v okamžik nějaké udalostí, a je důležité aby se data co nejrychleji načetli. Samozřejmě taky lze některé zvuky načíst předem a držet v paměti procesu. Ale i když se nezdá, zvuky mohou obsadit poměrně velký kus paměti aplikace a~většinou zbytečně, což také většina vývojářů ignoruje. -\paragraph{Mixer a Cues} umožňují precizní modifikaci přehravaného zvuku. Cue je kontejner pro jeden a více konkrétních zvuků, který se chová jako samostatný jeden zvuk. V tomto kontejnerů lze zvuky mixovat nebo větvit, modifikovat tonalitu, attenuaci, modulaci, dělat přechody a spoustu dalšího. Navíc veškerý efekty a jejich intenzitu lze aplikovat staticky nebo dynamicky. Dohromady vše prochází přes Mixer, který funguje jako zjednodušený mixážní pult. Nastavuje a kombinuje přiřazené zvukové třídy a může na nich aplikovat equalizer. +\paragraph{Mixer a Cues} umožňují precizní modifikaci přehravaného zvuku. Cue je kontejner pro jeden a více konkrétních zvuků, který se chová jako jeden samostatný zvuk. V tomto kontejneru lze zvuky mixovat nebo větvit, modifikovat tonalitu, attenuaci, modulaci, dělat přechody a spoustu dalšího. Navíc veškerý efekty a~jejich intenzitu lze aplikovat staticky nebo dynamicky. Dohromady vše prochází přes Mixer, který funguje jako zjednodušený mixážní pult. Nastavuje a~kombinuje přiřazené zvukové třídy a může na nich aplikovat equalizer. -\paragraph{Attenuace} je struktura parametrů popisující modifikaci zvuku při rozdílné vzdálenosti posluchače od zdroje zvuku. Dohromady tak popisuje na jakou vzdálenost lze zvuk slyšet a jak bude znít ztlumení a zesílení. Parametry podrobně upřesňují jak se zvuk bude šířit, blokovat, odrážet a splývat v prostoru. Většinou je postačující pouze první základní skupina parametrů popisující objem zvukového prostoru a funkci, která provádí interpolaci hlasitosti. +\paragraph{Attenuace} je struktura parametrů popisující modifikaci zvuku při rozdílné vzdálenosti posluchače od zdroje zvuku. Dohromady tak popisuje na jakou vzdálenost lze zvuk slyšet a jak bude znít ztlumení a zesílení. Parametry podrobně upřesňují jak se zvuk bude šířit, blokovat, odrážet a splývat v prostoru. Většinou je~postačující pouze první základní skupina parametrů popisující objem zvukového prostoru a funkci, která provádí interpolaci hlasitosti. \subsection{Hudba} -Během existence Unreal Engine 4 neexistoval téměř žádný oficiální nástroj pro dynamickou ani statickou kompozici hudebních linek. Proto někde v zákoutí byl stvořen tým z jednoho člověka, který daný nástroj programoval a byl dokonce dostupný v dost nedokončené verzi na githubu. S příchodem Unreal Engine 5 práce nad nástrojem byla pozastavená a tedy žádný oficiální nástroj stále neexistuje a není v plánu. +Během existence Unreal Engine 4 neexistoval téměř žádný oficiální nástroj pro dynamickou ani statickou kompozici hudebních linek. Proto někde v zákoutí byl stvořen tým z jednoho člověka, který daný nástroj programoval a dokonce byl dostupný v alfa verzi na githubu. S příchodem Unreal Engine 5 práce nad nástrojem byla pozastavená a tedy žádný oficiální nástroj stále neexistuje a není v plánu. -Hlavní problém s hudbou je synchronizace linek. Hudba hodně netoleruje jakékoliv zpoždění neboli desynchronizaci linek, protože i milisekunda rozdílu může přeměnit nádherně zkomponovanou hudbu v neposlouchatelnou kaši. Proto jednoduché přehrání linky v potřebný okamžik nefunguje. Buď zvukový data se načtou pomalu nebo herní tik provede spuštění opožděně, protože je závislý na renderovácí frekvenci snímků. Podrobně je tento problém znázorněn na \Cref{fig:musicLinking}. +Hlavní problém s hudbou je synchronizace linek. Hudba hodně netoleruje jakékoliv zpoždění neboli desynchronizaci linek, protože i milisekunda rozdílu může přeměnit nádherně zkomponovanou hudbu v neposlouchatelnou kaši. Proto jednoduché přehrání linky v potřebný okamžik nefunguje. Buď zvukový data se~načtou pomalu nebo herní tik provede spuštění opožděně, protože je závislý na~renderovácí frekvenci snímků viz. \Cref{fig:musicLinking}. \begin{figure} \centering \includegraphics[width=.6\linewidth]{img/musicLinking.pdf} @@ -138,44 +155,44 @@ Hlavní problém s hudbou je synchronizace linek. Hudba hodně netoleruje jakék \label{fig:musicLinking} \end{figure} -\paragraph{FMOD\protect\footnote{https://www.fmod.com/}}je middleware audio engine pro hry poskytující velice silné rozhraní pro práci se zvuky nebo jejich manipulací. Nejčastějí se k němu přiklání pro tvorbu dynamických hudebních doprovodů, což vyplňuje hudební mezeru v Unreal Engine. Je to nejpopulárnější řešení, které se používa od indie po AAA hry. Taktéž v populárních enginech má integrovanou podporu nebo poskytuje engine v podobě samostaného procesu, který potom může komunikovat s procesem hry. FMOD také poskytuje editor zvukových stop a s nimi spojených eventů, pro jednoduché ovládání audia přímo ve hře. +\paragraph{FMOD\protect\footnote{https://www.fmod.com/}}je middleware audio engine pro hry poskytující velice silné rozhraní pro práci se zvuky nebo jejich manipulaci. Nejčastěji se k němu přiklání pro tvorbu dynamických hudebních doprovodů, což vyplňuje hudební mezeru v Unreal Engine. Je to nejpopulárnější řešení, které se používá od indie po AAA hry. Taktéž v populárních enginech má integrovanou podporu nebo poskytuje engine v podobě samostatného procesu, který potom může komunikovat s procesem hry. FMOD také poskytuje editor zvukových stop a s nimi spojených eventů, pro~jednoduché ovládání audia přímo ve hře. \subsection{Načítání obsahu} -Integrace nového obsahu do hry za běhu obnáší ošetření spousty technických problémů. Nejzávažnější z ních jsou načténí nového obsahu a jeho kompatibilita. Tyto dvě věci ani nejde ošetřit bez značných omezení a proto jsou ponechány na vývojářech. +Integrace nového obsahu do hry za běhu obnáší ošetření spousty technických problémů. Nejzávažnější z nich jsou načtení nového obsahu a jeho kompatibilita. Tyto dvě věci ani nejde ošetřit bez značných omezení a proto jsou ponechány na~vývojářech. \paragraph{Načtení}i těch menších assetů může značně pozastavit hru v načítání. Proto je potřeba načítání nového obsahu provést hned při načtení celé hry, nebo zapracovat nad vhodným malým streamingem dat, který nezpůsobí velkou zátěž na hardware. -\paragraph{Kompatibilita}nového a starého kódu je něco co může zhavarovat celou aplikaci. Naštěstí Unreal Engine řeší havarijní stavy a hra poběží dál, ale potřebné nám assety se již nenačtou. Nejvíc tento problém se projevuje s klasickým kódem v C++, kde výsledný strojový kód očekáva nějakou proměnnu nebo funkci v přesně daném místě paměti. O něco lepší je to se vším ostatním, protože vše je propojeno a voláno ralativními resp. globálními cesty a názvy. Tak například funkce v blueprintech jsou vždy voláné pomoci názvů funkcí v řetězcové podobě. Stejně tak proměnné jsou uložené ve slovníku variantů. Takové využití víceúrovňové reflexe, umožňuje ošetřit libovolný problém s kompatibilitou a zaručit bezpečný běh za cenu trochu většího zatížení prostředků. Navíc stejnou reflexi v C++ lze jednoduše udělat pomoci maker, které Unreal Engine poskytuje. Ovšem ošetření kompatibility není součástí této práce. +\paragraph{Kompatibilita}nového a starého kódu je něco co může zhavarovat celou aplikaci. Naštěstí Unreal Engine řeší havarijní stavy a hra poběží dál, ale potřebné nám assety se již nenačtou. Nejvíc tento problém se projevuje s klasickým kódem v C++, kde výsledný strojový kód očekáva nějakou proměnnou nebo funkci v~přesně daném místě paměti. O něco lepší je to se vším ostatním, protože vše je propojeno a voláno relativními resp. globálními cesty a názvy. Tak například funkce v blueprintech jsou vždy voláné pomoci názvů funkcí v řetězcové podobě. Stejně tak proměnné jsou uložené ve slovníku variantů. Takové využití víceúrovňové reflexe, umožňuje ošetřit libovolný problém s kompatibilitou a zaručit bezpečný běh za cenu trochu většího zatížení prostředků. Navíc stejnou reflexi v~C++ lze jednoduše udělat pomoci maker, které Unreal Engine poskytuje. Ovšem ošetření kompatibility není součástí této práce. -\subsection{Umělá intelegence} -Nehratelné postavy resp. NPC jsou součastí většíny her, protože pomáhají vyprávět příběh nebo obohatit/oživit prostředí. NPC jako každý herní prvek lze napevno navrhnout a naprogramovat všechny potřebné varianty vzhledů a použití. Ale z dizajnových a časových důvodů ve většíně případu chceme, aby NPC byli více univerzální . Chceme aby mohli samostatně v prostředí orientovat, chodit a občas dokonce, aby NPC reagovali a ovlivňovali prostředi. +\subsection{Umělá inteligence} +Nehratelné postavy resp. NPC jsou součástí většiny her, protože pomáhají vyprávět příběh nebo obohatit/oživit prostředí. NPC jako každý herní prvek lze napevno navrhnout a naprogramovat všechny potřebné varianty vzhledů a použití. Ale~z~designových a časových důvodů ve většině případu chceme, aby NPC byli více univerzální. Chceme aby se mohli samostatně orientovat v prostředí, pohybovat se a občas dokonce reagovat na okolí a ovlivňovat ho. -\paragraph{Behavior tree}resp. strom pravidel je nejčastěji způsob kódování chování NPC. Takový strom umožňuje efektivní rozhodování a řízení chování umělé inteligence. Hlavní výhodou oproti jiným přístupům, jako například konečné automaty nebo plánování, je modularita, škálovatelnost, snadná údržba a současně přehlednost. Samozřejmě má i nevýhody mezi které zejména patří optimalizace a náročný návrh složitých viceúrovňových chování. +\paragraph{Behavior tree}resp. strom pravidel je nejčastěji způsob kódování chování NPC. Takový strom umožňuje efektivní rozhodování a řízení chování umělé inteligence. Hlavní výhodou oproti jiným přístupům, jako například konečné automaty nebo plánování, je modularita, škálovatelnost, snadná údržba a současně přehlednost. Samozřejmě má i nevýhody mezi které zejména patří optimalizace a náročný návrh složitých víceúrovňových chování. -NPC začíná rozhodování v kořenu stromu od kterého postupuje k vrcholům s pravidly. Listy jsou vždy akční úzly a jak napovídá název, úrčují akci, kterou objekt provede. Cestu od kořene k listům vytvárí řídicí vrcholy, každý z kterých určuje pořadí a podmínky přechodu na podřízené vrcholy. Nejčastějí používáné jsou: +NPC začíná rozhodování v kořenu stromu od kterého postupuje k vrcholům s~pravidly. Listy jsou vždy akční vrcholy a jak napovídá název, úrčují akci, kterou objekt provede. Cestu od kořene k listům vytváří řídicí vrcholy, každý z kterých určuje pořadí a podmínky přechodu na podřízené vrcholy. Nejčastěji používané jsou: \begin{itemize} \item sekvenční resp. Sequence, který cyklicky spouští své podřízené vrcholy postupně, dokud některý nevrátí přerušení, -\item selektor resp. Selector, vybírá první podřízený vrchol, který v zadaném pořádí má pozitivně zhodnocené pravidlo, +\item selektor resp. Selector, vybírá první podřízený vrchol, který v zadaném pořadí má pozitivně zhodnocené pravidlo, \item paralelní resp. Parallel, který spouští podřízený vrcholy současně, \item a podmínkové vrcholy, které rozhodují, zda pokračovat v dané větvi nebo se vrátit ke kořenu. \end{itemize} -\section{Umělá intelegence pro tvorbu obsahu} -Celé toto téma je technicky a odborně velice zkrácené s ohledem na rozsah bakalářky. Taky tak jednotlivé modely a práce s nimi nejsou součastí této práce. Táto práce zakláda pouze potřebný koncept pro integraci umělé inteligence. +\section{Umělá inteligence pro tvorbu obsahu} +Celé toto téma je technicky a odborně velice zkrácené s ohledem na rozsah bakalářky. Taky tak jednotlivé modely a práce s nimi nejsou součástí této práce. Táto práce zakládá pouze potřebný koncept pro integraci umělé inteligence. -V současné době díky výkonostním pokrokum se rozšířují hranice použitelností uměle intelegence a to zejmena velké jazykové modely neboli LLM. LLM ukazují skvělé výsledky v generování obsahu různeho charakteru v poměru lidského času a ceny. Nejlepší výsledky jsou zatím v textových nebo grafických modelech. +V současné době díky výkonostním pokrokům se rozšířují hranice použitelností uměle intelegence a to zejména velké jazykové modely. LLM ukazují skvělé výsledky v generování obsahu různého charakteru v poměru lidského času a ceny. -Již dnes se objevují hry, které integrují dánou technologii. NPC tak umí poměrně realisticky a nekonečně držet konverzaci s hráčem v textové a dokonce i hlasové podobě. Textury a sprity jsou na pohled snad nekonečné, a k tvorbě nevyžadují umělecký cit nebo znalostí. Vývojáři můžou poměrně rychle vygenerovat jednoduchý kód nebo velké konfigurační soubory a struktury. +Již dnes se objevují hry, které integrují danou technologii. NPC tak umí poměrně realisticky a nekonečně držet konverzaci s hráčem v textové a dokonce i~hlasové podobě. Textury a sprity jsou na pohled snad nekonečné, a k tvorbě nevyžadují umělecký cit nebo znalostí. Vývojáři mohou poměrně rychle vygenerovat jednoduchý kód nebo velké konfigurační soubory a struktury. -\paragraph{Udržení kontextu}je největší problém této technologie. Nejvíc se to projevuje při generování videí, kde je zřetelný jak umělý model má potíže udržet konstantní/konkretní obsah nebo myšlenku jednotlivých scén a nasledovně i vzhled vizuálních objektů. LLM z každou další iteraci má poměrně vysokou šanci změnit směr ,,myšlenky''. A to proto, že LLM nemyslí, LLM je pouze konvoluce velkého množství pravděpodobnostní. Tak například LLM nevytváří logicky souvislý text ale pouze predikuje další pravděpodobnostně nejvhodnější sekvence textu na základě trenovaných dat. +\paragraph{Udržení kontextu}je největší problém této technologie. Nejvíc se to projevuje při generování videí, kde je zřetelný jak model má potíže udržet konstantní/konkrétní obsah nebo myšlenku jednotlivých scén a následně i vzhled vizuálních objektů. LLM z každou další iteraci má poměrně vysokou šanci změnit směr ,,myšlenky''. A to proto, že LLM nemyslí, LLM je pouze konvoluce velkého množství pravděpodobnostní. Tak například LLM nevytváří logicky souvislý text ale pouze predikuje další pravděpodobnostně nejvhodnější sekvence textu na~základě trenovaných dat. -Proto zásadní chybou je použití LLM k úplné tvorbě nového obsahu. A spravně je používat LLM pouze jako nástroj buď pro tvorbu počáteční verze obsahu nebo vedlejší obohacení již existujicího díla. Pravě s touto myšlenkou byl doprovázen vzník této práce, déky niž bude možné otestovat jak dobře LLM bude obohacovat již hotovou počítačovou hru. +Proto zásadní chybou je použití LLM k úplné tvorbě nového obsahu. A správně je používat LLM pouze jako nástroj buď pro tvorbu počáteční verze obsahu nebo vedlejší obohacení již existujícího díla. Právě s touto myšlenkou byl doprovázen vznik této práce, díky níž bude možné otestovat jak dobře LLM bude obohacovat již hotovou počítačovou hru. -\paragraph{Halucinace}jsou další významnou slabinou LLM. Jedná se o situace, kdy model generuje nesprávné, zavádějící nebo zcela smyšlené informace. V kontextu počítačových her tak může docházet například k halucinacím při generování herních dialogů, questů nebo vizuálních prvků, kde model vymýšlí neexistující herní mechaniky, postavy či události, které nepatří do hry. Kořen tohoto problému je stejný jak v udržení kontextu, kde navíc se to prohlubuje slabým natrenováním modelu. +\paragraph{Halucinace}jsou další významnou slabinou LLM. Jedná se o situace, kdy model generuje nesprávné, zavádějící nebo zcela smyšlené informace. V kontextu počítačových her tak může docházet například k halucinacím při generování herních dialogů, questů nebo vizuálních prvků, kde model vymýšlí neexistující herní mechaniky, postavy či události, které nepatří do hry. Kořen tohoto problému je~stejný jak v udržení kontextu, kde navíc se to prohlubuje slabým natrenováním modelu. -\paragraph{Řešení nejsou dokonalá,}ale mohou výrazně polepšit stav problémů. K dispozici je větší množství metod a některé dokonce proprietární. V teorii se ale většinou jedná o metody: +\paragraph{Řešení nejsou dokonalá,}ale mohou výrazně polepšit stav problémů. K dispozici je větší množství metod a některé dokonce proprietární. V teorii se~ale~většinou jedná o metody: \begin{itemize} \item retrieval-augmented generation (RAG), která kombinuje model s databází obsahující ověřené informace, -\item jemné doladění modelu (fine-tuning), které spočívá v dotrenování modelu na specifických datech (na datech naši hry), +\item jemné doladění modelu resp. fine-tuning, které spočívá v dotrenování modelu na specifických datech (na datech naši hry), \item a omezení generativní volnosti pomocí pravidel a pevně definovaných scénářů, které se zároveň kryjí s kontrolními mechanismy a validaci výstupů. \end{itemize} \ No newline at end of file -- 2.45.2