Jekyll2022-10-25T14:51:50+00:00http://beautifularea.cn/feed.xml美丽的流域not perfect, but persist
Riccardo GraziosiPreparing SGX Env on Ubuntu20.042022-10-25T00:00:00+00:002022-10-25T00:00:00+00:00http://beautifularea.cn/0179<h2 id="background">Background</h2>
<p>In 2015 Intel released <strong><a href="https://software.intel.com/content/www/us/en/develop/topics/software-guard-extensions.html">Software Guard Extensions</a></strong>. This introduces a new set of instruction codes for Intel CPUs that offer new security options in the way of a hardware enclave.Intel(R) Software Guard Extensions (Intel(R) SGX) is an Intel technology for application developers seeking to protect select code and data from disclosure or modification.</p>
<p>The Linux SGX software stack is comprised of the Intel(R) SGX driver, the Intel(R) SGX SDK, and the Intel(R) SGX Platform Software. The Intel(R) SGX SDK and Intel(R) SGX PSW are hosted in the <a href="https://github.com/01org/linux-sgx">linux-sgx</a> project.</p>
<p>This post will focus on installing the <strong>SGX driver</strong>, <strong>SDK</strong>, and <strong>PSW</strong> on Ubuntu 20.04. Support for SGX can be found for major Linux distributions as well as Windows.</p>
<p>The <a href="https://github.com/01org/linux-sgx-driver">linux-sgx-driver</a> project hosts the out-of-tree driver for the Linux Intel(R) SGX software stack, which will be used until the driver upstreaming process is complete.</p>
<p>There are currently three different drivers that can be used to support Intel® SGX. The platform must be configured with only one of these drivers:</p>
<ol>
<li>In-kernel Driver (/dev/{sgx_enclave, sgx_provision}): Mainline kernel release 5.11 or higher
includes the SGX In-Kernel driver. The In-Kernel Driver requires the platform to support and to
be configured for Flexible Launch Control.</li>
<li>DCAP Driver (/dev/{sgx_enclave, sgx_provision}): The goal of the DCAP driver is to provide an
interface close to the In-kernel Driver in order to provide Intel® SGX support to Linux OSs that do not have the Intel® SGX driver built into the kernel. This driver also requires the platform to
support and to be configured for Flexible Launch Control. Since this driver supports an out-oftree implementation, it does not include new features supported by later kernel releases such
as EDMM, SGX KVM, SGX cgroups, and NUMA aware EPC allocation. This driver is only updated for necessary security fixes. The in-kernel driver should be used whenever it is possible.</li>
<li>Out-of-tree Driver (/dev/isgx): This driver is provided to support running Intel® SGX enclaves on platforms that only support Legacy Launch Control. It may also be installed on platforms
configured with Flexible Launch Control; however, then these platforms will only load enclaves
that conform to the Legacy Launch Control Policy.</li>
</ol>
<h2 id="pre-check">Pre-check</h2>
<p>Before we get started, it’s good to understand if your processor supports SGX.</p>
<p>Method:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>cpuid <span class="nt">-1</span> | <span class="nb">grep</span> <span class="nt">-i</span> sgx
SGX: Software Guard Extensions supported <span class="o">=</span> <span class="nb">true
</span>SGX_LC: SGX launch config supported <span class="o">=</span> <span class="nb">false
</span>Software Guard Extensions <span class="o">(</span>SGX<span class="o">)</span> capability <span class="o">(</span>0x12/0<span class="o">)</span>:
SGX1 supported <span class="o">=</span> <span class="nb">true
</span>SGX2 supported <span class="o">=</span> <span class="nb">false
</span>SGX ENCLV E<span class="k">*</span>VIRTCHILD, ESETCONTEXT <span class="o">=</span> <span class="nb">false
</span>SGX ENCLS ETRACKC, ERDINFO, ELDBC, ELDUC <span class="o">=</span> <span class="nb">false</span>
</code></pre></div></div>
<h2 id="install-steps">Install Steps</h2>
<h3 id="first-step-out-of-tree-driver-installation">First Step: Out-of-Tree Driver Installation</h3>
<p>The Out-of-Tree Driver is recommended for use on platforms that do not support or are not configured for Flexible Launch Control.</p>
<ol>
<li>Update the system first:</li>
</ol>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt upgrade
</code></pre></div></div>
<ol>
<li>Install the Out-of-Tree Driver:</li>
</ol>
<p>a.</p>
<p>Since the Out-of-Tree Driver is built from the driver package, install the required
components that support the Intel® SGX PSW installation.
Note: This command line contains modules needed beyond the Out-of-Tree Driver
installation.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-get <span class="nb">install </span>build-essential ocaml automake autoconf libtool
wget python libssl-dev
</code></pre></div></div>
<p>b.</p>
<p>Download the latest Intel® SGX Driver binary file from the distro directory:
<a href="https://download.01.org/intel-sgx/latest/linux-latest/distro/">https://download.01.org/intel-sgx/latest/linux-latest/distro/</a>
For example, to download the driver for Ubuntu server 20.04, use the following command:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
wget - <span class="o">[</span>https://download.01.org/intel-sgx/latest/linuxlatest/distro/ubuntu20.04-server/]<span class="o">(</span>https://download.01.org/intel-sgx/latest/linuxlatest/distro/ubuntu20.04-server/<span class="o">)</span>
sgx_linux_x64_driver_2.11.0_0373e2e.bin
</code></pre></div></div>
<p>c.</p>
<p>Set the protections to allow for the .bin file execution:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nb">chmod </span>777 sgx_linux_x64_driver_2.11.0_0373e2e.bin
</code></pre></div></div>
<p>d. Install the driver:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nb">sudo</span> ./ sgx_linux_x64_driver_2.11.0_0373e2e.bin
</code></pre></div></div>
<p>The installer also loads the Out-of-Tree Driver and sets it to auto-load when the system reboots.</p>
<p><strong>NOTE</strong>:</p>
<p>After install, run commands:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> /sbin/depmod
<span class="nb">sudo</span> /sbin/modprobe isgx
</code></pre></div></div>
<p>If there’s a error like</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ERROR: could not insert <span class="s1">'isgx'</span>: Required key not available.
</code></pre></div></div>
<p>Or:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>no permission to load <span class="s1">'isgx'</span>
</code></pre></div></div>
<p>you need to update BIOS setting</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Set Intel ® SGX Control to “Enabled”
Set Secure Boot to “Disabled”
</code></pre></div></div>
<h3 id="second-step-install-sdk">Second Step: Install SDK</h3>
<ol>
<li>Install the prerequisite software.</li>
</ol>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-get <span class="nb">install </span>build-essential python
</code></pre></div></div>
<ol>
<li>Download the Intel® SGX SDK and install it.</li>
</ol>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget https://download.01.org/intel-sgx/sgx-linux/2.15.1/distro/ubuntu20.04-server/sgx_linux_x64_sdk_2.15.101.1.bin
<span class="nb">chmod</span> +x sgx_linux_x64_sdk_2.15.101.1.bin
<span class="nb">sudo</span> ./sgx_linux_x64_sdk_2.15.101.1.bin
<span class="nb">source</span> <User Input Path>/sgxsdk/environment
</code></pre></div></div>
<ol>
<li>Install the appropriate developer packages l</li>
</ol>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-get <span class="nb">install </span>libsgx-enclave-common-dev libsgx-dcap-ql-dev libsgxdcap-default-qpl-dev
</code></pre></div></div>
<h3 id="last-step-check-status">Last Step: Check Status</h3>
<p>Go to sdk install path, like sgxsdk/SampleCode/SampleEnclave</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make
./app
</code></pre></div></div>
<p>check output, if output likes</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Checksum<span class="o">(</span>0x0x7ffe1b63a710, 100<span class="o">)</span> <span class="o">=</span> 0xfffd4143
Info: executing thread synchronization, please wait...
Info: SampleEnclave successfully returned.
Enter a character before <span class="nb">exit</span> ...
</code></pre></div></div>
<p>Bingo! We Done successful.</p>
<hr />
<p data-content="footnotes"><a href="https://download.01.org/intel-sgx/latest/dcap-latest/linux/docs/Intel_SGX_SW_Installation_Guide_for_Linux.pdf">Intel_SGX_SW_Installation_Guide_for_Linux</a>
<a href="https://github.com/intel/linux-sgx-driver">https://github.com/intel/linux-sgx-driver</a>
<a href="https://community.intel.com/t5/Intel-Software-Guard-Extensions/Error-Invalid-SGX-device/m-p/1205181">Error-Invalid-SGX-device/</a></p>Riccardo GraziosiBackgroundInside Unreal Engine C++ Programming2022-10-09T00:00:00+00:002022-10-09T00:00:00+00:00http://beautifularea.cn/0174<h1 id="inside-unreal-engine-c-programming">Inside Unreal Engine C++ Programming</h1>
<h2 id="first-part--unreal-engine-c-basic">First Part : Unreal Engine C++ Basic</h2>
<h3 id="chapter-1-five-basic-classes">Chapter 1: Five Basic Classes</h3>
<h4 id="11-uobject">1.1 UObject</h4>
<p>The base class of all UE objects.</p>
<p><code class="language-plaintext highlighter-rouge">#include "UObject/Object.h"</code></p>
<p>1.1.1 Functionality Provided by UObject</p>
<ul>
<li>Garbage collection</li>
<li>Reference updating</li>
<li>Reflection</li>
<li>Serialization</li>
<li>Automatic updating of default property changes</li>
<li>Automatic property initialization</li>
<li>Type information available at runtime</li>
<li>Network replication</li>
</ul>
<p><strong><code class="language-plaintext highlighter-rouge">UObjects should never use the new operator</code></strong></p>
<p>1.1.2 Garbage collection</p>
<ul>
<li>using <code class="language-plaintext highlighter-rouge">UPROPERTY</code></li>
<li>using smart pointer - non-uobject</li>
</ul>
<p>1.1.3 Reflect</p>
<ul>
<li>Get Object Info at runtime</li>
</ul>
<p>1.1.4 Serialization</p>
<ul>
<li>seri - des</li>
</ul>
<p>1.1.5 Type information available at runtime</p>
<ul>
<li>/GR-, so cann’t use dynamic_cast</li>
<li>using <code class="language-plaintext highlighter-rouge">Cast<></code> instead</li>
<li>About <code class="language-plaintext highlighter-rouge">/GR-</code> : https://learn.microsoft.com/en-us/cpp/build/reference/gr-enable-run-time-type-information?view=msvc-170</li>
</ul>
<h4 id="12-actor-class">1.2 Actor Class</h4>
<p>Having the ability to handle <code class="language-plaintext highlighter-rouge">Component</code></p>
<p>Actor is the base class for an Object that can be placed or spawned in a level. Actors may contain a collection of <code class="language-plaintext highlighter-rouge">ActorComponents</code>, which can be used to control how actors move, how they are rendered, etc.</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">class</span> <span class="n">ENGINE_API</span> <span class="n">AActor</span> <span class="o">:</span> <span class="n">public</span> <span class="n">UObject</span>
</code></pre></div></div>
<h4 id="13-pawncharactercontrolller">1.3 Pawn/Character/Controlller</h4>
<p>1.3.1 Pawn</p>
<p>Pawn is the base class of all actors that can be possessed by players or AI.</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">class</span> <span class="n">ENGINE_API</span> <span class="n">APawn</span> <span class="o">:</span> <span class="n">public</span> <span class="n">AActor</span><span class="p">,</span> <span class="n">public</span> <span class="n">INavAgentInterface</span>
</code></pre></div></div>
<p>1.3.2 Character</p>
<p>Characters are Pawns that have a mesh, collision, and built-in movement logic.</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">class</span> <span class="n">ENGINE_API</span> <span class="n">ACharacter</span> <span class="o">:</span> <span class="n">public</span> <span class="n">APawn</span>
</code></pre></div></div>
<p>1.3.3 Controller</p>
<p>Controllers are non-physical actors that can possess a Pawn to control its actions.</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">PlayerControllers</code> are used by human players to control pawns</li>
<li><code class="language-plaintext highlighter-rouge">AIControllers</code> implement the artificial intelligence for the pawns they control.</li>
</ul>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">class</span> <span class="n">ENGINE_API</span> <span class="n">AController</span> <span class="o">:</span> <span class="n">public</span> <span class="n">AActor</span><span class="p">,</span> <span class="n">public</span> <span class="n">INavAgentInterface</span>
</code></pre></div></div>
<h3 id="chapter-2--new-object">Chapter 2: New Object</h3>
<h4 id="21-create-object">2.1 Create Object</h4>
<ul>
<li>Pure C++ Class(prefix <code class="language-plaintext highlighter-rouge">F</code>), using <code class="language-plaintext highlighter-rouge">new</code> operator</li>
<li>Derived from <code class="language-plaintext highlighter-rouge">UObject</code> , but not <code class="language-plaintext highlighter-rouge">AActor</code>, using <code class="language-plaintext highlighter-rouge">NewObject</code></li>
<li><code class="language-plaintext highlighter-rouge">AActor</code> and subclass, using <code class="language-plaintext highlighter-rouge">SpawnActor</code></li>
</ul>
<h4 id="22-get-object">2.2 Get Object</h4>
<ul>
<li><code class="language-plaintext highlighter-rouge">TActorIterator</code></li>
</ul>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Get All Actors in this Level</span>
<span class="k">for</span><span class="p">(</span><span class="n">TActorIterator</span> <span class="o"><</span><span class="n">AActor</span><span class="o">></span> <span class="n">Iterator</span><span class="p">(</span><span class="n">GetWorld</span><span class="p">());</span><span class="n">Iterator</span><span class="p">;</span><span class="o">++</span><span class="n">Iterator</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//do something</span>
<span class="p">}</span>
</code></pre></div></div>
<h4 id="23-destory-object">2.3 Destory Object</h4>
<ul>
<li>Pure C++ Class, using new -> delete</li>
<li><code class="language-plaintext highlighter-rouge">UObject</code> GC</li>
<li><code class="language-plaintext highlighter-rouge">Actor</code> Destory function</li>
</ul>
<h3 id="chapter-3-c-to-blueprint">Chapter 3: C++ to Blueprint</h3>
<h4 id="31-uproperty">3.1 UPROPERTY</h4>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">UPROPERTY</span><span class="p">(</span><span class="n">BlueprintReadWrite</span><span class="p">,</span><span class="n">VisibleAnywhere</span><span class="p">,</span><span class="n">Category</span><span class="o">=</span><span class="s">"Object"</span><span class="p">)</span>
</code></pre></div></div>
<h4 id="32-ufunction">3.2 UFUNCTION</h4>
<pre><code class="language-C">UFUNCTION(BlueprintCallable,Category="Test")
</code></pre>
<h3 id="chapter-4-gameplay">Chapter 4: Gameplay</h3>
<h4 id="41-behavior-tree">4.1 behavior tree</h4>
<p><strong>Behavior Trees</strong> assets in Unreal Engine 5 (Unreal Engine) can be used to create artificial intelligence (AI) for non-player characters in your projects. While the Behavior Tree asset is used to execute branches containing logic, to determine which branches should be executed, the Behavior Tree relies on another asset called a <strong>Blackboard</strong> which serves as the “brain” for a Behavior Tree.</p>
<p>The Blackboard contains several user-defined <strong>Keys</strong> that hold information used by the Behavior Tree to make decisions.</p>
<ul>
<li>Root -> Selector -> Keys</li>
<li>Root -> Sequence -> Keys</li>
</ul>
<p>Selector : If encounter <code class="language-plaintext highlighter-rouge">ture</code> , then return <code class="language-plaintext highlighter-rouge">true</code></p>
<p>Sequence: If encounter <code class="language-plaintext highlighter-rouge">false</code>, then return <code class="language-plaintext highlighter-rouge">false</code></p>
<h4 id="42-network-architecture">4.2 Network Architecture</h4>
<h5 id="421-sync">4.2.1 sync</h5>
<ul>
<li>Action: <code class="language-plaintext highlighter-rouge">Player move 3 steps</code></li>
<li>State: <code class="language-plaintext highlighter-rouge">Player Health</code></li>
</ul>
<p>Client send <code class="language-plaintext highlighter-rouge">Action</code> to server, after <code class="language-plaintext highlighter-rouge">server</code> update all <code class="language-plaintext highlighter-rouge">states</code> , it will sending <code class="language-plaintext highlighter-rouge">state</code> to all clients.</p>
<p>cons: <strong>low latency</strong></p>
<h5 id="422-client---server-model">4.2.2 Client - Server Model</h5>
<p><strong>Replication</strong> is the name for the process of synchronizing data and procedure calls between clients and servers.</p>
<h3 id="chapter-5-utils">Chapter 5: Utils</h3>
<h5 id="51-regex">5.1 Regex</h5>
<p><code class="language-plaintext highlighter-rouge">#include "Regex.h"</code></p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">FString</span> <span class="nf">TextStr</span><span class="p">(</span><span class="s">"ABCDEFGHIJKLMN"</span><span class="p">);</span>
<span class="n">FRegexPattern</span> <span class="nf">TestPattern</span><span class="p">(</span><span class="n">TEXT</span><span class="p">(</span><span class="s">"C.+H"</span><span class="p">));</span>
<span class="n">FRegexMatcher</span> <span class="nf">TestMatcher</span><span class="p">(</span><span class="n">TestPattern</span><span class="p">,</span> <span class="n">TextStr</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">TestMatcher</span><span class="p">.</span><span class="n">FindNext</span><span class="p">())</span> <span class="p">{</span>
<span class="n">UE_LOG</span><span class="p">(</span><span class="n">MyLog</span><span class="p">,</span> <span class="n">Warning</span><span class="p">,</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"Found %d -%d"</span><span class="p">),</span>
<span class="n">TestMatcher</span><span class="p">.</span><span class="n">GetMatchBeginning</span><span class="p">(),</span>
<span class="n">TestMatcher</span><span class="p">.</span><span class="n">GetMatchEnding</span><span class="p">());</span>
<span class="p">}</span>
</code></pre></div></div>
<h5 id="52-fpaths">5.2 FPaths</h5>
<ul>
<li><code class="language-plaintext highlighter-rouge">FPaths::GameDir()</code> -> Get Game Root Directory</li>
<li><code class="language-plaintext highlighter-rouge">FPaths::FileExists()</code> -> File Exists or not</li>
<li><code class="language-plaintext highlighter-rouge">FPaths::ConvertRelativePathToFull()</code></li>
</ul>
<h5 id="53-json">5.3 JSON</h5>
<p><code class="language-plaintext highlighter-rouge">#include "Json.h"</code></p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">FString</span> <span class="n">JsonStr</span> <span class="o">=</span> <span class="s">"[{</span><span class="se">\"</span><span class="s">author</span><span class="se">\"</span><span class="s">:</span><span class="se">\"</span><span class="s">Tim</span><span class="se">\"</span><span class="s">},{</span><span class="se">\"</span><span class="s">age</span><span class="se">\"</span><span class="s">:</span><span class="se">\"</span><span class="s">100</span><span class="se">\"</span><span class="s">}]"</span><span class="p">;</span>
<span class="n">TArray</span><span class="o"><</span><span class="n">TSharedPtr</span><span class="o"><</span><span class="n">FJsonValue</span><span class="o">>></span> <span class="n">JsonParsed</span><span class="p">;</span>
<span class="n">TSharedRef</span><span class="o"><</span> <span class="n">TJsonReader</span><span class="o"><</span><span class="n">TCHAR</span><span class="o">></span> <span class="o">></span> <span class="n">JsonReader</span> <span class="o">=</span> <span class="n">TJsonReaderFactory</span><span class="o"><</span><span class="n">TCHAR</span><span class="o">>::</span><span class="n">Cr</span>
<span class="n">bool</span> <span class="n">BFlag</span> <span class="o">=</span> <span class="n">FJsonSerializer</span><span class="o">::</span><span class="n">Deserialize</span><span class="p">(</span><span class="n">JsonReader</span><span class="p">,</span> <span class="n">JsonParsed</span><span class="p">);</span>
<span class="p">{</span>
<span class="n">UE_LOG</span><span class="p">(</span><span class="n">LogSimpleApp</span><span class="p">,</span> <span class="n">Warning</span><span class="p">,</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"Successed"</span><span class="p">));</span>
<span class="n">FString</span> <span class="n">FStringAuthor</span> <span class="o">=</span> <span class="n">JsonParsed</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-></span><span class="n">AsObject</span><span class="p">()</span><span class="o">-></span><span class="n">GetStringField</span><span class="p">(</span><span class="s">"auth</span><span class="err">
</span><span class="s"> UE_LOG(LogSimpleApp, Warning, TEXT("</span><span class="n">author</span> <span class="o">=</span> <span class="o">%</span><span class="n">s</span><span class="s">"),*FStringAuthor);</span><span class="err">
</span><span class="s">}</span><span class="err">
</span></code></pre></div></div>
<h5 id="54-fplatformfilemanager">5.4 FPlatformFileManager</h5>
<p>File Read and Write</p>
<p><code class="language-plaintext highlighter-rouge">#include "PlatformFilemanager.h"</code></p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">FPlatformFileManager</span><span class="o">::</span><span class="n">Get</span><span class="p">()</span><span class="o">-></span><span class="n">GetPlatformFile</span><span class="p">();</span>
</code></pre></div></div>
<h5 id="55-gconfi">5.5 GConfi</h5>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">GConfig</span><span class="o">-></span><span class="n">SetString</span><span class="p">(</span>
<span class="n">TEXT</span><span class="p">(</span><span class="s">"MySection"</span><span class="p">),</span>
<span class="n">TEXT</span><span class="p">(</span><span class="s">"Name"</span><span class="p">),</span>
<span class="n">TEXT</span><span class="p">(</span><span class="s">"Seccy"</span><span class="p">),</span>
<span class="n">FPaths</span><span class="o">::</span><span class="n">GameDir</span><span class="p">()</span><span class="o">/</span> <span class="s">"MyConfig.ini"</span><span class="p">);</span>
<span class="c1">// Read</span>
<span class="n">FString</span> <span class="n">Result</span><span class="p">;</span>
<span class="n">GConfig</span><span class="o">-></span><span class="n">GetString</span><span class="p">(</span>
<span class="n">TEXT</span><span class="p">(</span><span class="s">"MySection"</span><span class="p">),</span>
<span class="n">TEXT</span><span class="p">(</span><span class="s">"Name"</span><span class="p">),</span>
<span class="n">Result</span><span class="p">,</span>
<span class="n">FPaths</span><span class="o">::</span><span class="n">GameDir</span><span class="p">()</span> <span class="o">/</span> <span class="s">"MyConfig.ini"</span><span class="p">);</span>
<span class="n">GConfig</span><span class="o">-></span><span class="n">Flush</span><span class="p">();</span>
</code></pre></div></div>
<h5 id="56-ue_log">5.6 UE_LOG</h5>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">UE_LOG</span><span class="p">(</span><span class="n">LogTemp</span><span class="p">,</span> <span class="n">Warning</span><span class="p">,</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"Hell World"</span><span class="p">));</span>
</code></pre></div></div>
<p>Custom Log Category:</p>
<p><code class="language-plaintext highlighter-rouge">DEFINE_LOG_CATEGORY_STATIC(LogMyCategory,Warning,All);</code></p>
<h5 id="57-strings">5.7 Strings</h5>
<ul>
<li>FName</li>
</ul>
<p>ReadOnly, case-sensitive,</p>
<ul>
<li>FText</li>
</ul>
<p>display and localization</p>
<ul>
<li>FString</li>
</ul>
<p>dynamic memory</p>
<h5 id="58-deprecated">5.8 deprecated</h5>
<h5 id="59-images">5.9 Images</h5>
<p>ImageWrapper</p>
<ul>
<li>CompressedData</li>
<li>RawData</li>
</ul>
<h2 id="second-part--inside-unreal-engine">Second Part : Inside Unreal Engine</h2>
<h3 id="chapter-6--module">Chapter 6 : Module</h3>
<h5 id="61-unrealbuildtoolubt">6.1 UnrealBuildTool(UBT)</h5>
<ul>
<li>Public</li>
<li>Private</li>
<li>.build.cs</li>
</ul>
<p><code class="language-plaintext highlighter-rouge">XXXX_API</code> expose to other class.</p>
<h5 id="62-create-module">6.2 Create Module</h5>
<h5 id="63-ubt-and-uht">6.3 UBT and UHT</h5>
<ul>
<li>UHT -> Reflection</li>
</ul>
<p>Output:</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">.</span><span class="n">generated</span><span class="p">.</span><span class="n">h</span>
<span class="p">.</span><span class="n">generated</span><span class="p">.</span><span class="n">cpp</span>
</code></pre></div></div>
<p><strong>static variables init before main function</strong></p>
<h3 id="chapter-7-core">Chapter 7: Core</h3>
<h5 id="71-memory">7.1 Memory</h5>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">FMalloc</span><span class="o">*</span> <span class="n">FWindowsPlatformMemory</span><span class="o">::</span><span class="n">BaseAllocator</span><span class="p">()</span>
</code></pre></div></div>
<ul>
<li>Malloc(ANSI)</li>
<li>Intel (TBB)</li>
<li>Binned</li>
</ul>
<h5 id="72-init">7.2 Init</h5>
<ul>
<li>Preinit</li>
<li>init</li>
</ul>
<p><code class="language-plaintext highlighter-rouge">FEngineLoop</code></p>
<ul>
<li>MainLoop</li>
</ul>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">!</span><span class="n">GIsRequestingExit</span>
</code></pre></div></div>
<h5 id="73-test">7.3 Test</h5>
<p>/Private</p>
<p>—A.cpp</p>
<p>—/Tests</p>
<p>—–ATest.cpp</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include "PrivatePCH.h"
#include "..."
</span><span class="n">DEFINE_LOG_CATEGORY_STATIC</span><span class="p">(</span><span class="n">TestLog</span><span class="p">,</span> <span class="n">Log</span><span class="p">,</span> <span class="n">All</span><span class="p">);</span>
<span class="n">IMPLEMENT_SIMPLE_AUTOMATION_TEST</span><span class="p">(</span><span class="n">FMultiThreadTest</span><span class="p">,</span> <span class="s">"MyTest.PublicTest</span><span class="err">
</span><span class="s">.MultiThreadTest"</span><span class="p">,</span> <span class="n">EAutomationTestFlags</span><span class="o">::</span><span class="n">EditorContext</span> <span class="o">|</span>
<span class="n">EAutomationTestFlags</span><span class="o">::</span><span class="n">EngineFilter</span><span class="p">)</span>
<span class="n">bool</span> <span class="n">FMultiThreadTest</span><span class="o">::</span><span class="n">RunTest</span><span class="p">(</span><span class="k">const</span> <span class="n">FString</span><span class="o">&</span> <span class="n">Parameters</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">UE_LOG</span><span class="p">(</span><span class="n">TestLog</span><span class="p">,</span> <span class="n">Log</span><span class="p">,</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"Hello"</span><span class="p">));</span>
<span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Window->Develop Tools->Session Frontend->Start Tests</p>
<h6 id="731-thread">7.3.1 Thread</h6>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">FRunnable</span>
</code></pre></div></div>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">TGraphTask</span>
</code></pre></div></div>
<h6 id="732-sync">7.3.2 sync</h6>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Async</span>
</code></pre></div></div>
<h5 id="74-genericplatformprocess">7.4 GenericPlatformProcess</h5>
<p><code class="language-plaintext highlighter-rouge">CreateProc</code></p>
<h3 id="chapter-8-object-moduel-unfinished">Chapter 8: Object Moduel [Unfinished]</h3>
<h4 id="81-uobject">8.1 UObject</h4>
<h4 id="82-actor">8.2 Actor</h4>
<h3 id="chapter-9-render-system">Chapter 9: Render System</h3>
<h4 id="91-render-thread">9.1 Render Thread</h4>
<ul>
<li>Render Thread</li>
<li>Game Thread</li>
</ul>
<p>In <code class="language-plaintext highlighter-rouge">FEngineLoop::PreInit</code> , to init <code class="language-plaintext highlighter-rouge">Render Thread</code>.</p>
<h4 id="92-render-architecture">9.2 Render Architecture</h4>
<ul>
<li>
<p>Deferred Rendering(Default method of rendering)</p>
</li>
<li>
<p>Front Rendering</p>
</li>
</ul>
<p>https://docs.unrealengine.com/5.0/en-US/forward-shading-renderer-in-unreal-engine/</p>
<p>pros and cons</p>
<h2 id="third-part--unreal-engine-extension">Third Part : Unreal Engine Extension</h2>
<p>###</p>
<hr data-content="footnotes" />
<ul>
<li><a href="https://docs.unrealengine.com/5.0/en-US/epic-cplusplus-coding-standard-for-unreal-engine/">epic-cplusplus-coding-standard-for-unreal-engine</a></li>
</ul>Riccardo GraziosiInside Unreal Engine C++ ProgrammingDeferred vs.Frontend Shading2022-10-09T00:00:00+00:002022-10-09T00:00:00+00:00http://beautifularea.cn/0175<h3 id="deferred">Deferred</h3>
<p><strong>Deferred shading</strong> is the default method of rendering lights and materials in Unreal (the other being forward rendering). <strong>Deferred means that the work is moved to a separate pass, instead of being done in each object’s shaders.</strong> This kind of lighting waits for the base pass to accumulate the information about <strong>opaque objects</strong> and their materials into a G-Buffer. Then it resolves the lighting in screen space, in a single pass.</p>
<p><strong>A pass is a set of draw calls executed on the GPU.</strong></p>
<ul>
<li>This approach reduces the performance hit of having multiple overlapping light sources, which is a typical issue in forward rendering.</li>
</ul>
<h3 id="forward">Forward</h3>
<p>When using a forward renderer, all work on dynamic lighting is done in the <strong>base pass</strong>, instead of a separate Lights pass.</p>
<p>This approach gets rid of the G-Buffer, saving GPU memory and making several thing easier (especially anti-aliasing). Don’t be suprised, though, that the cost of the base pass is significantly higher with forward.</p>
<hr data-content="footnotes" />
<ul>
<li><a href="https://docs.unrealengine.com/5.0/en-US/forward-shading-renderer-in-unreal-engine/">Forward Shading Renderer</a></li>
</ul>Riccardo GraziosiDeferred Deferred shading is the default method of rendering lights and materials in Unreal (the other being forward rendering). Deferred means that the work is moved to a separate pass, instead of being done in each object’s shaders. This kind of lighting waits for the base pass to accumulate the information about opaque objects and their materials into a G-Buffer. Then it resolves the lighting in screen space, in a single pass.static vs.dynamic cast2022-10-09T00:00:00+00:002022-10-09T00:00:00+00:00http://beautifularea.cn/0176<p>In general <strong>you use static_cast when you want to convert numeric data types such as enums to ints or ints to floats, and you are certain of the data types involved in the conversion</strong>.</p>
<p>static_cast conversions are not as safe as dynamic_cast conversions, because static_cast does no run-time type check, while dynamic_cast does.</p>
<p>A dynamic_cast to an ambiguous pointer will fail, while a static_cast returns as if nothing were wrong; this can be dangerous. Although dynamic_cast conversions are safer, dynamic_cast only works on pointers or references, and the run-time type check is an overhead.</p>
<hr data-content="footnotes" />
<ul>
<li><a href="https://learn.microsoft.com/en-us/cpp/cpp/static-cast-operator?view=msvc-170">static cast</a></li>
<li><a href="https://learn.microsoft.com/en-us/cpp/cpp/dynamic-cast-operator?view=msvc-170">dynamic cast</a></li>
</ul>Riccardo GraziosiIn general you use static_cast when you want to convert numeric data types such as enums to ints or ints to floats, and you are certain of the data types involved in the conversion.TSubclassOf2022-10-09T00:00:00+00:002022-10-09T00:00:00+00:00http://beautifularea.cn/0177<p>TSubclassOf is a template class that provides UClass type safety.</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/** type of damage */</span>
<span class="n">UPROPERTY</span><span class="p">(</span><span class="n">EditDefaultsOnly</span><span class="p">,</span> <span class="n">Category</span><span class="o">=</span><span class="n">Damage</span><span class="p">)</span>
<span class="n">TSubclassOf</span><span class="o"><</span><span class="n">UDamageType</span><span class="o">></span> <span class="n">DamageType</span><span class="p">;</span>
</code></pre></div></div>
<p>And</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">UClass</span><span class="o">*</span> <span class="n">ClassA</span> <span class="o">=</span> <span class="n">UDamageType</span><span class="o">::</span><span class="n">StaticClass</span><span class="p">();</span>
<span class="n">TSubclassOf</span><span class="o"><</span><span class="n">UDamageType</span><span class="o">></span> <span class="n">ClassB</span><span class="p">;</span>
<span class="n">ClassB</span> <span class="o">=</span> <span class="n">ClassA</span><span class="p">;</span> <span class="c1">// Performs a runtime check</span>
<span class="n">TSubclassOf</span><span class="o"><</span><span class="n">UDamageType_Lava</span><span class="o">></span> <span class="n">ClassC</span><span class="p">;</span>
<span class="n">ClassB</span> <span class="o">=</span> <span class="n">ClassC</span><span class="p">;</span> <span class="c1">// Performs a compile time check</span>
</code></pre></div></div>
<hr data-content="footnotes" />
<ul>
<li><a href="https://docs.unrealengine.com/5.0/en-US/typed-object-pointer-properties-in-unreal-engine/">TSubclassOf</a></li>
</ul>Riccardo GraziosiTSubclassOf is a template class that provides UClass type safety.About side scroller2022-10-09T00:00:00+00:002022-10-09T00:00:00+00:00http://beautifularea.cn/0178<h3 id="core-features">Core Features</h3>
<ul>
<li>Two-D movement : vertical / horizontal</li>
<li>Jump</li>
<li>Power up</li>
<li>Enemy AI</li>
<li>Collectible</li>
</ul>
<hr data-content="footnotes" />
<ul>
<li><a href="https://docs.unrealengine.com/5.0/en-US/epic-cplusplus-coding-standard-for-unreal-engine/">epic-cplusplus-coding-standard-for-unreal-engine</a></li>
</ul>Riccardo GraziosiCore Features Two-D movement : vertical / horizontal Jump Power up Enemy AI CollectibleUE C++ Coding Standard2022-10-08T00:00:00+00:002022-10-08T00:00:00+00:00http://beautifularea.cn/0173<p><strong>When comes to Game Programming, Coding Standard first.</strong></p>
<hr />
<h3 id="naming-conventions">Naming Conventions</h3>
<ul>
<li>Template classes are prefixed by <code class="language-plaintext highlighter-rouge">T</code>.</li>
<li>Classes that inherit from UObject are prefixed by <code class="language-plaintext highlighter-rouge">U</code>.</li>
<li>Classes that inherit from AActor are prefixed by <code class="language-plaintext highlighter-rouge">A</code>.</li>
<li>Classes that inherit from SWidget are prefixed by <code class="language-plaintext highlighter-rouge">S</code>.</li>
<li>Classes that are abstract interfaces are prefixed by <code class="language-plaintext highlighter-rouge">I</code>.</li>
<li>Epic’s concept-alike class types (used as the first argument to the TModels type trait) are prefixed by <code class="language-plaintext highlighter-rouge">C</code>.</li>
<li>Enums are prefixed by <code class="language-plaintext highlighter-rouge">E</code>.</li>
<li>Boolean variables must be prefixed by b (for example, bPendingDestruction, or bHasFadedIn).</li>
<li>Most other classes are prefixed by <code class="language-plaintext highlighter-rouge">F</code>, though some subsystems use other letters.</li>
<li>Typedefs should be prefixed by whatever is appropriate for that type: F if it’s a typedef of a struct, U if it’s a typedef of a UObject and so on.</li>
</ul>
<h3 id="range-for">Range for</h3>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">TMap</span><span class="o"><</span><span class="n">FString</span><span class="p">,</span> <span class="n">int32</span><span class="o">></span> <span class="n">MyMap</span><span class="p">;</span>
<span class="c1">// Old style</span>
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">It</span> <span class="o">=</span> <span class="n">MyMap</span><span class="p">.</span><span class="n">CreateIterator</span><span class="p">();</span> <span class="n">It</span><span class="p">;</span> <span class="o">++</span><span class="n">It</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">UE_LOG</span><span class="p">(</span><span class="n">LogCategory</span><span class="p">,</span> <span class="n">Log</span><span class="p">,</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"Key: %s, Value: %d"</span><span class="p">),</span> <span class="n">It</span><span class="p">.</span><span class="n">Key</span><span class="p">(),</span> <span class="o">*</span><span class="n">It</span><span class="p">.</span><span class="n">Value</span><span class="p">());</span>
<span class="p">}</span>
<span class="c1">// New style</span>
<span class="k">for</span> <span class="p">(</span><span class="n">TPair</span><span class="o"><</span><span class="n">FString</span><span class="p">,</span> <span class="n">int32</span><span class="o">>&</span> <span class="n">Kvp</span> <span class="o">:</span> <span class="n">MyMap</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">UE_LOG</span><span class="p">(</span><span class="n">LogCategory</span><span class="p">,</span> <span class="n">Log</span><span class="p">,</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"Key: %s, Value: %d"</span><span class="p">),</span> <span class="o">*</span><span class="n">Kvp</span><span class="p">.</span><span class="n">Key</span><span class="p">,</span> <span class="n">Kvp</span><span class="p">.</span><span class="n">Value</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="typed-enums">Typed Enums</h3>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Old enum</span>
<span class="n">UENUM</span><span class="p">()</span>
<span class="n">namespace</span> <span class="n">EThing</span>
<span class="p">{</span>
<span class="k">enum</span> <span class="n">Type</span>
<span class="p">{</span>
<span class="n">Thing1</span><span class="p">,</span>
<span class="n">Thing2</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="c1">// New enum</span>
<span class="n">UENUM</span><span class="p">()</span>
<span class="k">enum</span> <span class="n">class</span> <span class="n">EThing</span> <span class="o">:</span> <span class="n">uint8</span>
<span class="p">{</span>
<span class="n">Thing1</span><span class="p">,</span>
<span class="n">Thing2</span>
<span class="p">}</span>
</code></pre></div></div>
<p><strong>enums exposed to Blueprints must continue to be based on uint8.</strong></p>
<h3 id="general-style-issues">General Style Issues</h3>
<ul>
<li>Always use the TEXT() macro around string literals. Without it, code that constructs FStrings from literals will cause an undesirable string conversion process.</li>
<li>Use This: <code class="language-plaintext highlighter-rouge">FShaderType* Ptr</code></li>
<li>Use the virtual and override keywords when declaring an overriding method.</li>
</ul>
<h3 id="platform-specific-code">Platform-Specific Code</h3>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Engine</span><span class="o">/</span><span class="n">Platforms</span><span class="o">/</span><span class="p">[</span><span class="n">PLATFORM</span><span class="p">]</span><span class="o">/</span><span class="n">Source</span><span class="o">/</span><span class="n">Runtime</span><span class="o">/</span><span class="n">Core</span><span class="o">/</span><span class="n">Private</span><span class="o">/</span><span class="p">[</span><span class="n">PLATFORM</span><span class="p">]</span><span class="n">PlatformMemory</span><span class="p">.</span><span class="n">cpp</span>
</code></pre></div></div>
<hr data-content="footnotes" />
<ul>
<li><a href="https://docs.unrealengine.com/5.0/en-US/epic-cplusplus-coding-standard-for-unreal-engine/">epic-cplusplus-coding-standard-for-unreal-engine</a></li>
</ul>Riccardo GraziosiWhen comes to Game Programming, Coding Standard first.2 >&12022-03-29T00:00:00+00:002022-03-29T00:00:00+00:00http://beautifularea.cn/0172<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0 is stdin
1 is stdout
2 is stderr
</code></pre></div></div>
<p>at first, 2>1 may look like a good way to redirect stderr to stdout. However, it will actually be interpreted as “redirect stderr to a file named 1”. & indicates that what follows and precedes is a file descriptor and not a filename. So the construct becomes: 2>&1.</p>Riccardo Graziosi0 is stdin 1 is stdout 2 is stderrpatterns & tips2022-03-11T00:00:00+00:002022-03-11T00:00:00+00:00http://beautifularea.cn/0171<p>patterns & tips</p>
<ul>
<li>Divide-and-Conquer: Can you divide the problem into two or more smaller independent subproblems and solve the original problem using solutions to the subproblems?</li>
<li>Recursion, dynamic programming: If you have access to solutions for smaller instances of a given problem, can you easily construct a solution to the problem?</li>
<li>Case analysis: Can you split the input/execution into number of cases and solve each case in isolation?</li>
<li>Generalization: Is there a problem that subsumes your problem and is easier to solve?</li>
<li>Data-structures: Is there a data-structure that directly maps to the given problem?</li>
<li>Iterative refinement: Most problems can be solved using brute-force approach. Can you formalize such a solution and improve upon it.</li>
<li>Small examples: Can you find a solution to small concrete instances of the problem and then build a solution that can be generalized to arbitrary instances?</li>
<li>Reduction: Can you use a problem with a known solution as a subroutine?</li>
<li>Graph modeling: Can you describe your problem using a graph and solve it using an existing algorithm?</li>
<li>Write an equation: Can you express relationships in your problem in the form of equations (or inequalities)?</li>
<li>Auxiliary elements: Can you add some new element to your problem to get closer to a solution?</li>
<li>Variation: Can you solve a slightly different problem and map its solution to your problem?</li>
<li>Parallelism: Can you decompose your problem into subproblems that can be solved independently on different machines?</li>
<li>Caching: Can you store some of your computation and look it up later to save work?</li>
<li>Symmetry: Is there symmetry in the input space or solution space that can be exploited?</li>
</ul>Riccardo Graziosipatterns & tipsSkeleton of a pallet2022-02-24T00:00:00+00:002022-02-24T00:00:00+00:00http://beautifularea.cn/0170<p>A FRAME pallet is composed of 7 sections:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. Imports and Dependencies
2. Declaration of the Pallet type
3. Runtime Configuration Trait
4. Runtime Storage
5. Runtime Events
6. Hooks
7. Extrinsics
</code></pre></div></div>
<p>An example is as follows:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// 1. Imports and Dependencies
pub use pallet::*;
#[frame_support::pallet]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
// 2. Declaration of the Pallet type
// This is a placeholder to implement traits and methods.
#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
#[pallet::generate_storage_info]
pub struct Pallet<T>(_);
// 3. Runtime Configuration Trait
// All types and constants go here.
// Use #[pallet::constant] and #[pallet::extra_constants]
// to pass in values to metadata.
#[pallet::config]
pub trait Config: frame_system::Config { ... }
// 4. Runtime Storage
// Use to declare storage items.
#[pallet::storage]
#[pallet::getter(fn something)]
pub MyStorage<T: Config> = StorageValue<_, u32>;
// 5. Runtime Events
// Can stringify event types to metadata.
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> { ... }
// 6. Hooks
// Define some logic that should be executed
// regularly in some context, for e.g. on_initialize.
#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> { ... }
// 7. Extrinsics
// Functions that are callable from outside the runtime.
#[pallet::call]
impl<T:Config> Pallet<T> { ... }
}
</code></pre></div></div>
<ul>
<li>Refer to the <a href="https://docs.substrate.io/v3/runtime/macros/#substrate-runtime-macros">Substrate Runtime Macros</a> to learn more about adding functionality to a FRAME pallet.</li>
</ul>Riccardo GraziosiA FRAME pallet is composed of 7 sections: 1. Imports and Dependencies 2. Declaration of the Pallet type 3. Runtime Configuration Trait 4. Runtime Storage 5. Runtime Events 6. Hooks 7. Extrinsics