<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Datbq  - ARROW Technologies Blog]]></title><description><![CDATA[Trang tổng hợp các kiến thức về lập trình]]></description><link>https://blog.arrow-tech.vn/</link><image><url>https://blog.arrow-tech.vn/favicon.png</url><title>Datbq  - ARROW Technologies Blog</title><link>https://blog.arrow-tech.vn/</link></image><generator>Ghost 5.81</generator><lastBuildDate>Wed, 15 Apr 2026 02:00:22 GMT</lastBuildDate><atom:link href="https://blog.arrow-tech.vn/author/datbq/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[[Unity] Hướng dẫn làm biến dạng và tô màu mesh (Deform & paint color on mesh) runtime trên mobile (p2)]]></title><description><![CDATA[Trong phần 2, mình sẽ hướng dẫn 2 bước còn lại là tô màu xung quanh vị trí làm lõm và update lại collider cho mesh.]]></description><link>https://blog.arrow-tech.vn/unity-huong-dan-lam-bien-dang-va-to-mau-mesh-deform-paint-color-on-mesh-runtime-tren-mobile-p2/</link><guid isPermaLink="false">63915acd7a2f410001205db5</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Wed, 05 Sep 2018 08:48:12 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/09/687474703a2f2f696d672e796f75747562652e636f6d2f76692f5457474b355551364b73552f302e6a7067.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.arrow-tech.vn/content/images/2018/09/687474703a2f2f696d672e796f75747562652e636f6d2f76692f5457474b355551364b73552f302e6a7067.jpeg" alt="[Unity] H&#x1B0;&#x1EDB;ng d&#x1EAB;n l&#xE0;m bi&#x1EBF;n d&#x1EA1;ng v&#xE0; t&#xF4; m&#xE0;u mesh (Deform &amp; paint color on mesh) runtime tr&#xEA;n mobile (p2)"><p><a href="https://blog.arrow-tech.vn/unity-mesh-deformation-bien-dang-mesh-runtime-tren-mobile/">[Unity] H&#x1B0;&#x1EDB;ng d&#x1EAB;n l&#xE0;m bi&#x1EBF;n d&#x1EA1;ng v&#xE0; t&#xF4; m&#xE0;u mesh (Deform &amp; paint color on mesh) runtime tr&#xEA;n mobile (p1)</a></p>
<blockquote>
<p>Trong ph&#x1EA7;n 2, m&#xEC;nh s&#x1EBD; h&#x1B0;&#x1EDB;ng d&#x1EAB;n 2 b&#x1B0;&#x1EDB;c c&#xF2;n l&#x1EA1;i l&#xE0; t&#xF4; m&#xE0;u xung quanh v&#x1ECB; tr&#xED; l&#xE0;m l&#xF5;m v&#xE0; update l&#x1EA1;i collider cho mesh.</p>
</blockquote>
<p><strong>T&#xF4; m&#xE0;u xung quanh v&#x1ECB; tr&#xED; l&#xE0;m l&#xF5;m</strong></p>
<p>C&#xF3; nhi&#x1EC1;u c&#xE1;ch &#x111;&#x1EC3; t&#xF4; m&#xE0;u l&#xEA;n texture trong real time. Tuy nhi&#xEA;n, &#x111;&#x1EC3; s&#x1EED; d&#x1EE5;ng &#x111;&#x1B0;&#x1EE3;c tr&#xEA;n low-end device th&#xEC; kh&#xF4;ng c&#xF3; nhi&#x1EC1;u c&#xE1;ch c&#xF3; th&#x1EC3; th&#x1EF1;c hi&#x1EC7;n. Trong b&#xE0;i vi&#x1EBF;t n&#xE0;y, m&#xEC;nh s&#x1EBD; h&#x1B0;&#x1EDB;ng d&#x1EAB;n c&#xE1;ch s&#x1EED; d&#x1EE5;ng RenderTexture.<br>
RenderTexture l&#xE0; m&#x1ED9;t lo&#x1EA1;i Texture &#x111;&#x1EB7;c bi&#x1EC7;t cho ph&#xE9;p t&#x1EA1;o v&#xE0; update runtime. &#x110;&#x1EC3; s&#x1EED; d&#x1EE5;ng n&#xF3;, b&#x1EA1;n c&#x1EA7;n t&#x1EA1;o v&#xE0; ch&#x1EC9; &#x111;&#x1ECB;nh m&#x1ED9;t camera render v&#xE0;o n&#xF3;. RenderTexture hi&#x1EC3;n th&#x1ECB; nh&#x1EEF;ng g&#xEC; camera (m&#xE0; n&#xF3; g&#x1EAF;n v&#xE0;o) render ra trong real time.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/09/Inspector-RenderTexture.png" alt="[Unity] H&#x1B0;&#x1EDB;ng d&#x1EAB;n l&#xE0;m bi&#x1EBF;n d&#x1EA1;ng v&#xE0; t&#xF4; m&#xE0;u mesh (Deform &amp; paint color on mesh) runtime tr&#xEA;n mobile (p2)" loading="lazy"><br>
&#x110;&#x1EC3; l&#xE0;m &#x111;&#x1B0;&#x1EE3;c &#x111;i&#x1EC1;u n&#xE0;y, ch&#xFA;ng ta c&#x1EA7;n th&#x1EF1;c hi&#x1EC7;n 2 vi&#x1EC7;c:</p>
<ul>
<li>T&#xEC;m to&#x1EA1; &#x111;&#x1ED9; uv map c&#x1EE7;a texture terrain d&#x1EF1;a tr&#xEA;n &#x111;i&#x1EC3;m va ch&#x1EA1;m.</li>
<li>T&#xF4; m&#xE0;u l&#xEA;n texture l&#xFA;c runtime d&#x1EF1;a tr&#xEA;n RenderTexture.</li>
</ul>
<p><strong>1. T&#xEC;m to&#x1EA1; &#x111;&#x1ED9; uv map d&#x1EF1;a tr&#xEA;n &#x111;i&#x1EC3;m va ch&#x1EA1;m</strong><br>
&#x110;&#x1EA7;u ti&#xEA;n, b&#x1EA1;n c&#x1EA7;n t&#x1EA1;o m&#x1ED9;t RenderTexture. T&#x1EA1;i Project, chu&#x1ED9;t ph&#x1EA3;i ch&#x1ECD;n Create v&#xE0; t&#xEC;m &#x111;&#x1EBF;n ph&#x1EA7;n RenderTexture. &#x110;&#x1EC3; s&#x1EED; d&#x1EE5;ng RenderTexture, ch&#xFA;ng ta s&#x1EBD; c&#x1EA7;n m&#x1ED9;t Camera th&#x1EE9; 2 &#x111;&#x1EC3; ch&#x1EC9; &#x111;&#x1ECB;nh render v&#xE0;o n&#xF3;. Ch&#xFA;ng ta s&#x1EBD; s&#x1EED; d&#x1EE5;ng m&#x1ED9;t Camera v&#x1EDB;i ph&#xE9;p chi&#x1EBF;u tr&#x1EF1;c giao (orthographic projection). T&#x1EA1;i Component Camera, g&#x1EAF;n RenderTexture v&#xE0;o m&#x1EE5;c Target Texture.<br>
T&#x1EA1;o m&#x1ED9;t empty Gameobject v&#xE0; g&#xE1;n script <strong>PaintingTexture.cs</strong>:</p>
<pre><code>public Camera canvasCam;
private Vector2 uvCoord;
private bool HitTestUVPosition(ref Vector3 uvWorldPosition)
{
    if (uvCoord != Vector2.zero)
    {
        uvWorldPosition.x = uvCoord.x - canvasCam.orthographicSize;//To center the UV on X
        uvWorldPosition.y = uvCoord.y - canvasCam.orthographicSize;//To center the UV on Y
        uvWorldPosition.z = 0.0f;
        return true;
    }
    else return false;
}

public void SetUVCoordCollider(Vector2 _uvCoord)
{
    uvCoord = _uvCoord;
}
</code></pre>
<p>H&#xE0;m <strong>HitTestUVPosition()</strong> s&#x1EBD; tr&#x1EA3; v&#x1EC1; to&#x1EA1; &#x111;&#x1ED9; uv map t&#x1EEB; to&#x1EA1; &#x111;&#x1ED9; uv c&#x1EE7;a texture t&#x1EA1;i n&#x1A1;i va ch&#x1EA1;m.<br>
Quay tr&#x1EDF; l&#x1EA1;i script <strong>PhysicsDeformer.cs</strong>, ch&#xFA;ng ta s&#x1EBD; vi&#x1EBF;t ti&#x1EBF;p code &#x111;&#x1EC3; t&#xED;nh to&#xE1;n to&#x1EA1; &#x111;&#x1ED9; uv c&#x1EE7;a texture t&#x1EA1;i n&#x1A1;i va ch&#x1EA1;m:</p>
<pre><code>private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag(&quot;Terrain&quot;))
    {
        ContactPoint[] contacts = collision.contacts;
        foreach(ContactPoint contact in contacts)
        {
            deformableMesh.AddDepression(contact.point, collisionRadius);
        }
        Vector3 minusNormal = collision.contacts[0].normal;
        minusNormal.y = -collision.contacts[0].normal.y;
        Ray ray = new Ray(collisionTerrainPoint + collision.contacts[0].normal * 0.01f, minusNormal);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 10f, LayerMask.GetMask(&quot;Terrain&quot;)))
        {
            paintScript.SetUVCoordCollider(hit.textureCoord);
        }
    }
}
</code></pre>
<p><strong>2. T&#xF4; m&#xE0;u l&#xEA;n texture runtime d&#x1EF1;a tr&#xEA;n RenderTexture</strong><br>
K&#xE9;o texture c&#x1EE7;a Terrain v&#xE0;o ph&#x1EA1;m vi render c&#x1EE7;a orthogaphic Camera, scale n&#xF3; sao cho k&#xED;ch th&#x1B0;&#x1EDB;c c&#x1EE7;a n&#xF3; v&#x1EEB;a b&#x1EB1;ng ph&#x1EA1;m vi render c&#x1EE7;a orthographic Camera.<br>
T&#x1EA1;o m&#x1ED9;t empty Gameobject, &#x111;&#x1EB7;t t&#xEA;n l&#xE0; <strong>&quot;BrushContainer&quot;</strong>, sau &#x111;&#xF3; k&#xE9;o n&#xF3; &#x1EDF; gi&#x1EEF;a camera v&#xE0; texture c&#x1EE7;a Terrain. Gameobject n&#xE0;y s&#x1EBD; l&#xE0; n&#x1A1;i ch&#x1EE9;a c&#xE1;c gameobject m&#xE0;u m&#xE0; ch&#xFA;ng ta s&#x1EBD; t&#xF4; l&#xEA;n Terrain nh&#x1B0; h&#xEC;nh sau:<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/09/2018-09-05_14-26-42.jpg" alt="[Unity] H&#x1B0;&#x1EDB;ng d&#x1EAB;n l&#xE0;m bi&#x1EBF;n d&#x1EA1;ng v&#xE0; t&#xF4; m&#xE0;u mesh (Deform &amp; paint color on mesh) runtime tr&#xEA;n mobile (p2)" loading="lazy"><br>
&#x110;&#x1EC3; t&#xF4; m&#xE0;u l&#xEA;n texture, ch&#xFA;ng ta s&#x1EBD; s&#x1EED; d&#x1EE5;ng 1 sprite nh&#x1B0; m&#x1ED9;t brush, v&#xE0; t&#x1EA1;o c&#xE1;c brush t&#x1EA1;i v&#x1ECB; tr&#xED; uv map ch&#xFA;ng ta &#x111;&#xE3; l&#x1EA5;y &#x111;&#x1B0;&#x1EE3;c b&#xEA;n tr&#xEA;n. C&#xE1;c brush s&#x1EBD; l&#xE0; c&#xE1;c object con c&#x1EE7;a <strong>BrushContainer</strong>. Khi camera render l&#xEA;n RenderTexture, c&#xE1;c brush s&#x1EBD; n&#x1EB1;m &#x111;&#xE8; l&#xEA;n texture v&#xE0; k&#x1EBF;t qu&#x1EA3; c&#x1EE7;a RenderTexture s&#x1EBD; gi&#x1ED1;ng nh&#x1B0; trong Camera Review ch&#xFA;ng ta nh&#xEC;n th&#x1EA5;y &#x1EDF; h&#xEC;nh &#x1EA3;nh tr&#xEA;n.<br>
&#x110;&#x1EC3; th&#x1EA5;y &#x111;&#x1B0;&#x1EE3;c k&#x1EBF;t qu&#x1EA3;, b&#x1EA1;n h&#xE3;y g&#xE1;n RenderTexture t&#x1EA1;i material c&#x1EE7;a Terrain.<br>
C&#xE1;c b&#x1EA1;n c&#xF3; th&#x1EC3; t&#x1EA3;i brush ho&#x1EB7;c t&#xEC;m ki&#x1EBF;m c&#xE1;c h&#xEC;nh &#x1EA3;nh t&#x1B0;&#x1A1;ng t&#x1EF1;.<br>
<a href="https://drive.google.com/file/d/1SzGraDkKj-gwQGJViLy_5NAzwsgO4B5g/view?usp=sharing&amp;ref=blog.arrow-tech.vn">T&#x1EA3;i h&#xEC;nh brush</a><br>
K&#xE9;o h&#xEC;nh &#x1EA3;nh brush v&#xE0;o scene v&#xE0; t&#x1EA1;o prefab cho n&#xF3;, sau &#x111;&#xF3; xo&#xE1; h&#xEC;nh &#x1EA3;nh brush tr&#xEA;n. Ch&#xFA;ng ta s&#x1EBD; t&#x1EA1;o brush t&#x1EEB; prefab &#x111;&#xF3;. &#x110;&#x1EB7;t prefab v&#xE0;o trong th&#x1B0; m&#x1EE5;c <strong>Resources</strong>.<br>
&#x110;&#x1EC3; t&#x1EA1;o c&#xE1;c brush, h&#xE3;y quay l&#x1EA1;i script <strong>PaintingTexture.cs</strong> v&#xE0; th&#xEA;m c&#xE1;c d&#xF2;ng sau:</p>
<pre><code>public GameObject brushContainer; //our container for the brushes painted
public float brushSize = 1.0f;
public Color brushColor = Color.grey;
private Object resourceBrush;

void Start()
{
    resourceBrush = Resources.Load(&quot;BrushEntity&quot;); // &#x111;&#x1ECB;a ch&#x1EC9; sau th&#x1B0; m&#x1EE5;c Resources/T&#xEA;n object.
}

void InstantiateNewBrush(Vector2 _uvWorldPos)
{
    GameObject brushObj;
    brushObj = (GameObject)Instantiate(resourceBrush); //Paint a brush
    brushObj.GetComponent&lt;SpriteRenderer&gt;().color = brushColor; //Set the brush color
    brushColor.a = brushSize * 2.0f; // Brushes have alpha to have a merging effect when painted over.
    brushObj.transform.parent = brushContainer.transform; //Add the brush to our container to be wiped later
    brushObj.transform.localPosition = _uvWorldPos; //The position of the brush (in the UVMap)
    brushObj.transform.localScale = Vector3.one * brushSize;//The size of the brush
}
</code></pre>
<p>&#x110;&#xE2;y l&#xE0; h&#xE0;m sinh c&#xE1;c brush t&#x1EA1;i v&#x1ECB; tr&#xED; uv map ch&#xFA;ng ta c&#xF3; &#x111;&#x1B0;&#x1EE3;c &#x1EDF; m&#x1EE5;c 1. Ch&#xFA;ng ta c&#xF3; th&#x1EC3; set m&#xE0;u v&#xE0; k&#xED;ch th&#x1B0;&#x1EDB;c brush t&#x1EA1;i inspector.<br>
Tuy nhi&#xEA;n, ch&#xFA;ng ta c&#x1EA7;n ph&#x1EA3;i l&#x1B0;u &#xFD; khi sinh c&#xE0;ng nhi&#x1EC1;u object, s&#x1ED1; l&#x1B0;&#x1EE3;ng draw call s&#x1EBD; r&#x1EA5;t l&#x1EDB;n, &#x111;i&#x1EC1;u n&#xE0;y s&#x1EBD; &#x1EA3;nh h&#x1B0;&#x1EDF;ng kh&#xE1; nhi&#x1EC1;u &#x111;&#x1EBF;n hi&#x1EC7;u n&#x103;ng. &#x110;&#x1EC3; gi&#x1EA3;i quy&#x1EBF;t n&#xF3;, ch&#xFA;ng ta s&#x1EBD; c&#x1EA7;n gi&#x1EDB;i h&#x1EA1;n s&#x1ED1; l&#x1B0;&#x1EE3;ng brush. Ti&#x1EBF;p t&#x1EE5;c trong script <strong>PaintingTexture.cs</strong>, th&#xEA;m c&#xE1;c d&#xF2;ng sau:</p>
<pre><code>public RenderTexture canvasTexture; // Render Texture that looks at our Base Texture and the painted brushes
public Material baseMaterial; // The material of our base texture (Were we will save the painted texture)
private bool saving;
private int brushCounter = 0;

void Start()
{
    resourceBrush = Resources.Load(&quot;BrushEntity&quot;); // &#x111;&#x1ECB;a ch&#x1EC9; sau th&#x1B0; m&#x1EE5;c Resources/T&#xEA;n object.
    baseMaterial.mainTexture = canvasTexture;
}

//Sets the base material with a our canvas texture, then removes all our brushes
void SaveTexture()
{
    brushCounter = 0;
    RenderTexture.active = canvasTexture;
    Texture2D tex = new Texture2D(canvasTexture.width, canvasTexture.height, TextureFormat.RGB24, false);
    tex.ReadPixels(new Rect(0, 0, canvasTexture.width, canvasTexture.height), 0, 0);
    tex.Apply();
    RenderTexture.active = null;
    baseMaterial.mainTexture = tex; //Put the painted texture as the base
    foreach (Transform child in brushContainer.transform)
    {//Clear brushes
        Destroy(child.gameObject);
    }
    Invoke(&quot;ResetTexture&quot;, 0.1f);
}

void ResetTexture()
{
    saving = false;
}
</code></pre>
<p>Cu&#x1ED1;i c&#xF9;ng, s&#x1EED; d&#x1EE5;ng c&#xE1;c h&#xE0;m ch&#x1EE9;c n&#x103;ng b&#xEA;n tr&#xEA;n &#x111;&#x1EC3; t&#xF4; m&#xE0;u t&#x1EA1;i v&#x1ECB; tr&#xED; l&#xE0;m l&#xF5;m:</p>
<pre><code>const int MAX_BRUSH_COUNT = 1000;
void PaintColor()
{
    if (saving)
        return;
    Vector3 uvWorldPosition = Vector3.zero;
    if (HitTestUVPosition(ref uvWorldPosition))
    {
        InstantiateNewBrush(uvWorldPosition);
    }
    brushCounter++; //Add to the max brushes
    if (brushCounter &gt;= MAX_BRUSH_COUNT)
    { //If we reach the max brushes available, flatten the texture and clear the brushes
        saving = true;
        Invoke(&quot;SaveTexture&quot;, 0.1f);
}
</code></pre>
<p>B&#x1EA1;n c&#xF3; th&#x1EC3; gi&#x1EDB;i h&#x1EA1;n s&#x1ED1; l&#x1B0;&#x1EE3;ng brush. T&#x1EA1;i h&#xE0;m <strong>Update()</strong> h&#xE3;y g&#x1ECD;i h&#xE0;m <strong>PaintColor()</strong> &#x111;&#x1EC3; th&#x1EF1;c hi&#x1EC7;n t&#xF4; m&#xE0;u t&#x1EA1;i real time. Tuy nhi&#xEA;n, tu&#x1EF3; thu&#x1ED9;c v&#xE0;o target device c&#x1EE7;a b&#x1EA1;n, h&#xE3;y gi&#x1EDB;i h&#x1EA1;n t&#x1EA7;n su&#x1EA5;t g&#x1ECD;i h&#xE0;m <strong>PaintColor()</strong>.</p>
<h2 id="updatelicolliderchomeshcaterrain">Update l&#x1EA1;i collider cho mesh c&#x1EE7;a Terrain</h2>
<p>Sau khi l&#xE0;m l&#xF5;m v&#xE0; t&#xF4; m&#xE0;u Terrain, ch&#xFA;ng ta c&#x1EA7;n update l&#x1EA1;i collider cho mesh c&#x1EE7;a Terrain. &#x110;&#x1EC3; update l&#x1EA1;i collider, quay tr&#x1EDF; l&#x1EA1;i h&#xE0;m <strong>DeformableMesh.cs</strong> v&#xE0; th&#xEA;m c&#xE1;c d&#xF2;ng sau:</p>
<pre><code>private MeshCollider meshCollider;

void Start()
{
    meshCollider = GetComponent&lt;MeshCollider&gt;();
    MeshRegenerated();
}

void Update()
{
    if(updateCollider)
    {
        timeUpdate += Time.deltaTime;
    }
    if(timeUpdate &gt;3)
    {
        UpdateMeshCollider();
        updateCollider = false;
        timeUpdate = 0;
    }
}

private void UpdateMeshCollider()
{
    meshCollider.sharedMesh = null;
    meshCollider.sharedMesh = meshFilter.mesh;
}
</code></pre>
<p>C&#xF4;ng vi&#x1EC7;c th&#x1EF1;c hi&#x1EC7;n update l&#x1EA1;i mesh collider kh&#xE1; t&#x1ED1;n t&#xE0;i nguy&#xEA;n. Do v&#x1EAD;y, vi&#x1EC7;c n&#xE0;y kh&#xF4;ng th&#x1EC3; &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n m&#x1ED9;t c&#xE1;ch th&#x1B0;&#x1EDD;ng xuy&#xEA;n v&#xE0; ch&#xFA;ng ta c&#x169;ng n&#xEA;n tr&#xE1;nh g&#x1ECD;i n&#xF3; c&#xF9;ng l&#xFA;c v&#x1EDB;i c&#xE1;c c&#xF4;ng vi&#x1EC7;c l&#xE0;m l&#xF5;m v&#xE0; t&#xF4; m&#xE0;u.<br>
Cu&#x1ED1;i c&#xF9;ng, th&#xEA;m d&#xF2;ng</p>
<pre><code>updateCollider = true;
</code></pre>
<p>v&#xE0;o trong h&#xE0;m <strong>AddDepression()</strong> &#x111;&#x1EC3; x&#xE1;c &#x111;&#x1ECB;nh th&#x1EDD;i &#x111;i&#x1EC3;m update mesh collider.</p>
<h2 id="tiliuthamkho">T&#xE0;i li&#x1EC7;u tham kh&#x1EA3;o</h2>
<p><a href="https://codeartist.mx/dynamic-texture-painting/?ref=blog.arrow-tech.vn">https://codeartist.mx/dynamic-texture-painting/</a><br>
<a href="https://www.youtube.com/watch?v=l_2uGpjBMl4&amp;ref=blog.arrow-tech.vn">https://www.youtube.com/watch?v=l_2uGpjBMl4</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity] Hướng dẫn làm biến dạng và tô màu mesh (Deform & paint color on mesh)  runtime trên mobile (p1)]]></title><description><![CDATA[Bài viết này sẽ hướng dẫn cách làm biến dạng mesh trong khi chạy runtime và sử dụng được trên các low-end device. Mình sẽ tạo hiệu ứng lõm Terrain khi xúc đất.]]></description><link>https://blog.arrow-tech.vn/unity-mesh-deformation-bien-dang-mesh-runtime-tren-mobile/</link><guid isPermaLink="false">63915acd7a2f410001205db4</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Wed, 05 Sep 2018 03:55:12 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/09/picture-27.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<img src="https://blog.arrow-tech.vn/content/images/2018/09/picture-27.png" alt="[Unity] H&#x1B0;&#x1EDB;ng d&#x1EAB;n l&#xE0;m bi&#x1EBF;n d&#x1EA1;ng v&#xE0; t&#xF4; m&#xE0;u mesh (Deform &amp; paint color on mesh)  runtime tr&#xEA;n mobile (p1)"><p>B&#xE0;i vi&#x1EBF;t n&#xE0;y s&#x1EBD; h&#x1B0;&#x1EDB;ng d&#x1EAB;n c&#xE1;ch l&#xE0;m bi&#x1EBF;n d&#x1EA1;ng mesh trong khi ch&#x1EA1;y runtime v&#xE0; s&#x1EED; d&#x1EE5;ng &#x111;&#x1B0;&#x1EE3;c tr&#xEA;n c&#xE1;c low-end device. C&#x1EE5; th&#x1EC3;, trong b&#xE0;i vi&#x1EBF;t n&#xE0;y m&#xEC;nh s&#x1EBD; t&#x1EA1;o hi&#x1EC7;u &#x1EE9;ng l&#xF5;m Terrain (c&#xF3; mesh nh&#x1B0; m&#x1ED9;t model 3D - kh&#xF4;ng ph&#x1EA3;i built-in Terrain c&#x1EE7;a Unity) khi x&#xFA;c &#x111;&#x1EA5;t.</p>
</blockquote>
<h2 id="tngquan">T&#x1ED5;ng quan</h2>
<p>&#x110;&#x1EC3; t&#x1EA1;o &#x111;&#x1B0;&#x1EE3;c hi&#x1EC7;u &#x1EE9;ng n&#xE0;y, ch&#xFA;ng ta c&#x1EA7;n ph&#x1EA3;i x&#x1EED; l&#xFD; 3 b&#x1B0;&#x1EDB;c:</p>
<ul>
<li>B&#x1B0;&#x1EDB;c 1: Th&#x1EF1;c hi&#x1EC7;n l&#xE0;m l&#xF5;m mesh khi x&#xFA;c &#x111;&#x1EA5;t.</li>
<li>B&#x1B0;&#x1EDB;c 2: T&#xF4; m&#xE0;u xung quanh v&#x1ECB; tr&#xED; l&#xE0;m l&#xF5;m.<br>
Khi x&#xFA;c &#x111;&#x1EA5;t, n&#x1EC1;n &#x111;&#x1EA5;t b&#xEA;n d&#x1B0;&#x1EDB;i kh&#xF4;ng th&#x1EC3; gi&#x1ED1;ng nh&#x1B0; b&#x1EC1; m&#x1EB7;t &#x111;&#x1EA5;t tr&#x1B0;&#x1EDB;c khi x&#xFA;c &#x111;&#x1B0;&#x1EE3;c.</li>
<li>B&#x1B0;&#x1EDB;c 3: Sau khi l&#xE0;m l&#xF5;m, ch&#xFA;ng ta c&#x1EA7;n ph&#x1EA3;i update l&#x1EA1;i collider cho mesh.<br>
Khi ch&#xFA;ng ta di chuy&#x1EC3;n t&#x1EDB;i khu v&#x1EF1;c b&#x1ECB; l&#xE0;m l&#xF5;m, kh&#xF4;ng th&#x1EC3; &#x111;&#x1EE9;ng nh&#x1B0; tr&#xEA;n &#x111;&#x1EA5;t b&#x1EB1;ng nh&#x1B0; tr&#x1B0;&#x1EDB;c khi x&#xFA;c.</li>
</ul>
<h2 id="thchinlmlmmesh">Th&#x1EF1;c hi&#x1EC7;n l&#xE0;m l&#xF5;m mesh</h2>
<p>T&#x1EA1;o script <strong>DeformableMesh.cs</strong> v&#xE0; g&#x1EAF;n v&#xE0;o Terrain.</p>
<pre><code>public float maximumDepression;
private MeshFilter meshFilter;
private List&lt;Vector3&gt; originalVertices;
private List&lt;Vector3&gt; modifiedVertices;

void Start()
{
    MeshRegenerated();  
}

void MeshRegenerated()
{
    meshFilter = GetComponent&lt;MeshFilter&gt;();
    meshFilter.mesh.MarkDynamic();
    originalVertices = meshFilter.mesh.vertices.ToList();
    modifiedVertices = meshFilter.mesh.vertices.ToList();
}

public void AddDepression(Vector3 depressionPoint, float radius)
{
    var worldPos4 = this.transform.worldToLocalMatrix * depressionPoint;
    var worldPos = new Vector3(worldPos4.x, worldPos4.y, worldPos4.z);
    for (int i = 0; i &lt; modifiedVertices.Count; ++i)
    {
        var distance = (worldPos - (modifiedVertices[i] + Vector3.down * maximumDepression)).magnitude;
        if (distance &lt; radius)
        {
            var newVert = originalVertices[i] + Vector3.down * maximumDepression;
            modifiedVertices.RemoveAt(i);
            modifiedVertices.Insert(i, newVert);
        }
    }
    meshFilter.mesh.SetVertices(modifiedVertices);
}
</code></pre>
<p>Trong &#x111;&#xF3;, <strong>maximumDepression</strong> l&#xE0; &#x111;&#x1ED9; s&#xE2;u l&#x1EDB;n nh&#x1EA5;t m&#xE0; mesh b&#x1ECB; bi&#x1EBF;n d&#x1EA1;ng.<br>
B&#x1EA3;n ch&#x1EA5;t c&#x1EE7;a h&#xE0;m <strong>Addpression()</strong> l&#xE0; duy&#x1EC7;t qua list t&#x1EA5;t c&#x1EA3; c&#xE1;c &#x111;&#x1EC9;nh c&#x1EE7;a mesh, sau &#x111;&#xF3; t&#xED;nh to&#xE1;n c&#xE1;c &#x111;&#x1EC9;nh n&#xE0;o s&#x1EBD; b&#x1ECB; bi&#x1EBF;n d&#x1EA1;ng d&#x1EF1;a tr&#xEA;n &#x111;i&#x1EC3;m va ch&#x1EA1;m depressionPoint, radius v&#xE0; c&#x1EAD;p nh&#x1EAD;t l&#x1EA1;i d&#x1EEF; li&#x1EC7;u &#x111;&#x1EC9;nh c&#x1EE7;a mesh. Do v&#x1EAD;y, &#x1EA3;nh h&#x1B0;&#x1EDF;ng c&#x1EE7;a script n&#xE0;y &#x111;&#x1EBF;n hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng s&#x1EBD; ph&#x1EE5; thu&#x1ED9;c v&#xE0;o t&#x1EA7;n su&#x1EA5;t n&#xF3; &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i v&#xE0; s&#x1ED1; &#x111;&#x1EC9;nh c&#x1EE7;a Terrain. Terrain c&#xE0;ng ph&#x1EE9;c t&#x1EA1;p th&#xEC; &#x1EA3;nh h&#x1B0;&#x1EDF;ng c&#x1EE7;a n&#xF3; &#x111;&#x1EBF;n hi&#x1EC7;u n&#x103;ng c&#xE0;ng l&#x1EDB;n. V&#xEC; v&#x1EAD;y, b&#x1EA1;n s&#x1EBD; c&#x1EA7;n ph&#x1EA3;i ch&#xFA; &#xFD; &#x111;&#x1EBF;n s&#x1ED1; verts c&#x1EE7;a Terrain v&#xE0; t&#xEC;m c&#xE1;c c&#xE1;ch &#x111;&#x1EC3; gi&#x1EA3;m thi&#x1EC3;u n&#xF3;.</p>
<p>Ti&#x1EBF;p theo, t&#x1EA1;o script <strong>PhysicsDeformer.cs</strong> v&#xE0; g&#x1EAF;n v&#xE0;o object va ch&#x1EA1;m v&#x1EDB;i Terrain m&#xE0; c&#x1EA7;n t&#x1EA1;o hi&#x1EC7;u &#x1EE9;ng n&#xE0;y.</p>
<pre><code>public float collisionRadius = 0.1f;
public DeformableMesh deformableMesh;
private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag(&quot;Terrain&quot;))
    {
        ContactPoint[] contacts = collision.contacts;
        foreach(ContactPoint contact in contacts)
        {
            deformableMesh.AddDepression(contact.point, collisionRadius);
        }
    }
}
</code></pre>
<p>Script n&#xE0;y &#x111;&#x1A1;n gi&#x1EA3;n l&#xE0; t&#xEC;m &#x111;i&#x1EC3;m va ch&#x1EA1;m gi&#x1EEF;a object g&#x1EAF;n n&#xF3; v&#xE0; Terrain. <strong>collisionRadius</strong> s&#x1EBD; quy&#x1EBF;t &#x111;&#x1ECB;nh b&#xE1;n k&#xED;nh l&#xE0;m l&#xF5;m t&#x1EA1;i &#x111;i&#x1EC3;m va ch&#x1EA1;m ( s&#x1ED1; l&#x1B0;&#x1EE3;ng c&#xE1;c &#x111;&#x1EC9;nh b&#x1ECB; l&#xE0;m l&#xF5;m xung quanh &#x111;i&#x1EC3;m va ch&#x1EA1;m). V&#x1EDB;i s&#x1ED1; l&#x1B0;&#x1EE3;ng contact c&#xE0;ng l&#x1EDB;n, t&#x1EA7;n su&#x1EA5;t g&#x1ECD;i h&#xE0;m <strong>AddDepression()</strong> c&#xE0;ng nhi&#x1EC1;u. Do v&#x1EAD;y, tu&#x1EF3; theo target device c&#x1EE7;a b&#x1EA1;n m&#xE0; tu&#x1EF3; ch&#x1EC9;nh t&#x1EA7;n su&#x1EA5;t g&#x1ECD;i h&#xE0;m. &#x110;&#x1ED1;i v&#x1EDB;i c&#xE1;c low-end device, b&#x1EA1;n c&#xF3; th&#x1EC3; ch&#x1EC9; g&#x1ECD;i h&#xE0;m 1 l&#x1EA7;n b&#x1EB1;ng thay <strong>contact.point = collision.contacts[0].point</strong> ( &#x111;i&#x1EC3;m va ch&#x1EA1;m &#x111;&#x1EA7;u ti&#xEA;n).</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity Series 6] Tối ưu hiệu năng Ứng dụng game Unity - Tối ưu GPU (tiếp)]]></title><description><![CDATA[Trong phần tiếp theo của Series tối ưu ứng dụng game Unity mình sẽ tiếp tục các phương pháp về 2 vấn đề còn lại là Memory Bandwidth và Vertex Processing.
]]></description><link>https://blog.arrow-tech.vn/unity-series-6-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-gpu-tiep/</link><guid isPermaLink="false">63915acd7a2f410001205da3</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Thu, 18 Jan 2018 09:42:06 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-7.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-7.jpg" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)"><p><a href="https://blog.arrow-tech.vn/unity-series-5-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-gpu/">[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU</a></p>
<blockquote>
<p>Trong ph&#x1EA7;n tr&#x1B0;&#x1EDB;c, m&#xEC;nh &#x111;&#xE3; gi&#x1EDB;i thi&#x1EC7;u c&#x1EE5; th&#x1EC3; c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u GPU khi g&#x1EB7;p v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; Fill rate. Trong ph&#x1EA7;n n&#xE0;y m&#xEC;nh s&#x1EBD; ti&#x1EBF;p t&#x1EE5;c c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p v&#x1EC1; 2 v&#x1EA5;n &#x111;&#x1EC1; c&#xF2;n l&#x1EA1;i l&#xE0; Memory Bandwidth v&#xE0; Vertex Processing.</p>
</blockquote>
<h2 id="memorybandwidth">Memory Bandwidth</h2>
<p>Memory Bandwidth (B&#x103;ng th&#xF4;ng b&#x1ED9; nh&#x1EDB;) &#x111;&#x1EC1; c&#x1EAD;p &#x111;&#x1EBF;n t&#x1EC9; l&#x1EC7; &#x111;&#x1ECD;c v&#xE0; ghi c&#x1EE7;a GPU v&#xE0;o b&#x1ED9; nh&#x1EDB; chuy&#xEA;n d&#x1EE5;ng c&#x1EE7;a n&#xF3;. N&#x1EBF;u ch&#xFA;ng ta g&#x1EB7;p v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; Memory Bandwidth, &#x111;i&#x1EC1;u n&#xE0;y c&#xF3; ngh&#x129;a l&#xE0; ch&#xFA;ng ta &#x111;ang s&#x1EED; d&#x1EE5;ng texture qu&#xE1; l&#x1EDB;n khi&#x1EBF;n GPU bound.<br>
&#x110;&#x1EC3; ki&#x1EC3;m tra Memory Bandwidth, b&#x1EA1;n c&#xF3; th&#x1EC3; th&#x1EF1;c hi&#x1EC7;n nh&#x1EEF;ng b&#x1B0;&#x1EDB;c sau:</p>
<ul>
<li>Profile game v&#xE0; note l&#x1EA1;i GPU time.</li>
<li>Th&#x1EED; gi&#x1EA3;m Texure Quality trong Quality Settings.</li>
<li>Profile l&#x1EA1;i game c&#x1EE7;a b&#x1EA1;n v&#xE0; so s&#xE1;nh GPU time &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c note. N&#x1EBF;u hi&#x1EC7;u n&#x103;ng c&#x1EE7;a game &#x111;&#x1B0;&#x1EE3;c c&#x1EA3;i thi&#x1EC7;n th&#xEC; c&#xF3; l&#x1EBD; Memory Bandwidth l&#xE0; v&#x1EA5;n &#x111;&#x1EC1; c&#x1EE7;a b&#x1EA1;n.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic6_1.jpg" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"><br>
&#x110;&#x1EC3; t&#x1ED1;i &#x1B0;u Memory Bandwidth, c&#xF4;ng vi&#x1EC7;c ch&#xFA;ng ta c&#x1EA7;n l&#xE0;m l&#xE0; gi&#x1EA3;m b&#x1ED9; nh&#x1EDB; s&#x1EED; d&#x1EE5;ng cho texture. C&#xF3; m&#x1ED9;t v&#xE0;i c&#xE1;ch th&#x1EF1;c hi&#x1EC7;n &#x111;i&#x1EC1;u n&#xE0;y nh&#x1B0; sau:<br>
<code>Texture compression</code> (n&#xE9;n texture) l&#xE0; m&#x1ED9;t k&#x129; thu&#x1EAD;t cho ph&#xE9;p gi&#x1EA3;m &#x111;&#xE1;ng k&#x1EC3; k&#xED;ch th&#x1B0;&#x1EDB;c texture tr&#xEA;n c&#x1EA3; disk v&#xE0; memory. C&#xF3; nhi&#x1EC1;u lo&#x1EA1;i &#x111;&#x1ECB;nh d&#x1EA1;ng n&#xE9;n texture kh&#xE1;c nhau &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c c&#xE0;i &#x111;&#x1EB7;t s&#x1EB5;n trong unity v&#xE0; m&#x1ED7;i texture s&#x1EBD; c&#xF3; c&#xE1;c c&#xE0;i &#x111;&#x1EB7;t ri&#xEA;ng bi&#x1EC7;t. Theo nguy&#xEA;n t&#x1EAF;c chung, ch&#xFA;ng ta n&#xEA;n s&#x1EED; d&#x1EE5;ng c&#xE1;c h&#xEC;nh th&#x1EE9;c n&#xE9;n Texture b&#x1EA5;t c&#x1EE9; khi n&#xE0;o c&#xF3; th&#x1EC3;. Tuy nhi&#xEA;n, b&#x1EA1;n c&#x169;ng n&#xEA;n th&#x1EED; nghi&#x1EC7;m c&#xE1;c d&#x1EA1;ng n&#xE9;n &#x111;&#x1EC3; t&#xEC;m ra l&#x1EF1;a ch&#x1ECD;n ph&#xF9; h&#x1EE3;p nh&#x1EA5;t cho texture c&#x1EE7;a m&#xEC;nh.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic6_2.jpg" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"><br>
<code>Mipmaps</code> l&#xE0; phi&#xEA;n b&#x1EA3;n c&#xF3; &#x111;&#x1ED9; ph&#xE2;n gi&#x1EA3;i th&#x1EA5;p c&#x1EE7;a texture m&#xE0; Unity c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng cho c&#xE1;c &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng &#x1EDF; xa. N&#x1EBF;u trong Scene c&#x1EE7;a b&#x1EA1;n c&#xF3; nh&#x1EEF;ng &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng c&#xE1;ch xa Camera, b&#x1EA1;n c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng mipmap &#x111;&#x1EC3; gi&#x1EA3;m b&#x1EDB;t c&#xE1;c v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; Memory Bandwidth.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic6_3.jpg" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"><br>
Mipmaps Draw Mode s&#x1EBD; hi&#x1EC3;n th&#x1ECB; k&#xED;ch th&#x1B0;&#x1EDB;c l&#xFD; t&#x1B0;&#x1EDF;ng c&#x1EE7;a texture s&#x1EED; d&#x1EE5;ng m&#x1ED9;t m&#xE3; m&#xE0;u: m&#xE0;u red ch&#x1EC9; ra r&#x1EB1;ng texture n&#xE0;o l&#x1EDB;n h&#x1A1;n c&#x1EA7;n thi&#x1EBF;t v&#xE0; m&#xE0;u blue th&#x1EC3; hi&#x1EC7;n texture n&#xE0;o c&#xF3; th&#x1EC3; l&#x1EDB;n h&#x1A1;n n&#x1EEF;a.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic6_4.jpg" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"></li>
</ul>
<h2 id="vertexprocessing">Vertex Processing</h2>
<p><code>Vertex Processing</code> &#x111;&#x1EC1; c&#x1EAD;p &#x111;&#x1EBF;n c&#xE1;c c&#xF4;ng vi&#x1EC7;c m&#xE0; GPU ph&#x1EA3;i l&#xE0;m &#x111;&#x1EC3; render m&#x1ED7;i Vertex (&#x111;&#x1EC9;nh) trong m&#x1ED9;t mesh. Ph&#xED; t&#x1ED5;n c&#x1EE7;a ho&#x1EA1;t &#x111;&#x1ED9;ng n&#xE0;y b&#x1ECB; t&#xE1;c &#x111;&#x1ED9;ng b&#x1EDF;i 2 y&#x1EBF;u t&#x1ED1;: s&#x1ED1; &#x111;&#x1EC9;nh ph&#x1EA3;i &#x111;&#x1B0;&#x1EE3;c render v&#xE0; s&#x1ED1; l&#x1B0;&#x1EE3;ng c&#xE1;c t&#xED;nh to&#xE1;n &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n tr&#xEA;n m&#x1ED7;i &#x111;&#x1EC9;nh.<br>
N&#x1EBF;u game c&#x1EE7;a b&#x1EA1;n g&#x1EB7;p GPU bound v&#xE0; Fill rate c&#x169;ng nh&#x1B0; Memory Bandwidth kh&#xF4;ng ph&#x1EA3;i l&#xE0; v&#x1EA5;n &#x111;&#x1EC1;, v&#x1EAD;y b&#x1EA1;n n&#xEA;n t&#xEC;m hi&#x1EC3;u c&#xE1;ch t&#x1ED1;i &#x1B0;u Vertex Processing. C&#xE1;ch &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1EA5;t &#x111;&#x1EC3; t&#x1ED1;i &#x1B0;u Vertex Processing l&#xE0; gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng &#x111;&#x1EC9;nh m&#xE0; GPU ph&#x1EA3;i x&#x1EED; l&#xFD;, s&#x1EBD; c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng.<br>
C&#xF3; m&#x1ED9;t v&#xE0;i c&#xE1;ch ti&#x1EBF;p c&#x1EAD;n m&#xE0; ch&#xFA;ng ta c&#xF3; th&#x1EC3; xem x&#xE9;t &#x111;&#x1EBF;n &#x111;&#x1EC3; gi&#xFA;p ch&#xFA;ng ta gi&#x1EA3;m s&#x1ED1; &#x111;&#x1EC9;nh ho&#x1EB7;c s&#x1ED1; t&#xED;nh to&#xE1;n &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n tr&#xEA;n m&#x1ED7;i &#x111;&#x1EC9;nh nh&#x1B0; sau:</p>
<ul>
<li>&#x110;&#x1EA7;u ti&#xEA;n, b&#x1EA1;n n&#xEA;n t&#x1EAD;p trung v&#xE0;o vi&#x1EC7;c gi&#x1EA3;m nh&#x1EEF;ng mesh ph&#x1EE9;c t&#x1EA1;p kh&#xF4;ng c&#x1EA7;n thi&#x1EBF;t. N&#x1EBF;u b&#x1EA1;n &#x111;ang s&#x1EED; d&#x1EE5;ng c&#xE1;c mesh c&#xF3; m&#x1EE9;c &#x111;&#x1ED9; chi ti&#x1EBF;t m&#xE0; kh&#xF4;ng th&#x1EC3; nh&#xEC;n th&#x1EA5;y trong game, ho&#x1EB7;c c&#xE1;c mesh c&#xF3; qu&#xE1; nhi&#x1EC1;u &#x111;&#x1EC9;nh kh&#xF4;ng c&#x1EA7;n thi&#x1EBF;t do sai s&#xF3;t trong vi&#x1EC7;c t&#x1EA1;o ra ch&#xFA;ng, th&#xEC; &#x111;&#xE2;y ch&#xED;nh l&#xE0; c&#xE1;c v&#x1EA5;n &#x111;&#x1EC1; l&#xE0;m l&#xE3;ng ph&#xED; GPU. C&#xE1;ch &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1EA5;t &#x111;&#x1EC3; gi&#x1EA3;m chi ph&#xED; cho vi&#x1EC7;c x&#x1EED; l&#xFD; &#x111;&#x1EC9;nh l&#xE0; t&#x1EA1;o ra c&#xE1;c mesh v&#x1EDB;i s&#x1ED1; &#x111;&#x1EC9;nh &#x111;&#x1B0;&#x1EE3;c gi&#x1EA3;m thi&#x1EC3;u h&#x1EBF;t m&#x1EE9;c c&#xF3; th&#x1EC3; b&#x1EB1;ng c&#xE1;c ph&#x1EA7;n m&#x1EC1;m x&#x1EED; l&#xFD; &#x111;&#x1ED3; ho&#x1EA1; 3D.</li>
<li>B&#x1EA1;n c&#x169;ng c&#xF3; th&#x1EC3; th&#x1EED; nghi&#x1EC7;m v&#x1EDB;i m&#x1ED9;t k&#x129; thu&#x1EAD;t &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>normal mapping</code>. Normal Map l&#xE0; m&#x1ED9;t h&#xEC;nh &#x1EA3;nh &#x111;&#x1B0;&#x1EE3;c th&#xEA;m v&#xE0;o 3D model&#xA0;l&#xE0;m t&#x103;ng &#x111;&#x1ED9; chi ti&#x1EBF;t c&#x1EE7;a model, bao b&#x1ECD;c xung quanh nh&#x1EEF;ng model 3D m&#xE0; b&#x1EA1;n c&#xF3; th&#x1EC3; ch&#x1EC9;nh s&#x1EED;a m&#x1ED9;t s&#x1ED1; thu&#x1ED9;c t&#xED;nh nh&#x1B0; m&#xE0;u s&#x1EAF;c, &#x111;&#x1ED9; trong su&#x1ED1;t, ph&#x1EA3;n chi&#x1EBF;u, v&#xE0; &#x111;&#x1ED9; chi ti&#x1EBF;t. N&#xF3; &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng &#x111;&#x1EC3; t&#x103;ng &#x111;&#x1ED9; chi ti&#x1EBF;t cho c&#xE1;c low-poly model (model c&#xF3; &#x111;&#x1ED9; ph&#xE2;n gi&#x1EA3;i th&#x1EA5;p) trong khi v&#x1EAB;n gi&#x1EEF; &#x111;&#x1B0;&#x1EE3;c dung l&#x1B0;&#x1EE3;ng th&#x1EA5;p.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/BumpMapLowAndHighBumpiness.png" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"><br>
M&#x1EB7;c d&#xF9; s&#x1EED; d&#x1EE5;ng Normal mapping s&#x1EBD; c&#xF3; m&#x1ED9;t &#xED;t ph&#xED; t&#x1ED5;n GPU, tuy nhi&#xEA;n trong h&#x1EA7;u h&#x1EBF;t tr&#x1B0;&#x1EDD;ng h&#x1EE3;p n&#xF3; s&#x1EBD; l&#xE0;m c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u n&#x103;ng.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/BumpMapPutIntoShader.png" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"></li>
<li>N&#x1EBF;u mesh trong game c&#x1EE7;a b&#x1EA1;n kh&#xF4;ng s&#x1EED; d&#x1EE5;ng normal mapping, b&#x1EA1;n c&#xF3; th&#x1EC3; v&#xF4; hi&#x1EC7;u ho&#xE1; vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng <code>Vertex Tangents</code> c&#x1EE7;a mesh &#x1EDF; trong ph&#x1EA7;n Import Setting. &#x110;i&#x1EC1;u n&#xE0;y s&#x1EBD; l&#xE0;m gi&#x1EA3;m l&#x1B0;&#x1EE3;ng d&#x1EEF; li&#x1EC7;u &#x111;&#x1B0;&#x1EE3;c g&#x1EED;i &#x111;&#x1EBF;n GPU cho m&#x1ED7;i &#x111;&#x1EC9;nh.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic6_6.jpg" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"></li>
<li>M&#x1ED9;t ph&#x1B0;&#x1A1;ng ph&#xE1;p kh&#xE1;c c&#x1EF1;c k&#x1EF3; ph&#x1ED5; bi&#x1EBF;n trong c&#xE1;c game m&#xE0; c&#xF3; l&#x1EBD; c&#xE1;c b&#x1EA1;n &#x111;&#xE3; g&#x1EB7;p r&#x1EA5;t nhi&#x1EC1;u l&#x1EA7;n l&#xE0; Level of detail (LOD). LOD l&#xE0; k&#x129; thu&#x1EAD;t t&#x1ED1;i &#x1B0;u ho&#xE1; mesh b&#x1EB1;ng c&#xE1;ch gi&#x1EA3;m b&#x1EDB;t &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p c&#x1EE7;a mesh &#x1EDF; nh&#x1EEF;ng object c&#xE1;ch xa Camera. &#x110;i&#x1EC1;u n&#xE0;y s&#x1EBD; l&#xE0;m gi&#x1EA3;m s&#x1ED1; &#x111;&#x1EC9;nh m&#xE0; GPU ph&#x1EA3;i render m&#xE0; kh&#xF4;ng &#x1EA3;nh h&#x1B0;&#x1EDF;ng &#x111;&#x1EBF;n ch&#x1EA5;t l&#x1B0;&#x1EE3;ng c&#x1EE7;a tr&#xF2; ch&#x1A1;i. M&#x1ED9;t v&#xED; d&#x1EE5; &#x111;&#x1EC3; b&#x1EA1;n d&#x1EC5; h&#xEC;nh dung k&#x129; thu&#x1EAD;t n&#xE0;y l&#xE0; trong m&#x1ED9;t game kh&#xE1; n&#x1ED5;i b&#xE2;y gi&#x1EDD; Rules of Survival, khi b&#x1EA1;n nh&#xEC;n nh&#x1EEF;ng to&#xE0; nh&#xE0; &#x111;&#x1EB1;ng xa s&#x1EBD; th&#x1EA5;y r&#x1EA5;t m&#x1EDD;, nh&#x1B0;ng khi b&#x1EA1;n &#x111;&#x1EBF;n g&#x1EA7;n ho&#x1EB7;c d&#xF9;ng ng&#x1EAF;m s&#x1EBD; th&#x1EA5;y to&#xE0; nh&#xE0; tr&#x1EDF; n&#xEA;n r&#x1EA5;t chi ti&#x1EBF;t.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/InspectorLODGroup.png" alt="[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)" loading="lazy"></li>
<li>Vertex Shaders l&#xE0; m&#x1ED9;t ph&#x1EA7;n c&#x1EE7;a shader code, ch&#x1EC9; th&#x1ECB; GPU l&#xE0;m th&#x1EBF; n&#xE0;o &#x111;&#x1EC3; v&#x1EBD; m&#x1ED7;i &#x111;&#x1EC9;nh. N&#x1EBF;u game c&#x1EE7;a b&#x1EA1;n s&#x1EED; d&#x1EE5;ng Shader c&#x1EE7;a Unity, b&#x1EA1;n n&#xEA;n th&#x1EED; nghi&#x1EC7;m vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng c&#xE1;c shader &#x111;&#x1A1;n gi&#x1EA3;n v&#xE0; &#x111;&#x1B0;&#x1EE3;c t&#x1ED1;i &#x1B0;u &#x111;&#x1EC3; t&#x103;ng hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng (mobile shader,&#x2026;)</li>
</ul>
<h2 id="ktlun">K&#x1EBE;T LU&#x1EAC;N</h2>
<p>V&#x1EAD;y l&#xE0; trong 6 ph&#x1EA7;n thu&#x1ED9;c Series t&#x1ED1;i &#x1B0;u ho&#xE1; &#x1EE9;ng d&#x1EE5;ng game Unity, ch&#x1EAF;c h&#x1EB3;n b&#x1EA1;n &#x111;&#xE3; &#x111;&#x1ECB;nh h&#xEC;nh &#x111;&#x1B0;&#x1EE3;c nh&#x1EEF;ng b&#x1B0;&#x1EDB;c c&#x1EA7;n ph&#x1EA3;i th&#x1EF1;c hi&#x1EC7;n &#x111;&#x1EC3; t&#x1ED1;i &#x1B0;u &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a m&#xEC;nh.  T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng th&#x1EF1;c t&#x1EBF; l&#xE0; nh&#x1EEF;ng c&#xF4;ng vi&#x1EC7;c th&#x1B0;&#x1EDD;ng ng&#xE0;y c&#x1EE7;a b&#x1EA1;n, c&#x1EA7;n ph&#x1EA3;i l&#xE0;m th&#x1B0;&#x1EDD;ng xuy&#xEA;n. B&#x1EA1;n n&#xEA;n tr&#xE1;nh vi&#x1EC7;c ch&#x1EC9; t&#x1ED1;i &#x1B0;u sau khi &#x111;&#xE3; ho&#xE0;n th&#xE0;nh s&#x1A1; b&#x1ED9; &#x1EE9;ng d&#x1EE5;ng, nh&#x1B0; v&#x1EAD;y s&#x1EBD; l&#xE0;m t&#x103;ng &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p l&#xEA;n r&#x1EA5;t nhi&#x1EC1;u. Trong c&#xE1;c ph&#x1EA7;n sau c&#x1EE7;a Series, m&#xEC;nh s&#x1EBD; &#x111;i v&#xE0;o c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u nh&#x1B0; t&#x1ED1;i &#x1B0;u Script, t&#x1ED1;i &#x1B0;u UI, t&#x1ED1;i &#x1B0;u Model,.. Hy v&#x1ECD;ng c&#xE1;c b&#x1EA1;n s&#x1EBD; ti&#x1EBF;p t&#x1EE5;c &#x1EE7;ng h&#x1ED9; Series n&#xE0;y.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity Series 5] Tối ưu hiệu năng Ứng dụng game Unity - Tối ưu GPU]]></title><description><![CDATA[Trong phần của Series tối ưu hiệu năng ứng dụng game Unity, mình sẽ giới thiệu các phương pháp giải quyết GPU bound: Fill rate, Memory bandwidth và vertex processing. ]]></description><link>https://blog.arrow-tech.vn/unity-series-5-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-gpu/</link><guid isPermaLink="false">63915acd7a2f410001205da2</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Thu, 18 Jan 2018 08:22:37 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-6.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-6.jpg" alt="[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU"><p><a href="https://blog.arrow-tech.vn/unity-series-4-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-cpu-tiep/">[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)</a></p>
<blockquote>
<p>Trong ph&#x1EA7;n tr&#x1B0;&#x1EDB;c, m&#xEC;nh &#x111;&#xE3; gi&#x1EDB;i thi&#x1EC7;u t&#x1EDB;i c&#xE1;c b&#x1EA1;n c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u khi &#x1EE9;ng d&#x1EE5;ng game c&#x1EE7;a b&#x1EA1;n g&#x1EB7;p CPU bound. Trong ph&#x1EA7;n n&#xE0;y, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p gi&#x1EA3;i quy&#x1EBF;t GPU bound. Th&#xF4;ng th&#x1B0;&#x1EDD;ng, GPU bound x&#x1EA3;y ra trong 3 tr&#x1B0;&#x1EDD;ng h&#x1EE3;p sau: Fill rate, Memory bandwidth v&#xE0; vertex processing. &#x110;&#x1EB7;c bi&#x1EC7;t, trong thi&#x1EBF;t b&#x1ECB; &#x111;i&#x1EC7;n tho&#x1EA1;i, Fill rate l&#xE0; v&#x1EA5;n &#x111;&#x1EC1; th&#x1B0;&#x1EDD;ng xuy&#xEA;n g&#x1EB7;p nh&#x1EA5;t g&#xE2;y ra GPU bound.</p>
</blockquote>
<h2 id="fillrate">Fill rate</h2>
<p>Fill rate l&#xE0; s&#x1ED1; pixel GPU c&#x1EA7;n render tr&#xEA;n Screen m&#x1ED7;i gi&#xE2;y. Do v&#x1EAD;y n&#xEA;n n&#x1EBF;u game c&#x1EE7;a b&#x1EA1;n &#x111;ang b&#x1ECB; GPU bound do Fill rate,  c&#xF3; ngh&#x129;a l&#xE0; &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n &#x111;ang c&#x1ED1; g&#x1EAF;ng v&#x1EBD; qu&#xE1; nhi&#x1EC1;u pixel m&#x1ED7;i frame m&#xE0; GPU c&#xF3; th&#x1EC3; x&#x1EED; l&#xFD;.<br>
<code>fillrate = screen pixels * shader complexity * overdraw </code> (OverDraw m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u &#x1EDF; b&#xEA;n d&#x1B0;&#x1EDB;i).<br>
C&#xE1;ch ki&#x1EC3;m tra &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n c&#xF3; b&#x1ECB; GPU bound do Fill rate nh&#x1B0; sau:</p>
<ul>
<li>Profile game v&#xE0; note l&#x1EA1;i th&#x1EDD;i gian x&#x1EED; l&#xFD; m&#x1ED7;i Frame c&#x1EE7;a GPU ( s&#x1EED; d&#x1EE5;ng c&#xF4;ng c&#x1EE5; Profiler m&#xEC;nh &#x111;&#xE3; gi&#x1EDB;i thi&#x1EC7;u &#x1EDF; ph&#x1EA7;n 1).</li>
<li>Gi&#x1EA3;m &#x111;&#x1ED9; ph&#xE2;n gi&#x1EA3;i (display resolution) trong Player Settings.</li>
<li>Profile l&#x1EA1;i game v&#xE0; so s&#xE1;nh v&#x1EDB;i th&#x1EDD;i gian x&#x1EED; l&#xFD; m&#x1ED7;i frame c&#x1EE7;a GPU m&#xE0; b&#x1EA1;n &#x111;&#xE3; note.</li>
</ul>
<p>N&#x1EBF;u hi&#x1EC7;u n&#x103;ng &#x111;&#x1B0;&#x1EE3;c c&#x1EA3;i thi&#x1EC7;n, c&#xF3; l&#x1EBD; b&#x1EA1;n s&#x1EBD; c&#x1EA7;n quan t&#xE2;m &#x111;&#x1EBF;n nh&#x1EEF;ng ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u Fill rate b&#xEA;n d&#x1B0;&#x1EDB;i.<br>
T&#x1ED1;i &#x1B0;u <code>Fragment Shader</code>: Fragment shader l&#xE0; m&#x1ED9;t ph&#x1EA7;n c&#x1EE7;a shader code, c&#xF3; nhi&#x1EC7;m v&#x1EE5; ch&#x1EC9; cho GPU l&#xE0;m th&#x1EBF; n&#xE0;o &#x111;&#x1EC3; v&#x1EBD; m&#x1ED9;t pixel &#x111;&#x1A1;n l&#x1EBB;. Code n&#xE0;y &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n b&#x1EDF;i GPU cho m&#x1ED7;i pixel m&#xE0; n&#xF3; ph&#x1EA3;i v&#x1EBD;, cho n&#xEA;n n&#x1EBF;u code kh&#xF4;ng t&#x1ED1;i &#x1B0;u s&#x1EBD; d&#x1EC5; d&#xE0;ng t&#x1EA1;o ra c&#xE1;c v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; hi&#x1EC7;u n&#x103;ng.</p>
<ul>
<li>N&#x1EBF;u game c&#x1EE7;a b&#x1EA1;n &#x111;ang s&#x1EED; d&#x1EE5;ng c&#xE1;c shader c&#xF3; s&#x1EB5;n trong Unity, b&#x1EA1;n n&#xEA;n s&#x1EED; d&#x1EE5;ng nh&#x1EEF;ng shader &#x111;&#x1A1;n gi&#x1EA3;n v&#xE0; t&#x1ED1;i &#x1B0;u nh&#x1EA5;t m&#xE0; c&#xF3; th&#x1EC3; t&#x1EA1;o c&#xE1;c hi&#x1EC7;u &#x1EE9;ng m&#xE0; b&#x1EA1;n mong mu&#x1ED1;n. V&#xED; d&#x1EE5; nh&#x1B0; c&#xE1;c mobile shader &#x111;&#x1B0;&#x1EE3;c t&#x1ED1;i &#x1B0;u r&#x1EA5;t t&#x1ED1;t. B&#x1EA1;n n&#xEA;n th&#x1EED; nghi&#x1EC7;m ch&#xFA;ng trong game c&#x1EE7;a m&#xEC;nh, ki&#x1EC3;m tra vi&#x1EC7;c c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u su&#x1EA5;t t&#x1EEB; n&#xF3; c&#x169;ng nh&#x1B0; ch&#x1EA5;t l&#x1B0;&#x1EE3;ng h&#xEC;nh &#x1EA3;nh c&#xF3; ch&#x1EA5;p nh&#x1EAD;n &#x111;&#x1B0;&#x1EE3;c kh&#xF4;ng. N&#x1EBF;u &#x111;&#x1B0;&#x1EE3;c, h&#xE3;y s&#x1EED; d&#x1EE5;ng ch&#xFA;ng, &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u n&#x103;ng &#x111;&#xE1;ng k&#x1EC3;. Tuy nh&#x1EEF;ng shader n&#xE0;y &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng h&#x1B0;&#x1EDB;ng &#x111;&#x1EBF;n n&#x1EC1;n t&#x1EA3;ng di &#x111;&#x1ED9;ng, tuy nhi&#xEA;n ch&#xFA;ng v&#x1EAB;n ph&#xF9; h&#x1EE3;p cho b&#x1EA5;t k&#x1EF3; n&#x1EC1;n t&#x1EA3;ng n&#xE0;o. Do v&#x1EAD;y b&#x1EA1;n c&#xF3; th&#x1EC3; ho&#xE0;n to&#xE0;n s&#x1EED; d&#x1EE5;ng nh&#x1EEF;ng shader n&#xE0;y trong c&#xE1;c d&#x1EF1; &#xE1;n h&#x1B0;&#x1EDB;ng t&#x1EDB;i n&#x1EC1;n t&#x1EA3;ng kh&#xE1;c.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic5_1.jpg" alt="[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU" loading="lazy"></li>
<li>M&#x1ED9;t shader c&#xF3; th&#x1EC3; d&#xF9;ng chung cho nhi&#x1EC1;u material v&#xE0; n&#xF3; ph&#x1EE5; thu&#x1ED9;c v&#xE0;o material. N&#x1EBF;u c&#xE1;c object trong game c&#x1EE7;a b&#x1EA1;n s&#x1EED; d&#x1EE5;ng Unity Standard Shader, c&#xF3; m&#x1ED9;t &#x111;i&#x1EC1;u quan tr&#x1ECD;ng b&#x1EA1;n ph&#x1EA3;i nh&#x1EDB; r&#x1EB1;ng Unity s&#x1EBD; bi&#xEA;n d&#x1ECB;ch (compile) shader code d&#x1EF1;a tr&#xEA;n nh&#x1EEF;ng c&#xE0;i &#x111;&#x1EB7;t c&#x1EE7;a material &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng. Ch&#x1EC9; nh&#x1EEF;ng ch&#x1EE9;c n&#x103;ng n&#xE0;o &#x111;ang &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng trong material m&#x1EDB;i &#x111;&#x1B0;&#x1EE3;c bi&#xEA;n d&#x1ECB;ch. &#x110;i&#x1EC1;u n&#xE0;y c&#xF3; ngh&#x129;a l&#xE0; vi&#x1EC7;c lo&#x1EA1;i b&#x1ECF; c&#xE1;c ch&#x1EE9;c n&#x103;ng kh&#xF4;ng c&#x1EA7;n thi&#x1EBF;t trong t&#x1EEB;ng object s&#x1EBD; l&#xE0;m gi&#x1EA3;m &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p c&#x1EE7;a fragment shader &#x111;i r&#x1EA5;t nhi&#x1EC1;u, d&#x1EAB;n &#x111;&#x1EBF;n hi&#x1EC7;u n&#x103;ng s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c c&#x1EA3;i thi&#x1EC7;n &#x111;&#xE1;ng k&#x1EC3; (B&#x1EA1;n h&#xE3;y th&#x1EED; t&#x1EAF;t Detail map hay normal map xem th&#x1EED; xD). M&#x1ED9;t l&#x1EA7;n n&#x1EEF;a, m&#xEC;nh xin nh&#x1EAF;c l&#x1EA1;i, c&#xF4;ng vi&#x1EC7;c b&#x1EA1;n c&#x1EA7;n l&#xE0;m l&#xE0; th&#x1EED; nghi&#x1EC7;m c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p, ki&#x1EC3;m tra hi&#x1EC7;u qu&#x1EA3; c&#x1EE7;a hi&#x1EC7;u su&#x1EA5;t v&#xE0; s&#x1EF1; &#x1EA3;nh h&#x1B0;&#x1EDF;ng c&#x1EE7;a vi&#x1EC7;c t&#x1ED1;i &#x1B0;u &#x111;&#x1EBF;n ch&#x1EA5;t l&#x1B0;&#x1EE3;ng &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n, &#x111;&#x1EC3; quy&#x1EBF;t &#x111;&#x1ECB;nh xem c&#xF3; n&#xEA;n s&#x1EED; d&#x1EE5;ng c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p n&#xE0;y hay kh&#xF4;ng.</li>
<li>Ngo&#xE0;i ra, b&#x1EA1;n c&#x169;ng n&#xEA;n tr&#xE1;nh s&#x1EED; d&#x1EE5;ng nh&#x1EEF;ng h&#xE0;m t&#xED;nh to&#xE1;n ph&#x1EE9;c t&#x1EA1;p trong shader code (nh&#x1B0; pow, exp,log.cos,tan,&#x2026;)  v&#xE0; tr&#xE1;nh s&#x1EED; d&#x1EE5;ng alpha-testing shaders. Thay v&#xE0;o &#x111;&#xF3;, b&#x1EA1;n c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng alpha-blend shader.</li>
</ul>
<p><code>OverDraw</code> l&#xE0; m&#x1ED9;t thu&#x1EAD;t ng&#x1EEF; &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1ECB;nh ngh&#x129;a khi c&#xE1;c pixel &#x111;&#x1B0;&#x1EE3;c v&#x1EBD; nhi&#x1EC1;u l&#x1EA7;n. &#x110;i&#x1EC1;u n&#xE0;y x&#x1EA3;y ra khi c&#xE1;c object &#x111;&#x1B0;&#x1EE3;c v&#x1EBD; &#x111;&#xE8; l&#xEA;n c&#xE1;c object kh&#xE1;c, do &#x111;&#xF3; t&#x1EA1;o n&#xEA;n c&#xE1;c v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; fillrate. &#x110;&#x1EC3; hi&#x1EC3;u &#x111;&#x1B0;&#x1EE3;c v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; OverDraw, tr&#x1B0;&#x1EDB;c h&#x1EBF;t b&#x1EA1;n ph&#x1EA3;i hi&#x1EC3;u &#x111;&#x1B0;&#x1EE3;c th&#x1EE9; t&#x1EF1; m&#xE0; Unity v&#x1EBD; c&#xE1;c object trong Scene. Shader code trong object s&#x1EBD; x&#xE1;c &#x111;&#x1ECB;nh th&#x1EE9; t&#x1EF1; v&#x1EBD; c&#x1EE7;a n&#xF3;, th&#x1B0;&#x1EDD;ng &#x111;&#x1B0;&#x1EE3;c x&#xE1;c &#x111;&#x1ECB;nh t&#x1EA1;i th&#xE0;nh ph&#x1EA7;n Render Queue trong shader. Ngo&#xE0;i ra, c&#xE1;c object trong c&#xE1;c render queue kh&#xE1;c nhau s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c s&#x1EAF;p x&#x1EBF;p kh&#xE1;c nhau. V&#xED; d&#x1EE5;, Unity s&#x1EBD; s&#x1EAF;p x&#x1EBF;p c&#xE1;c object t&#x1EEB; tr&#x1B0;&#x1EDB;c ra sau trong Geometry queue &#x111;&#x1EC3; gi&#x1EA3;m thi&#x1EC3;u h&#x1EBF;t m&#x1EE9;c OverDraw, nh&#x1B0;ng s&#x1EBD; s&#x1EAF;p x&#x1EBF;p t&#x1EEB; sau ra tr&#x1B0;&#x1EDB;c trong Transparent queue &#x111;&#x1EC3; &#x111;&#x1EA1;t &#x111;&#x1B0;&#x1EE3;c c&#xE1;c hi&#x1EC7;u &#x1EE9;ng th&#x1ECB; gi&#xE1;c. OverDraw l&#xE0; m&#x1ED9;t ch&#x1EE7; &#x111;&#x1EC1; ph&#x1EE9;c t&#x1EA1;p, tuy nhi&#xEA;n vi&#x1EC7;c gi&#x1EA3;m thi&#x1EC3;u s&#x1ED1; object ch&#x1ED3;ng l&#xEA;n nhau m&#xE0; Unity kh&#xF4;ng th&#x1EC3; t&#x1EF1; &#x111;&#x1ED9;ng s&#x1EAF;p x&#x1EBF;p l&#xE0; ch&#xEC;a kho&#xE1; &#x111;&#x1EC3; gi&#x1EA3;i quy&#x1EBF;t v&#x1EA5;n &#x111;&#x1EC1;.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic5_2.jpg" alt="[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU" loading="lazy"><br>
C&#xE1;ch render c&#x1EE7;a c&#xE1;c Render Queue:</p>
<ul>
<li>Background: Render queue n&#xE0;y s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c render &#x111;&#x1EA7;u ti&#xEA;n trong t&#x1EA5;t c&#x1EA3; c&#xE1;c tr&#x1B0;&#x1EDD;ng h&#x1EE3;p. B&#x1EA1;n n&#xEA;n s&#x1EED; d&#x1EE5;ng queue n&#xE0;y cho c&#xE1;c object &#x111;&#xF3;ng vai tr&#xF2; nh&#x1B0; background.</li>
<li>Geometry: &#x110;&#xE2;y l&#xE0; Render Queue m&#x1EB7;c &#x111;&#x1ECB;nh, &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng cho h&#x1EA7;u h&#x1EBF;t object.</li>
<li>AlphaTest: &#x110;&#xE2;y l&#xE0; m&#x1ED9;t queue ri&#xEA;ng bi&#x1EC7;t, r&#x1EA5;t h&#x1EEF;u &#xED;ch &#x111;&#x1EC3; render c&#xE1;c alpha-test object.</li>
<li>Transparent: render queue n&#xE0;y s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c render sau Geometry v&#xE0; AlphaTest v&#x1EDB;i th&#x1EE9; t&#x1EF1; t&#x1EEB; sau ra tr&#x1B0;&#x1EDB;c. Th&#x1B0;&#x1EDD;ng &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng cho c&#xE1;c v&#x1EAD;t th&#x1EC3; trong su&#x1ED1;t nh&#x1B0; k&#xED;nh hay c&#xE1;c hi&#x1EC7;u &#x1EE9;ng particle.</li>
<li>Overlay: &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng cho c&#xE1;c hi&#x1EC7;u &#x1EE9;ng overlay nh&#x1B0; lens flare.</li>
</ul>
<p>&#x110;&#x1EC3; ki&#x1EC3;m tra OverDraw, b&#x1EA1;n c&#xF3; th&#x1EC3; m&#x1EDF; OverDraw Draw Mode trong c&#x1EED;a s&#x1ED5; Scene. Draw Mode view cho ph&#xE9;p b&#x1EA1;n nh&#xEC;n th&#x1EA5;y OverDraw &#x1EDF; trong Scene, v&#xE0; t&#x1EEB; &#x111;&#xF3; x&#xE1;c &#x111;&#x1ECB;nh ch&#x1ED7; n&#xE0;o ch&#xFA;ng ta c&#x1EA7;n t&#x1ED1;i &#x1B0;u. Th&#x1EE7; ph&#x1EA1;m ph&#x1ED5; bi&#x1EBF;n nh&#x1EA5;t c&#x1EE7;a OverDraw l&#xE0; Transparent material, c&#xE1;c h&#x1EA1;t particles ch&#x1B0;a &#x111;&#x1B0;&#x1EE3;c t&#x1ED1;i &#x1B0;u v&#xE0; c&#xE1;c th&#xE0;nh ph&#x1EA7;n UI ch&#x1ED3;ng l&#xEA;n nhau. Ri&#xEA;ng v&#x1EC1; UI m&#xEC;nh s&#x1EBD; vi&#x1EBF;t m&#x1ED9;t b&#xE0;i h&#x1B0;&#x1EDB;ng d&#x1EAB;n t&#x1ED1;i &#x1B0;u UI trong c&#xE1;c ph&#x1EA7;n sau c&#x1EE7;a Series.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic5_3.jpg" alt="[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU" loading="lazy"><br>
N&#x1EBF;u b&#x1EA1;n &#x111;ang s&#x1EED; d&#x1EE5;ng Unity 3D, ch&#x1EAF;c h&#x1EB3;n c&#xE1;c b&#x1EA1;n &#x111;&#xE3; nghe &#x111;&#x1EBF;n kh&#xE1;i ni&#x1EC7;m <code>Image Effect</code>. Ch&#xFA;ng &#x111;&#x1A1;n gi&#x1EA3;n l&#xE0; nh&#x1EEF;ng script, &#x111;&#x1B0;&#x1EE3;c g&#x1EAF;n v&#xE0;o trong Main Camera v&#xE0; t&#x1EA1;o ra c&#xE1;c hi&#x1EC7;u &#x1EE9;ng r&#x1EA5;t &#x1EA5;n t&#x1B0;&#x1EE3;ng. V&#xED; d&#x1EE5; nh&#x1B0; bloom effect c&#xF3; th&#x1EC3; &#x111;&#x1B0;a &#xE1;nh s&#xE1;ng kh&#x1EAF;c nghi&#x1EC7;t v&#xE0;o m&#x1ED9;t ng&#xE0;y n&#x1EAF;ng &#x1EA5;m, hay m&#x1ED9;t effect nh&#x1B0; color correction c&#xF3; th&#x1EC3; t&#x1EA1;o hi&#x1EC7;u &#x1EE9;ng c&#x1EA3;nh quan nh&#x1B0; &#x111;&#x1ED9;c (toxic). Do v&#x1EAD;y, vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng Image Effect c&#xF3; th&#x1EC3; l&#xE0; m&#x1ED9;t ph&#x1EA7;n nguy&#xEA;n nh&#xE2;n g&#xE2;y n&#xEA;n v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; Fill rate, &#x111;&#x1EB7;c bi&#x1EC7;t khi s&#x1EED; d&#x1EE5;ng nhi&#x1EC1;u h&#x1A1;n m&#x1ED9;t Image Effect trong Scene. N&#x1EBF;u Image Effect l&#xE0; nguy&#xEA;n nh&#xE2;n, ch&#xFA;ng ta c&#xF3; th&#x1EC3; th&#x1EED; nghi&#x1EC7;m c&#xE1;c thi&#x1EBF;t l&#x1EAD;p kh&#xE1;c nhau ho&#x1EB7;c s&#x1EED; d&#x1EE5;ng c&#xE1;c phi&#xEA;n b&#x1EA3;n t&#x1ED1;i &#x1B0;u ho&#xE1; c&#x1EE7;a c&#xE1;c Image Effect (V&#xED; d&#x1EE5; nh&#x1B0; s&#x1EED; d&#x1EE5;ng Bloom Optimized thay v&#xEC; Bloom). N&#x1EBF;u game c&#x1EE7;a b&#x1EA1;n c&#xF3; nhi&#x1EC1;u h&#x1A1;n m&#x1ED9;t Image Effect &#x1EDF; trong c&#xF9;ng 1 camera, &#x111;i&#x1EC1;u n&#xE0;y s&#x1EBD; t&#x1EA1;o ra nhi&#x1EC1;u shader pass. Trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p n&#xE0;y, b&#x1EA1;n c&#xF3; th&#x1EC3; k&#x1EBF;t h&#x1EE3;p shader code c&#x1EE7;a c&#xE1;c Image Effect &#x111;&#xF3; v&#xE0;o trong m&#x1ED9;t pass ri&#xEA;ng (B&#x1EA1;n c&#xF3; th&#x1EC3; tham kh&#x1EA3;o ph&#x1B0;&#x1A1;ng ph&#xE1;p n&#xE0;y t&#x1EA1;i <a href="https://github.com/Unity-Technologies/PostProcessing/wiki?ref=blog.arrow-tech.vn">Unity&#x2019;s PostProcessing Stack</a>).<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/image-effects-folder.png" alt="[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU" loading="lazy"><br>
Sau khi th&#x1EF1;c hi&#x1EC7;n nh&#x1EEF;ng ph&#x1B0;&#x1A1;ng ph&#xE1;p n&#xE0;y m&#xE0; v&#x1EAB;n ch&#x1B0;a gi&#x1EA3;i quy&#x1EBF;t &#x111;&#x1B0;&#x1EE3;c v&#x1EA5;n &#x111;&#x1EC1;, b&#x1EA1;n c&#xF3; th&#x1EC3; n&#xEA;n xem x&#xE9;t vi&#x1EC7;c lo&#x1EA1;i b&#x1ECF; nh&#x1EEF;ng Image Effect n&#xE0;y, &#x111;&#x1EB7;c bi&#x1EC7;t l&#xE0; trong c&#xE1;c thi&#x1EBF;t b&#x1ECB; c&#x1EA5;u h&#xEC;nh y&#x1EBF;u.<br>
B&#x1EDF;i v&#xEC; b&#xE0;i vi&#x1EBF;t n&#xE0;y kh&#xE1; d&#xE0;i, n&#xEA;n m&#xEC;nh xin ph&#xE9;p &#x111;&#x1B0;&#x1EE3;c chia b&#xE0;i t&#x1ED1;i &#x1B0;u GPU th&#xE0;nh 2 ph&#x1EA7;n. Trong ph&#x1EA7;n ti&#x1EBF;p theo m&#xEC;nh s&#x1EBD; &#x111;i s&#xE2;u v&#xE0;o c&#xE1;c c&#xE1;ch gi&#x1EA3;i quy&#x1EBF;t c&#x1EE5; th&#x1EC3; c&#x1EE7;a 2 v&#x1EA5;n &#x111;&#x1EC1; c&#xF2;n l&#x1EA1;i l&#xE0; Memory bandwidth v&#xE0; vertex processing.</p>
<p><a href="https://blog.arrow-tech.vn/unity-series-6-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-gpu-tiep/">[Unity Series 6] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU (ti&#x1EBF;p)</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity Series 4] Tối ưu hiệu năng Ứng dụng game Unity - Tối ưu CPU (tiếp)]]></title><description><![CDATA[Sau khi xác nhận ứng dụng của bạn bị CPU bound, hiểu rõ quá trình, xem xét vấn đề nằm ở tác vụ nào để rồi đó tìm ra các phương pháp tối ưu phù hợp cho ứng dụng.]]></description><link>https://blog.arrow-tech.vn/unity-series-4-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-cpu-tiep/</link><guid isPermaLink="false">63915acd7a2f410001205da1</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Wed, 17 Jan 2018 10:33:40 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-5.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-5.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)"><p><a href="https://blog.arrow-tech.vn/unity-series-3-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-cpu/">[Unity Series 3] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU</a></p>
<blockquote>
<p>Trong ph&#x1EA7;n n&#xE0;y, m&#xEC;nh s&#x1EBD; ti&#x1EBF;p t&#x1EE5;c b&#xE0;i vi&#x1EBF;t T&#x1ED1;i &#x1B0;u CPU, bao g&#x1ED3;m c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p &#x111;&#x1EC3; gi&#x1EA3;m s&#x1ED1; SetPass Call v&#xE0; c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u Skinned Meshes.</p>
</blockquote>
<p><strong>Gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng object &#x111;&#x1B0;&#x1EE3;c render</strong><br>
&#x110;&#x1EC3; gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng object &#x111;&#x1B0;&#x1EE3;c render, c&#xE1;ch &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1EA5;t &#x111;&#x1EC3; th&#x1EF1;c hi&#x1EC7;n l&#xE0; gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng object &#x111;&#x1B0;&#x1EE3;c nh&#xEC;n th&#x1EA5;y trong Scene. V&#xEC; v&#x1EAD;y, &#x111;&#x1EA7;u ti&#xEA;n c&#xE1;c b&#x1EA1;n n&#xEA;n duy&#x1EC7;t to&#xE0;n b&#x1ED9; nh&#x1EEF;ng object c&#x1EE7;a m&#xEC;nh, x&#xE1;c &#x111;&#x1ECB;nh nh&#x1EEF;ng object n&#xE0;o kh&#xF4;ng th&#x1EAD;t s&#x1EF1; qu&#xE1; c&#x1EA7;n thi&#x1EBF;t, &#x1EA9;n n&#xF3; &#x111;i s&#x1EBD; l&#xE0;m hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng b&#x1EA1;n &#x111;&#x1B0;&#x1EE3;c c&#x1EA3;i thi&#x1EC7;n. Nhi&#x1EC1;u khi b&#x1EA1;n s&#x1EBD; ph&#x1EA3;i &#x111;&#xE1;nh &#x111;&#x1ED5;i nh&#x1EEF;ng hi&#x1EC7;u &#x1EE9;ng &#x111;&#x1EB9;p m&#x1EAF;t, hay nh&#x1EEF;ng c&#x1EA3;nh gi&#x1EA3; l&#x1EAD;p r&#x1EA5;t th&#x1EF1;c t&#x1EBF; &#x111;&#x1EC3; c&#x1EA3;i thi&#x1EC7;n t&#x1ED1;c &#x111;&#x1ED9; CPU. V&#xED; d&#x1EE5;, trong Scene c&#x1EE7;a b&#x1EA1;n c&#xF3; nhi&#x1EC1;u object c&#xE2;y c&#x1ED1;i &#x111;&#x1EC3; t&#x1EA1;o c&#x1EA3;m gi&#xE1;c m&#x1ED9;t khu r&#x1EEB;ng, b&#x1EA1;n c&#xF3; th&#x1EC3; c&#x1EA7;n suy t&#xED;nh xem m&#xEC;nh c&#xF3; n&#xEA;n gi&#x1EA3;m b&#x1EDB;t nh&#x1EEF;ng object n&#xE0;y &#x111;&#x1EC3; c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u su&#x1EA5;t hay kh&#xF4;ng.<br>
M&#x1ED9;t c&#xE1;ch c&#x169;ng v&#xF4; c&#xF9;ng &#x111;&#x1A1;n gi&#x1EA3;n n&#x1EEF;a, m&#xE0; nhi&#x1EC1;u khi c&#xE1;c b&#x1EA1;n kh&#xF4;ng &#x111;&#x1EC3; &#xFD; &#x111;&#x1EBF;n, l&#xE0; thu&#x1ED9;c t&#xED;nh <code>Far Clip Plane</code> c&#x1EE7;a Camera. Thu&#x1ED9;c t&#xED;nh n&#xE0;y x&#xE1;c &#x111;&#x1ECB;nh kho&#x1EA3;ng c&#xE1;ch xa nh&#x1EA5;t m&#xE0; Camera c&#x1EE7;a b&#x1EA1;n c&#xF3; th&#x1EC3; nh&#xEC;n th&#x1EA5;y. Nh&#x1EEF;ng object n&#x1EB1;m ngo&#xE0;i kho&#x1EA3;ng c&#xE1;ch n&#xE0;y s&#x1EBD; kh&#xF4;ng &#x111;&#x1B0;&#x1EE3;c Render. Nhi&#x1EC1;u khi b&#x1EA1;n kh&#xF4;ng c&#x1EA7;n ph&#x1EA3;i render nh&#x1EEF;ng v&#x1EAD;t th&#x1EC3; &#x1EDF; xa, vi&#x1EC7;c gi&#x1EA3;m kho&#x1EA3;ng c&#xE1;ch Far Clip Plane l&#xE0; m&#x1ED9;t ph&#x1B0;&#x1A1;ng ph&#xE1;p r&#x1EA5;t h&#x1EEF;u d&#x1EE5;ng. C&#xF3; m&#x1ED9;t m&#x1EB9;o nh&#x1ECF; l&#xE0; b&#x1EA1;n c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng hi&#x1EC7;u &#x1EE9;ng s&#x1B0;&#x1A1;ng m&#xF9; (Fog), &#x111;&#x1EC3; t&#x1EA1;o c&#x1EA3;m gi&#xE1;c ng&#x1B0;&#x1EDD;i ch&#x1A1;i kh&#xF4;ng th&#x1EC3; nh&#xEC;n xa.</p>
<blockquote>
<p>&#x110;&#x1EC3; m&#x1EDF; thu&#x1ED9;c t&#xED;nh Far Clip Plane, b&#x1EA1;n c&#x1EA7;n ch&#x1ECD;n object Camera m&#xE0; b&#x1EA1;n &#x111;ang s&#x1EED; d&#x1EE5;ng trong Scene. Trong m&#x1EE5;c Clipping Plane, thay &#x111;&#x1ED5;i gi&#xE1; tr&#x1ECB; Far.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_3.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
M&#x1ED9;t c&#xE1;ch ph&#x1EE9;c t&#x1EA1;p h&#x1A1;n &#x111;&#x1EC3; tu&#x1EF3; ch&#x1EC9;nh kho&#x1EA3;ng c&#xE1;ch nh&#xEC;n th&#x1EA5;y c&#x1EE7;a Camera, &#x111;&#xF3; l&#xE0; thu&#x1ED9;c t&#xED;nh <code>Layer Cull Distances</code> c&#x1EE7;a Camera. Thu&#x1ED9;c t&#xED;nh n&#xE0;y cho ph&#xE9;p b&#x1EA1;n thay &#x111;&#x1ED5;i kho&#x1EA3;ng c&#xE1;ch nh&#xEC;n th&#x1EA5;y cho c&#xE1;c object theo t&#x1EEB;ng Layer. Do v&#x1EAD;y, b&#x1EA1;n c&#xF3; th&#x1EC3; t&#x1EA1;o th&#xEA;m nhi&#x1EC1;u Layer &#x111;&#x1EC3; tu&#x1EF3; ch&#x1EC9;nh kho&#x1EA3;ng c&#xE1;ch nh&#xEC;n th&#x1EA5;y c&#x1EE7;a Camera cho m&#x1ED7;i object.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_4.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
C&#xE1;ch n&#xE0;y r&#x1EA5;t h&#x1EEF;u &#xED;ch n&#x1EBF;u ch&#xFA;ng ta c&#xF3; r&#x1EA5;t nhi&#x1EC1;u nh&#x1EEF;ng object trang tr&#xED; nh&#x1ECF;, ch&#xFA;ng ta c&#xF3; th&#x1EC3; set kho&#x1EA3;ng c&#xE1;ch nh&#xEC;n th&#x1EA5;y c&#x1EE7;a n&#xF3; nh&#x1ECF; h&#x1A1;n nhi&#x1EC1;u so v&#x1EDB;i kho&#x1EA3;ng c&#xE1;ch nh&#xEC;n th&#x1EA5;y c&#x1EE7;a Terrain m&#xE0; ta s&#x1EED; d&#x1EE5;ng.<br>
C&#xE1;ch s&#x1EED; d&#x1EE5;ng layerCullDistance:</p>
<blockquote>
<p>public float[]&#xA0;layerCullDistances;</p>
</blockquote>
<p>Khi g&#xE1;n gi&#xE1; tr&#x1ECB; layerCullDistance, b&#x1EA1;n c&#x1EA7;n g&#xE1;n cho n&#xF3; m&#x1ED9;t m&#x1EA3;ng gi&#xE1; tr&#x1ECB; float32. Gi&#xE1; tr&#x1ECB; 0 trong Cull Distances ch&#xED;nh l&#xE0; gi&#xE1; tr&#x1ECB; Far Clip Plane.</p>
<pre><code>V&#xED; d&#x1EE5;:
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        Camera camera = GetComponent&lt;Camera&gt;();
        float[] distances = new float[32];
        distances[10] = 15;
        camera.layerCullDistances = distances;
    }
}
</code></pre>
<p><code>Occlusion Culling</code>: &#x110;&#xE2;y l&#xE0; m&#x1ED9;t k&#x129; thu&#x1EAD;t r&#x1EA5;t ph&#x1ED5; bi&#x1EBF;n v&#xE0; r&#x1EA5;t m&#x1EA1;nh c&#x1EE7;a Unity. N&#xF3; cho ph&#xE9;p v&#xF4; hi&#x1EC7;u ho&#xE1; vi&#x1EC7;c rendering c&#xE1;c &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng b&#x1ECB; c&#xE1;c &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng kh&#xE1;c che &#x111;i. V&#xED; d&#x1EE5; nh&#x1B0; trong c&#x1EA3;nh c&#x1EE7;a b&#x1EA1;n c&#xF3; m&#x1ED9;t to&#xE0; nh&#xE0; tr&#x1B0;&#x1EDB;c m&#x1EB7;t, vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng Occlusion Culling s&#x1EBD; v&#xF4; hi&#x1EC7;u ho&#xE1; c&#xE1;c object &#x111;&#x1EB1;ng sau to&#xE0; nh&#xE0;, m&#xE0; b&#x1EA1;n kh&#xF4;ng th&#x1EC3; nh&#xEC;n th&#x1EA5;y do b&#x1ECB; to&#xE0; nh&#xE0; che m&#x1EA5;t. Tuy nhi&#xEA;n, kh&#xF4;ng ph&#x1EA3;i l&#xFA;c n&#xE0;o Occlusion Culling c&#x169;ng h&#x1EEF;u d&#x1EE5;ng, n&#xF3; c&#xF3; th&#x1EC3; l&#xE0;m t&#x103;ng th&#xEA;m ph&#xED; t&#x1ED5;n cho CPU. V&#xED; d&#x1EE5; nh&#x1B0; trong c&#xE1;c Scene c&#xF3; c&#xE1;c v&#x1EAD;t th&#x1EC3; l&#x1EDB;n nh&#x1B0; ng&#x1ECD;n n&#xFA;i, to&#xE0; nh&#xE0; l&#x1EDB;n hay nh&#x1EEF;ng b&#x1EE9;c t&#x1B0;&#x1EDD;ng l&#xE0;m che ch&#x1EAF;n, nhi&#x1EC1;u v&#x1EAD;t th&#x1EC3; &#x111;&#x1EB1;ng sau s&#x1EBD; cho ch&#xFA;ng ta th&#x1EA5;y s&#x1EE9;c m&#x1EA1;nh c&#x1EE7;a k&#x129; thu&#x1EAD;t n&#xE0;y.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/01_good_vs_bad_occluder.png" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
H&#x1B0;&#x1EDB;ng d&#x1EAB;n s&#x1EED; d&#x1EE5;ng c&#x1A1; b&#x1EA3;n Occlusion Culling:</p>
<blockquote>
<p>C&#xE1;ch &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1EA5;t l&#xE0; ch&#x1ECD;n t&#x1EA5;t c&#x1EA3; c&#xE1;c object trong Scene m&#xE0; b&#x1EA1;n th&#x1EA5;y c&#x1EA7;n l&#xE0; m&#x1ED9;t ph&#x1EA7;n c&#x1EE7;a Occlusion v&#xE0; &#x111;&#x1ED5;i tag static trong c&#x1EED;a s&#x1ED5; Inspector l&#xE0; Occluder Static v&#xE0; Occludee Static.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_5.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"></p>
<p>Occludee Static &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng cho c&#xE1;c object trong su&#x1ED1;t ho&#x1EB7;c m&#x1EDD; v&#xE0; nh&#x1EEF;ng object nh&#x1ECF; kh&#xF4;ng c&#xF3; kh&#x1EA3; n&#x103;ng che khu&#x1EA5;t nh&#x1EEF;ng object kh&#xE1;c. Khi b&#x1EA1;n s&#x1EED; d&#x1EE5;ng LOD Groups, ch&#x1EC9; c&#xF3; LOD0 c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng Occluder.</p>
<blockquote>
<p>Sau &#x111;&#xF3;, m&#x1EDF; c&#x1EED;a s&#x1ED5; Occlusion Culling, ch&#x1ECD;n m&#x1EE5;c Bake v&#xE0; &#x1EA5;n Bake.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3-6.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
B&#x1EA1;n c&#xF3; th&#x1EC3; thay &#x111;&#x1ED5;i c&#xE1;c gi&#xE1; tr&#x1ECB; trong m&#x1EE5;c Bake. Tuy nhi&#xEA;n m&#xEC;nh th&#x1EA5;y gi&#xE1; tr&#x1ECB; m&#x1EB7;c &#x111;&#x1ECB;nh trong m&#x1EE5;c n&#xE0;y &#xE1;p d&#x1EE5;ng kh&#xE1; t&#x1ED1;t trong h&#x1EA7;u h&#x1EBF;t c&#xE1;c tr&#x1B0;&#x1EDD;ng h&#x1EE3;p.</p>
<p><strong>Gi&#x1EA3;m s&#x1ED1; l&#x1EA7;n m&#x1ED7;i object &#x111;&#x1B0;&#x1EE3;c Render</strong><br>
Realtime lighting, shadows v&#xE0; reflections l&#xE0; nh&#x1EEF;ng k&#x129; thu&#x1EAD;t t&#x1EA1;o &#xE1;nh s&#xE1;ng trong Scene, l&#xE0;m cho game c&#x1EE7;a ch&#xFA;ng ta tr&#x1EDF; n&#xEA;n th&#x1EF1;c h&#x1A1;n r&#x1EA5;t nhi&#x1EC1;u. Tuy nhi&#xEA;n vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng nh&#x1EEF;ng k&#x129; thu&#x1EAD;t n&#xE0;y c&#xF3; th&#x1EC3; d&#x1EAB;n &#x111;&#x1EBF;n vi&#x1EC7;c c&#xE1;c object &#x111;&#x1B0;&#x1EE3;c render nhi&#x1EC1;u l&#x1EA7;n, &#x111;i&#x1EC1;u n&#xE0;y c&#xF3; th&#x1EC3; &#x1EA3;nh h&#x1B0;&#x1EDF;ng &#x111;&#x1EBF;n hi&#x1EC7;u n&#x103;ng c&#x1EE7;a h&#x1EC7; th&#x1ED1;ng.<br>
<code>Rendering Path</code> l&#xE0; m&#x1ED9;t thu&#x1EAD;t ng&#x1EEF; cho vi&#x1EC7;c c&#xE0;i &#x111;&#x1EB7;t th&#x1EE9; t&#x1EF1; t&#xED;nh to&#xE1;n khi draw scene v&#xE0; s&#x1EF1; kh&#xE1;c bi&#x1EC7;t ch&#xED;nh gi&#x1EEF;a c&#xE1;c Rendering Path l&#xE0; c&#xE1;ch m&#xE0; ch&#xFA;ng x&#x1EED; l&#xFD; realtime lights, shadows v&#xE0; reflections. Deferred Rendering l&#xE0; s&#x1EF1; l&#x1EF1;a ch&#x1ECD;n t&#x1ED1;t h&#x1A1;n n&#x1EBF;u game c&#x1EE7;a b&#x1EA1;n h&#x1B0;&#x1EDB;ng t&#x1EDB;i ph&#x1EA7;n c&#x1EE9;ng m&#x1EA1;nh v&#xE0; s&#x1EED; d&#x1EE5;ng nhi&#x1EC1;u realtime light, shadows v&#xE0; reflections. Forward Rendering c&#xF3; th&#x1EC3; s&#x1EBD; ph&#xF9; h&#x1EE3;p h&#x1A1;n v&#x1EDB;i c&#xE1;c thi&#x1EBF;t b&#x1ECB; ph&#x1EA7;n c&#x1EE9;ng y&#x1EBF;u (smartphone).</p>
<blockquote>
<p>B&#x1EA1;n c&#xF3; th&#x1EC3; thay &#x111;&#x1ED5;i Rendering Path b&#x1EB1;ng c&#xE1;ch v&#xE0;o: Edit &gt; Project Settings &gt; Graphics &gt; Rendering Path.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_7.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
B&#x1EA5;t k&#x1EC3; ch&#xFA;ng ta ch&#x1ECD;n Rendering Path n&#xE0;o, vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng realtime lighting, shadow v&#xE0; reflection &#x111;&#x1EC1;u c&#xF3; th&#x1EC3; &#x1EA3;nh h&#x1B0;&#x1EDF;ng &#x111;&#x1EBF;n hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng. V&#xE0; &#x111;i&#x1EC1;u quan tr&#x1ECD;ng nh&#x1EA5;t l&#xE0; ph&#x1EA3;i hi&#x1EC3;u c&#xE1;ch t&#x1ED1;i &#x1B0;u 3 k&#x129; thu&#x1EAD;t n&#xE0;y. Tuy nhi&#xEA;n, vi&#x1EC7;c t&#x1ED1;i &#x1B0;u nh&#x1EEF;ng k&#x129; thu&#x1EAD;t n&#xE0;y r&#x1EA5;t ph&#x1EE9;c t&#x1EA1;p n&#xEA;n m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u ch&#xFA;ng &#x1EDF; m&#x1ED9;t ph&#x1EA7;n kh&#xE1;c c&#x1EE7;a Series.</p>
<p><strong>K&#x1EBF;t h&#x1EE3;p d&#x1EEF; li&#x1EC7;u t&#x1EEB; c&#xE1;c object &#x111;&#x1B0;&#x1EE3;c render</strong><br>
M&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u m&#x1ED9;t v&#xE0;i k&#x129; thu&#x1EAD;t kh&#xE1;c nhau s&#x1EED; d&#x1EE5;ng trong vi&#x1EC7;c t&#x1ED1;i &#x1B0;u Batching:<br>
<code>Static Batching</code> l&#xE0; m&#x1ED9;t k&#x129; thu&#x1EAD;t cho ph&#xE9;p Unity k&#x1EBF;t h&#x1EE3;p (batching) c&#xE1;c object c&#x1ED1; &#x111;&#x1ECB;nh (static) v&#xE0;o trong c&#xE1;c Mesh l&#x1EDB;n sau &#x111;&#xF3; render ch&#xFA;ng.<br>
<code>Dynamic Batching</code> l&#xE0; m&#x1ED9;t k&#x129; thu&#x1EAD;t cho ph&#xE9;p k&#x1EBF;t h&#x1EE3;p c&#xE1;c object, nh&#xF3;m nhi&#x1EC1;u &#x111;&#x1EC9;nh t&#x1B0;&#x1A1;ng t&#x1EF1; nhau c&#x1EE7;a ch&#xFA;ng tr&#xEA;n CPU v&#xE0; draw ch&#xFA;ng trong m&#x1ED9;t l&#x1EA7;n Draw Call.<br>
2 k&#x129; thu&#x1EAD;t n&#xE0;y r&#x1EA5;t h&#x1EEF;u &#xED;ch trong vi&#x1EC7;c gi&#xFA;p CPU gi&#x1EA3;m &#x111;i nhi&#x1EC1;u t&#xE1;c v&#x1EE5; Batching. Tuy nhi&#xEA;n n&#xF3; c&#x169;ng c&#xF3; m&#x1ED9;t s&#x1ED1; nh&#x1B0;&#x1EE3;c &#x111;i&#x1EC3;m: Static Batching t&#x1EA1;o ph&#xED; t&#x1ED5;n b&#x1ED9; nh&#x1EDB; memory v&#xE0; storage, trong khi &#x111;&#xF3; Dynamic Batching s&#x1EBD; t&#x1EA1;o ph&#xED; t&#x1ED5;n tr&#xEA;n CPU.</p>
<blockquote>
<p>&#x110;&#x1EC3; s&#x1EED; d&#x1EE5;ng Static Batching, b&#x1EA1;n c&#x1EA7;n v&#xE0;o c&#x1EED;a s&#x1ED5; Inspector c&#x1EE7;a nh&#x1EEF;ng object t&#x129;nh trong Scene c&#x1EE7;a b&#x1EA1;n, ch&#x1ECD;n Static.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_8.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"></p>
<blockquote>
<p>Sau &#x111;&#xF3; v&#xE0;o Edit-&gt; Project Settings &gt; Player &gt; Other Settings &gt; t&#xED;ch ch&#x1ECD;n Static Batching v&#xE0; Dynamic Batching (tu&#x1EF3; thu&#x1ED9;c v&#xE0;o b&#x1EA1;n mu&#x1ED1;n s&#x1EED; d&#x1EE5;ng Batching n&#xE0;o).</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_9.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
<em><strong>L&#x1B0;u &#xFD;:</strong></em> do Batching c&#xE1;c Object &#x111;&#x1ED9;ng s&#x1EBD; c&#xF3; ph&#xED; t&#x1ED5;n v&#x1EDB;i t&#x1EEB;ng &#x111;&#x1EC9;nh (Vertex) tr&#xEA;n CPU, n&#xEA;n vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng k&#x129; thu&#x1EAD;t Dynamic Batching ch&#x1B0;a th&#x1EF1;c s&#x1EF1; hi&#x1EC7;u qu&#x1EA3;. B&#x1EA1;n s&#x1EBD; c&#x1EA7;n th&#x1EED; nghi&#x1EC7;m k&#x129; thu&#x1EAD;t n&#xE0;y trong &#x1EE9;ng d&#x1EE5;ng &#x111;&#x1EC3; x&#xE1;c &#x111;&#x1ECB;nh xem n&#xF3; c&#xF3; th&#x1EAD;t s&#x1EF1; hi&#x1EC7;u qu&#x1EA3; hay kh&#xF4;ng. &#x110;&#x1ED1;i v&#x1EDB;i Batch, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u cho c&#xE1;c b&#x1EA1;n m&#x1ED9;t tool r&#x1EA5;t h&#x1EEF;u &#xED;ch tr&#xEA;n Assets Store &#x1EDF; c&#xE1;c ph&#x1EA7;n sau c&#x1EE7;a Series.<br>
<code>GPU instancing</code> l&#xE0; m&#x1ED9;t c&#xF4;ng ngh&#x1EC7; cho ph&#xE9;p m&#x1ED9;t l&#x1B0;&#x1EE3;ng l&#x1EDB;n c&#xE1;c object gi&#x1ED1;ng h&#x1EC7;t nhau c&#xF3; th&#x1EC3; &#x111;&#x1B0;&#x1EE3;c Batch m&#x1ED9;t c&#xE1;ch hi&#x1EC7;u qu&#x1EA3;. V&#xED; d&#x1EE5; &#x111;&#x1A1;n gi&#x1EA3;n nh&#x1B0; scene c&#x1EE7;a b&#x1EA1;n c&#xF3; nhi&#x1EC1;u nh&#x1EEF;ng &#x111;&#x1ED3;ng xu gi&#x1ED1;ng h&#x1EC7;t nhau, b&#x1EA1;n c&#xF3; th&#x1EC3; batch ch&#xFA;ng l&#x1EA1;i d&#x1EC5; d&#xE0;ng th&#xF4;ng qua GPU instancing. Tuy r&#x1EB1;ng c&#xF3; nh&#x1EEF;ng h&#x1EA1;n ch&#x1EBF; trong vi&#x1EC7;c s&#x1EED; d&#x1EE5;ng n&#xF3; c&#x169;ng nh&#x1B0; n&#xF3; kh&#xF4;ng &#x111;&#x1B0;&#x1EE3;c h&#x1ED7; tr&#x1EE3; tr&#xEA;n t&#x1EA5;t c&#x1EA3; c&#xE1;c Platform, tuy nhi&#xEA;n n&#x1EBF;u trong Scene c&#x1EE7;a b&#x1EA1;n c&#xF3; nhi&#x1EC1;u object gi&#x1ED1;ng nhau, c&#xF3; l&#x1EBD; k&#x129; thu&#x1EAD;t n&#xE0;y c&#xF3; th&#x1EC3; gi&#xFA;p b&#x1EA1;n n&#xE2;ng cao FPS &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a m&#xEC;nh.</p>
<blockquote>
<p>&#x110;&#x1EC3; s&#x1EED; d&#x1EE5;ng k&#x129; thu&#x1EAD;t GPU instancing, b&#x1EA1;n ch&#x1ECD;n Material s&#x1EED; d&#x1EE5;ng cho object c&#x1EE7;a b&#x1EA1;n &gt; ch&#x1ECD;n Enable GPU Instancing.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_10.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
<code>Texture atlasing</code> l&#xE0; m&#x1ED9;t k&#x129; thu&#x1EAD;t cho ph&#xE9;p k&#x1EBF;t h&#x1EE3;p nhi&#x1EC1;u texture v&#x1EDB;i nhau th&#xE0;nh m&#x1ED9;t texture l&#x1EDB;n. N&#xF3; th&#x1B0;&#x1EDD;ng &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng trong game 2D v&#xE0; UI, nh&#x1B0;ng c&#x169;ng c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng trong game 3D. Khi ch&#xFA;ng ta s&#x1EED; d&#x1EE5;ng k&#x129; thu&#x1EAD;t n&#xE0;y, ch&#xFA;ng ta c&#xF3; th&#x1EC3; &#x111;&#x1EA3;m b&#x1EA3;o r&#x1EB1;ng c&#xE1;c object c&#xF3; th&#x1EC3; d&#xF9;ng chung m&#x1ED9;t textures v&#xE0; do v&#x1EAD;y nh&#x1EEF;ng object n&#xE0;y c&#xF3; th&#x1EC3; batching. Unity c&#xF3; s&#x1EB5;n m&#x1ED9;t Texture atlasing tool cho game 2D, &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>Sprite Packer</code>.</p>
<blockquote>
<p>&#x1EDE; m&#x1EB7;c &#x111;&#x1ECB;nh, Sprite Packer s&#x1EBD; b&#x1ECB; &#x1EA9;n &#x111;i, tuy nhi&#xEA;n b&#x1EA1;n b&#x1EAD;t ch&#x1EE9;c n&#x103;ng n&#xE0;y b&#x1EB1;ng c&#xE1;ch v&#xE0;o Edit &gt; Project Settings &gt; Editor &gt; Sprite Packer.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_11.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"></p>
<blockquote>
<p>Sau &#x111;&#xF3; v&#xE0;o Windows &gt; Sprite Packer &#x111;&#x1EC3; m&#x1EDF; c&#x1EED;a s&#x1ED5; ch&#x1EE9;c n&#x103;ng n&#xE0;y.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/SpritePackerMain.png" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"></p>
<h2 id="skinnedmeshes">Skinned meshes</h2>
<p><code>Skinned Mesh Renderer</code> l&#xE0; m&#x1ED9;t component c&#x1EE7;a Unity &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng khi ch&#xFA;ng ta t&#x1EA1;o chuy&#x1EC3;n &#x111;&#x1ED9;ng mesh b&#x1EB1;ng c&#xE1;ch s&#x1EED; d&#x1EE5;ng m&#x1ED9;t k&#x129; thu&#x1EAD;t &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; bone animation. C&#xE1;c t&#xE1;c v&#x1EE5; li&#xEA;n quan t&#x1EDB;i vi&#x1EC7;c Rendering Skinned Mesh s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n tr&#xEA;n main thread ho&#x1EB7;c tr&#xEA;n c&#xE1;c worker threads, n&#xF3; ph&#x1EE5; thu&#x1ED9;c v&#xE0;o c&#xE0;i &#x111;&#x1EB7;t &#x1EE9;ng d&#x1EE5;ng v&#xE0; ph&#x1EA7;n c&#x1EE9;ng thi&#x1EBF;t b&#x1ECB;.<br>
N&#x1EBF;u khi b&#x1EA1;n ki&#x1EC3;m tra th&#x1EA5;y Rendering Skinned Mesh l&#xE0; nguy&#xEA;n nh&#xE2;n g&#xE2;y ra CPU bound, b&#x1EA1;n c&#xF3; th&#x1EC3; th&#x1EED; nghi&#x1EC7;m v&#xE0;i ph&#x1B0;&#x1A1;ng ph&#xE1;p d&#x1B0;&#x1EDB;i &#x111;&#xE2;y &#x111;&#x1EC3; c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u su&#x1EA5;t:<br>
&#x110;&#x1EA7;u ti&#xEA;n, b&#x1EA1;n h&#xE3;y duy&#x1EC7;t to&#xE0;n b&#x1ED9; nh&#x1EEF;ng object c&#xF3; th&#xE0;nh ph&#x1EA7;n Skinned Mesh Renderer. Sau &#x111;&#xF3; h&#xE3;y xem x&#xE9;t li&#x1EC7;u c&#xF3; c&#x1EA7;n ph&#x1EA3;i s&#x1EED; d&#x1EE5;ng ch&#xFA;ng kh&#xF4;ng? Nh&#x1B0; m&#xEC;nh &#x111;&#xE3; n&#xF3;i b&#xEA;n tr&#xEA;n, Skinned Mesh Renderer th&#x1B0;&#x1EDD;ng &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng khi t&#x1EA1;o animation trong object. N&#x1EBF;u object kh&#xF4;ng c&#x1EA7;n animation, b&#x1EA1;n c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng MeshRenderer thay v&#xEC; Skinned Mesh Renderer, &#x111;i&#x1EC1;u n&#xE0;y s&#x1EBD; l&#xE0;m t&#x103;ng hi&#x1EC7;u su&#x1EA5;t c&#x1EE7;a h&#x1EC7; th&#x1ED1;ng. Khi import model v&#xE0;o trong Unity, n&#x1EBF;u b&#x1EA1;n kh&#xF4;ng ch&#x1ECD;n import animations trong ph&#x1EA7;n Import Settings c&#x1EE7;a model, model s&#x1EBD; s&#x1EED; d&#x1EE5;ng MeshRenderer thay v&#xEC; Skinned Mesh Renderer.<br>
B&#x1EA1;n c&#x169;ng ch&#x1EC9; n&#xEA;n s&#x1EED; d&#x1EE5;ng duy nh&#x1EA5;t m&#x1ED9;t Skinned Mesh Renderer cho m&#x1ED7;i &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng. Unity s&#x1EBD; t&#x1ED1;i &#x1B0;u ho&#xE1; animation ch&#x1EC9; khi b&#x1EA1;n s&#x1EED; d&#x1EE5;ng k&#x1EBF;t h&#x1EE3;p m&#x1ED9;t Animation component v&#xE0; m&#x1ED9;t Skinned Mesh Renderer component.<br>
T&#x1EA1;i Component Skinned Mesh Renderer, b&#x1EA1;n c&#xF3; th&#x1EC3; tu&#x1EF3; ch&#x1EC9;nh th&#xE0;nh ph&#x1EA7;n Quality. Th&#xE0;nh ph&#x1EA7;n Quality cho ph&#xE9;p b&#x1EA1;n x&#xE1;c &#x111;&#x1ECB;nh s&#x1ED1; l&#x1B0;&#x1EE3;ng bone t&#x1ED1;i &#x111;a &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng m&#x1ED7;i vertex khi skinning. V&#xE0; t&#x1EA5;t nhi&#xEA;n, s&#x1ED1; l&#x1B0;&#x1EE3;ng bone c&#xE0;ng th&#x1EA5;p th&#xEC; hi&#x1EC7;u n&#x103;ng s&#x1EBD; c&#xE0;ng cao, tuy nhi&#xEA;n s&#x1EBD; ph&#x1EA3;i &#x111;&#xE1;nh &#x111;&#x1ED5;i hi&#x1EC7;u &#x1EE9;ng animation kh&#xF4;ng &#x111;&#x1B0;&#x1EE3;c ch&#x1EA5;t l&#x1B0;&#x1EE3;ng b&#x1EB1;ng s&#x1ED1; l&#x1B0;&#x1EE3;ng bone l&#x1EDB;n. Gi&#xE1; tr&#x1ECB; Auto x&#xE1;c &#x111;&#x1ECB;nh b&#x1EA1;n s&#x1EBD; s&#x1EED; d&#x1EE5;ng gi&#xE1; tr&#x1ECB; Blend Weights trong Quality Settings.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_13.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"><br>
&#x1EDE; trong m&#x1ED9;t v&#xE0;i platform, c&#xF4;ng vi&#x1EC7;c skinning c&#xF3; th&#x1EC3; &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n b&#x1EB1;ng GPU thay g&#xEC; CPU. &#x110;i&#x1EC1;u n&#xE0;y r&#x1EA5;t h&#x1EEF;u &#xED;ch khi &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n &#x111;ang g&#x1EB7;p CPU bound v&#xE0; GPU c&#x1EE7;a b&#x1EA1;n c&#xF2;n kh&#xE1; nhi&#x1EC1;u t&#xE0;i nguy&#xEA;n &#x111;&#x1EC3; s&#x1EED; d&#x1EE5;ng.</p>
<blockquote>
<p>&#x110;&#x1EC3; th&#x1EF1;c hi&#x1EC7;n k&#x129; thu&#x1EAD;t n&#xE0;y, b&#x1EA1;n c&#xF3; th&#x1EC3; b&#x1EAD;t GPU skinning  t&#x1EA1;i: Edit &gt; Project Settings &gt; Other Settings &gt; GPU skinning.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_12-1.jpg" alt="[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)" loading="lazy"></p>
<h2 id="ktlun">K&#x1EBE;T LU&#x1EAC;N</h2>
<p>Trong qu&#xE1; tr&#xEC;nh Render Frame, CPU s&#x1EBD; ph&#x1EA3;i th&#x1EF1;c hi&#x1EC7;n r&#x1EA5;t nhi&#x1EC1;u t&#xE1;c v&#x1EE5;. &#x110;i&#x1EC1;u n&#xE0;y d&#x1EAB;n &#x111;&#x1EBF;n vi&#x1EC7;c CPU h&#x1EA7;u nh&#x1B0; l&#xE0; v&#x1EA5;n &#x111;&#x1EC1; th&#x1B0;&#x1EDD;ng xuy&#xEA;n g&#x1EB7;p nh&#x1EA5;t trong c&#xE1;c &#x1EE9;ng d&#x1EE5;ng. Sau khi x&#xE1;c nh&#x1EAD;n &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n b&#x1ECB; CPU bound, hi&#x1EC3;u r&#xF5; qu&#xE1; tr&#xEC;nh, xem x&#xE9;t v&#x1EA5;n &#x111;&#x1EC1; n&#x1EB1;m &#x1EDF; t&#xE1;c v&#x1EE5; n&#xE0;o &#x111;&#x1EC3; r&#x1ED3;i &#x111;&#xF3; t&#xEC;m ra c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u ph&#xF9; h&#x1EE3;p cho &#x1EE9;ng d&#x1EE5;ng. Trong ph&#x1EA7;n ti&#x1EBF;p theo, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p &#x111;&#x1EC3; t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng khi &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n g&#x1EB7;p GPU Bound.</p>
<p><a href="https://blog.arrow-tech.vn/unity-series-5-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-gpu/">[Unity Series 5] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u GPU</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity Series 3] Tối ưu hiệu năng Ứng dụng game Unity - Tối ưu CPU]]></title><description><![CDATA[Trong phần 3, mình sẽ giới thiệu chi tiết các phương pháp tối ưu hoạt động của CPU để cải thiện hiệu năng ứng dụng game Unity.]]></description><link>https://blog.arrow-tech.vn/unity-series-3-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-cpu/</link><guid isPermaLink="false">63915acd7a2f410001205d9f</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Wed, 17 Jan 2018 06:49:41 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-4.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-4.jpg" alt="[Unity Series 3] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU"><p><a href="https://blog.arrow-tech.vn/unity-series-toi-uu-hieu-nang-ung-dung-phan-2/">[Unity Series 2] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - Rendering Pipeline</a></p>
<blockquote>
<p>CPU &#x111;&#x1B0;&#x1EE3;c coi l&#xE0; n&#xE3;o b&#x1ED9; c&#x1EE7;a ph&#x1EA7;n c&#x1EE9;ng, c&#xF3; ch&#x1EE9;c n&#x103;ng x&#x1EED; l&#xFD; m&#x1ECD;i th&#xF4;ng tin v&#xE0; d&#x1EEF; li&#x1EC7;u nh&#x1EAD;p v&#xE0;o. Gi&#xFA;p thi&#x1EBF;t b&#x1ECB; c&#xF3; th&#x1EC3; v&#x1EAD;n h&#xE0;nh v&#xE0; x&#x1EED; l&#xFD; ch&#x1A1;n chu m&#x1ECD;i t&#xE1;c v&#x1EE5; y&#xEA;u c&#x1EA7;u. Do v&#x1EAD;y vi&#x1EC7;c t&#x1ED1;i &#x1B0;u c&#xE1;c t&#xE1;c v&#x1EE5; c&#x1EE7;a CPU l&#xE0; m&#x1ED9;t trong nh&#x1EEF;ng c&#xF4;ng vi&#x1EC7;c c&#x1EA7;n &#x111;&#x1B0;&#x1EE3;c &#x1B0;u ti&#xEA;n h&#xE0;ng &#x111;&#x1EA7;u.</p>
</blockquote>
<p>Trong ph&#x1EA7;n tr&#x1B0;&#x1EDB;c, m&#xEC;nh &#x111;&#xE3; gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; qu&#xE1; tr&#xEC;nh Rendering v&#xE0; c&#xE1;c kh&#xE1;i ni&#x1EC7;m quan tr&#x1ECD;ng nh&#x1B0; Draw Call, SetPass Call hay Batch. Ch&#x1EAF;c h&#x1EB3;n c&#xE1;c b&#x1EA1;n &#x111;&#xE3; nh&#xEC;n th&#x1EA5;y nh&#x1EEF;ng kh&#xE1;i ni&#x1EC7;m n&#xE0;y trong c&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u trong ph&#x1EA7;n 1. Gi&#x1EDD; &#x111;&#xE2;y c&#xE1;c b&#x1EA1;n c&#xF3; th&#x1EC3; th&#xF4;ng qua nh&#x1EEF;ng kh&#xE1;i ni&#x1EC7;m n&#xE0;y &#x111;&#x1EC3; &#x111;&#x1ED1;i chi&#x1EBF;u x&#xE1;c &#x111;&#x1ECB;nh xem &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a m&#xEC;nh &#x111;ang g&#x1EB7;p CPU bound hay GPU bound, t&#x1EEB; &#x111;&#xF3; l&#x1EAD;p k&#x1EBF; ho&#x1EA1;ch t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE9;ng d&#x1EE5;ng. B&#xE0;i vi&#x1EBF;t &#x111;&#x1B0;&#x1EE3;c tham kh&#x1EA3;o t&#x1EEB; ngu&#x1ED3;n Performance Optimization Tutorial c&#x1EE7;a Unity.<br>
Tu&#x1EF3; thu&#x1ED9;c v&#xE0;o ph&#x1EA7;n c&#x1EE9;ng v&#xE0; lo&#x1EA1;i &#x1EE9;ng d&#x1EE5;ng m&#xE0; b&#x1EA1;n h&#x1B0;&#x1EDB;ng t&#x1EDB;i, s&#x1EBD; c&#xF3; c&#xE1;c quy chu&#x1EA9;n hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng kh&#xE1;c nhau. Trong ph&#x1EA7;n n&#xE0;y, m&#xEC;nh s&#x1EBD; &#x111;i v&#xE0;o c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u c&#x1EE5; th&#x1EC3; CPU.<br>
&#x110;&#x1EA7;u ti&#xEA;n, m&#xEC;nh xin nh&#x1EAF;c l&#x1EA1;i v&#xE0;i ki&#x1EBF;n th&#x1EE9;c c&#x169; trong ph&#x1EA7;n tr&#x1B0;&#x1EDB;c. Nh&#xEC;n chung, c&#xF4;ng vi&#x1EC7;c c&#x1EE7;a CPU trong qu&#xE1; tr&#xEC;nh Rendering &#x111;&#x1B0;&#x1EE3;c chia th&#xE0;nh ba b&#x1B0;&#x1EDB;c nh&#x1B0; sau:</p>
<ul>
<li>X&#xE1;c &#x111;&#x1ECB;nh xem nh&#x1EEF;ng object n&#xE0;o c&#x1EA7;n &#x111;&#x1B0;&#x1EE3;c v&#x1EBD;.</li>
<li>Thu th&#x1EAD;p th&#xF4;ng tin c&#xE1;c object c&#x1EA7;n &#x111;&#x1B0;&#x1EE3;c v&#x1EBD;.</li>
<li>D&#x1EF1;a v&#xE0;o c&#xE1;c th&#xF4;ng tin &#x111;&#xF3;, g&#x1EED;i l&#x1EC7;nh t&#x1EDB;i GPU.</li>
</ul>
<h2 id="multithreadedrendering">Multithreaded Rendering</h2>
<p>Nh&#x1EEF;ng c&#xF4;ng vi&#x1EC7;c n&#xE0;y s&#x1EBD; ch&#x1EE9;a nhi&#x1EC1;u t&#xE1;c v&#x1EE5; ri&#xEA;ng l&#x1EBB; v&#xE0; nh&#x1EEF;ng t&#xE1;c v&#x1EE5; n&#xE0;y c&#xF3; th&#x1EC3; th&#x1EF1;c hi&#x1EC7;n tr&#xEA;n nhi&#x1EC1;u lu&#x1ED3;ng (Multiple Threads). C&#xE1;c thread cho ph&#xE9;p c&#xE1;c t&#xE1;c v&#x1EE5; x&#x1EA3;y ra &#x111;&#x1ED3;ng th&#x1EDD;i. Trong Unity, c&#xF3; ba lo&#x1EA1;i thread &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng trong qu&#xE1; tr&#xEC;nh Rendering l&#xE0; Main thread, Render Thread v&#xE0; Worker Thread. Ba lo&#x1EA1;i thread n&#xE0;y m&#xEC;nh &#x111;&#xE3; gi&#x1EDB;i thi&#x1EC7;u trong ph&#x1EA7;n 1, c&#xE1;c b&#x1EA1;n c&#xF3; th&#x1EC3; xem l&#x1EA1;i. Khi c&#xE1;c t&#xE1;c v&#x1EE5; Rendering &#x111;&#x1B0;&#x1EE3;c ph&#xE2;n chia gi&#x1EEF;a c&#xE1;c thread ri&#xEA;ng bi&#x1EC7;t, &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>Multithreaded Rendering</code>.<br>
T&#xED;nh n&#x103;ng n&#xE0;y s&#x1EBD; chuy&#x1EC3;n c&#xE1;c t&#xE1;c v&#x1EE5; render graphic t&#x1EEB; main thread sang worker thread, r&#x1EA5;t h&#x1EEF;u &#xED;ch trong tr&#x1B0;&#x1EDD;ng h&#x1EE3;p main thread ph&#x1EA3;i x&#x1EED; l&#xFD; qu&#xE1; nhi&#x1EC1;u t&#xE1;c v&#x1EE5;.</p>
<blockquote>
<p>&#x110;&#x1EC3; b&#x1EAD;t ch&#x1EE9;c n&#x103;ng Multithreaded Rendering, c&#xE1;c b&#x1EA1;n c&#xF3; th&#x1EC3; v&#xE0;o Edit &gt; Project Settings &gt; Player &gt; Android Setting &gt; Other Settings &gt; Multithreaded Rendering.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_2.jpg" alt="[Unity Series 3] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU" loading="lazy"><br>
Tuy nhi&#xEA;n, kh&#xF4;ng ph&#x1EA3;i t&#x1EA5;t c&#x1EA3; c&#xE1;c platform &#x111;&#x1EC1;u h&#x1ED7; tr&#x1EE3; Multithreaded Rendering (WebGL), do v&#x1EAD;y kh&#xF4;ng ph&#x1EA3;i l&#xFA;c n&#xE0;o t&#xED;nh n&#x103;ng n&#xE0;y c&#x169;ng s&#x1EBD; ho&#x1EA1;t &#x111;&#x1ED9;ng nh&#x1B0; nh&#x1EEF;ng g&#xEC; ch&#xFA;ng ta mong mu&#x1ED1;n. Tr&#xEA;n c&#xE1;c platform kh&#xF4;ng h&#x1ED7; tr&#x1EE3; Multithreaded Rendering, t&#x1EA5;t c&#x1EA3; c&#xE1;c t&#xE1;c v&#x1EE5; CPU s&#x1EBD; &#x111;&#x1EC1;u th&#x1EF1;c hi&#x1EC7;n tr&#xEA;n c&#xF9;ng m&#x1ED9;t lo&#x1EA1;i thread. V&#xEC; v&#x1EAD;y, khi &#x111;&#xF3; vi&#x1EC7;c t&#x1ED1;i &#x1B0;u b&#x1EA5;t k&#x1EF3; t&#xE1;c v&#x1EE5; n&#xE0;o c&#x1EE7;a CPU s&#x1EBD; &#x111;&#x1EC1;u l&#xE0;m t&#x103;ng hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng.</p>
<h2 id="gimslngsetpasscall">Gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng SetPass Call</h2>
<p>Trong ho&#x1EA1;t &#x111;&#x1ED9;ng g&#x1EED;i l&#x1EC7;nh t&#x1EDB;i GPU, c&#xE1;c t&#xE1;c v&#x1EE5; t&#x1ED1;n k&#xE9;m nh&#x1EA5;t ch&#xED;nh l&#xE0; c&#xE1;c cu&#x1ED9;c g&#x1ECD;i SetPass Call. N&#x1EBF;u &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a ch&#xFA;ng ta &#x111;ang b&#x1ECB; CPU bound &#x1EDF; c&#xE1;c t&#xE1;c v&#x1EE5; g&#x1EED;i l&#x1EC7;nh t&#x1EDB;i GPU, th&#xEC; vi&#x1EC7;c gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng SetPass Calls l&#xE0; c&#xE1;ch t&#x1ED1;t nh&#x1EA5;t trong h&#x1EA7;u h&#x1EBF;t c&#xE1;c tr&#x1B0;&#x1EDD;ng h&#x1EE3;p &#x111;&#x1EC3; c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u su&#x1EA5;t. Tuy s&#x1ED1; l&#x1B0;&#x1EE3;ng SetPass Call v&#xE0; m&#x1ED1;i quan h&#x1EC7; c&#x1EE7;a n&#xF3; v&#x1EDB;i s&#x1ED1; l&#x1B0;&#x1EE3;ng Batches ph&#x1EE5; thu&#x1ED9;c v&#xE0;o nhi&#x1EC1;u y&#x1EBF;u t&#x1ED1;, nh&#x1B0;ng th&#xF4;ng th&#x1B0;&#x1EDD;ng ch&#xFA;ng ta c&#xF3; th&#x1EC3; gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng SetPass Calls b&#x1EB1;ng c&#xE1;ch <strong>gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng c&#xE1;c Batches ho&#x1EB7;c t&#x1EA1;o ra nhi&#x1EC1;u objects c&#xF9;ng s&#x1EED; d&#x1EE5;ng chung RenderState    (Batching).</strong> N&#x1EBF;u vi&#x1EC7;c gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng c&#xE1;c Batches kh&#xF4;ng l&#xE0;m gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng SetPass Call, n&#xF3; v&#x1EAB;n c&#xF3; th&#x1EC3; c&#x1EA3;i thi&#x1EC7;n hi&#x1EC7;u n&#x103;ng. &#x110;i&#x1EC1;u n&#xE0;y l&#xE0; do CPU c&#xF3; th&#x1EC3; x&#x1EED; l&#xFD; m&#x1ED9;t Batch &#x111;&#x1A1;n l&#x1EBB; hi&#x1EC7;u qu&#x1EA3; h&#x1A1;n l&#xE0; m&#x1ED9;t t&#x1EAD;p h&#x1EE3;p c&#xE1;c Batch, ngay c&#x1EA3; khi ch&#xFA;ng c&#xF3; c&#xF9;ng m&#x1ED9;t d&#x1EEF; li&#x1EC7;u Mesh gi&#x1ED1;ng nhau.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3_1.jpg" alt="[Unity Series 3] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU" loading="lazy"><br>
&#x110;&#x1EC3; gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng Batch v&#xE0; SetPass Call, nh&#xEC;n chung c&#xF3; m&#x1ED9;t v&#xE0;i ph&#x1B0;&#x1A1;ng ph&#xE1;p c&#x1A1; b&#x1EA3;n nh&#x1B0; sau:</p>
<ul>
<li>Gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng object &#x111;&#x1B0;&#x1EE3;c render &gt; gi&#x1EA3;m c&#x1EA3; Batch v&#xE0; SetPass Call.</li>
<li>Gi&#x1EA3;m s&#x1ED1; l&#x1EA7;n m&#x1ED7;i object &#x111;&#x1B0;&#x1EE3;c render &gt; gi&#x1EA3;m SetPass Call.</li>
<li>K&#x1EBF;t h&#x1EE3;p d&#x1EEF; li&#x1EC7;u t&#x1EEB; c&#xE1;c object &#x111;&#x1B0;&#x1EE3;c render &gt; gi&#x1EA3;m Batch.</li>
</ul>
<p>B&#x1EDF;i v&#xEC; b&#xE0;i vi&#x1EBF;t n&#xE0;y kh&#xE1; d&#xE0;i, n&#xEA;n m&#xEC;nh xin ph&#xE9;p &#x111;&#x1B0;&#x1EE3;c chia b&#xE0;i t&#x1ED1;i &#x1B0;u CPU th&#xE0;nh 2 ph&#x1EA7;n. Trong ph&#x1EA7;n ti&#x1EBF;p theo m&#xEC;nh s&#x1EBD; &#x111;i s&#xE2;u v&#xE0;o c&#xE1;c c&#xE1;ch gi&#x1EA3;i quy&#x1EBF;t c&#x1EE5; th&#x1EC3; c&#x1EE7;a c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p gi&#x1EA3;m s&#x1ED1; l&#x1B0;&#x1EE3;ng SetPass Call v&#xE0; m&#x1ED9;t v&#xE0;i k&#x129; thu&#x1EAD;t t&#x1ED1;i &#x1B0;u v&#x1EDB;i Skinned Mesh. C&#xE1;c b&#x1EA1;n c&#xF3; th&#x1EC3; xem ph&#x1EA7;n ti&#x1EBF;p theo c&#x1EE7;a b&#xE0;i vi&#x1EBF;t &#x1EDF; link d&#x1B0;&#x1EDB;i:<br>
<a href="https://blog.arrow-tech.vn/unity-series-4-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-cpu-tiep/">[Unity Series 4] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU (ti&#x1EBF;p)</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity Series 2] Tối ưu hiệu năng Ứng dụng game Unity - Rendering Pipeline]]></title><description><![CDATA[Trước khi bắt đầu tối ưu hiệu năng ứng dụng game trong Unity, chúng ta cần hiểu CPU và GPU xử lý như thế nào, từ đó tìm ra được vấn đề nằm ở đâu trong quá trình CPU và GPU xử lý.]]></description><link>https://blog.arrow-tech.vn/unity-series-toi-uu-hieu-nang-ung-dung-phan-2/</link><guid isPermaLink="false">63915acd7a2f410001205d9c</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Tue, 16 Jan 2018 03:48:58 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2.jpg" alt="[Unity Series 2] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - Rendering Pipeline"><p><a href="https://blog.arrow-tech.vn/unity-series-toi-uu-hieu-nang-ung-dung/">[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u</a></p>
<blockquote>
<p>&#x1EDE; ph&#x1EA7;n tr&#x1B0;&#x1EDB;c, m&#xEC;nh &#x111;&#xE3; gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; c&#xE1;c c&#xF4;ng c&#x1EE5; s&#x1EED; d&#x1EE5;ng trong Unity &#x111;&#x1EC3; ki&#x1EC3;m tra hi&#x1EC7;u n&#x103;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng. Trong ph&#x1EA7;n n&#xE0;y, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u qu&#xE1; tr&#xEC;nh Rendering v&#xE0; m&#x1ED9;t v&#xE0;i kh&#xE1;i ni&#x1EC7;m c&#x1EE7;a n&#xF3;.</p>
</blockquote>
<p>Sau khi t&#xEC;m ra &#x111;&#x1B0;&#x1EE3;c nh&#x1EEF;ng nguy&#xEA;n nh&#xE2;n g&#xE2;y ra hi&#x1EC7;n t&#x1B0;&#x1EE3;ng gi&#x1EAD;t lag c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng, vi&#x1EC7;c ti&#x1EBF;p theo ch&#xFA;ng ta c&#x1EA7;n l&#xE0;m l&#xE0; gi&#x1EA3;i quy&#x1EBF;t t&#x1EEB;ng v&#x1EA5;n &#x111;&#x1EC1; m&#x1ED9;t. Tuy nhi&#xEA;n, &#x111;&#x1EC3; gi&#x1EA3;i quy&#x1EBF;t &#x111;&#x1B0;&#x1EE3;c v&#x1EA5;n &#x111;&#x1EC1;, ch&#xFA;ng ta c&#x1EA7;n hi&#x1EC3;u CPU v&#xE0; GPU x&#x1EED; l&#xFD; nh&#x1B0; th&#x1EBF; n&#xE0;o, t&#x1EEB; &#x111;&#xF3; t&#xEC;m ra &#x111;&#x1B0;&#x1EE3;c v&#x1EA5;n &#x111;&#x1EC1; n&#x1EB1;m &#x1EDF; &#x111;&#xE2;u trong qu&#xE1; tr&#xEC;nh CPU v&#xE0; GPU x&#x1EED; l&#xFD;.  B&#xE0;i vi&#x1EBF;t &#x111;&#x1B0;&#x1EE3;c tham kh&#x1EA3;o t&#x1EEB; ngu&#x1ED3;n Performance Optimization Tutorial c&#x1EE7;a Unity.</p>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/optimize-all-things-NEW.png" alt="[Unity Series 2] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - Rendering Pipeline" loading="lazy"><br>
N&#xF3;i m&#x1ED9;t c&#xE1;ch &#x111;&#x1A1;n gi&#x1EA3;n, qu&#xE1; tr&#xEC;nh Rendering &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n nh&#x1B0; sau:</p>
<ul>
<li>&#x110;&#x1EA7;u ti&#xEA;n, CPU s&#x1EBD; x&#xE1;c &#x111;&#x1ECB;nh nh&#x1EEF;ng object n&#xE0;o c&#x1EA7;n &#x111;&#x1B0;&#x1EE3;c v&#x1EBD; v&#xE0; v&#x1EBD; n&#xF3; nh&#x1B0; th&#x1EBF; n&#xE0;o</li>
<li>Sau &#x111;&#xF3; CPU s&#x1EBD; g&#x1EED;i nh&#x1EEF;ng m&#xF4; t&#x1EA3; b&#xEA;n tr&#xEA;n t&#x1EDB;i GPU.</li>
<li>GPU s&#x1EBD; v&#x1EBD; c&#xE1;c object theo m&#xF4; t&#x1EA3; c&#x1EE7;a CPU.</li>
</ul>
<p>Gi&#x1EDD; th&#xEC; c&#xE1;c b&#x1EA1;n c&#x169;ng &#x111;&#xE3; h&#xEC;nh dung ra CPU v&#xE0; GPU l&#xE0;m vi&#x1EC7;c g&#xEC; trong qu&#xE1; tr&#xEC;nh Rendering r&#x1ED3;i nh&#x1EC9;. Ti&#x1EBF;p theo ch&#xFA;ng ta s&#x1EBD; &#x111;i s&#xE2;u chi ti&#x1EBF;t v&#xE0;o t&#x1EEB;ng c&#xF4;ng vi&#x1EC7;c n&#xE0;y:<br>
V&#x1EDB;i m&#x1ED7;i Frame, CPU s&#x1EBD; th&#x1EF1;c hi&#x1EC7;n c&#xF4;ng vi&#x1EC7;c sau:</p>
<ul>
<li>CPU s&#x1EBD; duy&#x1EC7;t to&#xE0;n b&#x1ED9; nh&#x1EEF;ng object c&#xF3; trong Scene &#x111;&#x1EC3; x&#xE1;c &#x111;&#x1ECB;nh object n&#xE0;o c&#x1EA7;n &#x111;&#x1B0;&#x1EE3;c render. Nh&#x1EEF;ng object kh&#xF4;ng &#x111;&#x1B0;&#x1EE3;c render &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>culled</code> (Ch&#x1EAF;c c&#xE1;c b&#x1EA1;n s&#x1EBD; m&#x1B0;&#x1EDD;ng t&#x1B0;&#x1EE3;ng &#x111;&#x1EBF;n t&#xED;nh n&#x103;ng Occlusion Culling nh&#x1EC9; - t&#xED;nh n&#x103;ng n&#xE0;y s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c gi&#x1EDB;i thi&#x1EC7;u &#x1EDF; ph&#x1EA7;n sau).</li>
<li>Sau &#x111;&#xF3;, CPU s&#x1EBD; thu th&#x1EAD;p th&#xF4;ng tin v&#x1EC1; c&#xE1;c object &#x111;&#x1B0;&#x1EE3;c render v&#xE0; s&#x1EAF;p x&#x1EBF;p d&#x1EEF; li&#x1EC7;u thu &#x111;&#x1B0;&#x1EE3;c v&#xE0;o trong c&#xE1;c d&#xF2;ng l&#x1EC7;nh &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>Draw Calls</code>. M&#x1ED9;t Draw Calls ch&#x1EE9;a c&#xE1;c th&#xF4;ng tin v&#x1EC1; m&#x1ED9;t mesh duy nh&#x1EA5;t v&#xE0; n&#xF3; x&#xE1;c &#x111;&#x1ECB;nh mesh n&#xE0;y s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c render nh&#x1B0; th&#x1EBF; n&#xE0;o ( v&#xED; d&#x1EE5; nh&#x1B0; nh&#x1EEF;ng texture n&#xE0;o s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng). Trong m&#x1ED9;t v&#xE0;i tr&#x1B0;&#x1EDD;ng h&#x1EE3;p, c&#xE1;c object c&#xF3; th&#x1EC3; chia s&#x1EBB; nh&#x1EEF;ng setting c&#xF3; th&#x1EC3; &#x111;&#x1B0;&#x1EE3;c k&#x1EBF;t h&#x1EE3;p v&#xE0;o chung m&#x1ED9;t Draw Call. K&#xEA;t h&#x1EE3;p d&#x1EEF; li&#x1EC7;u c&#x1EE7;a c&#xE1;c object kh&#xE1;c nhau v&#xE0;o chung m&#x1ED9;t Draw Call &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>batching</code>. V&#x1EDB;i m&#x1ED7;i Draw Call, CPU s&#x1EBD; t&#x1EA1;o m&#x1ED9;t g&#xF3;i d&#x1EEF; li&#x1EC7;u &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>Batch</code>.</li>
</ul>
<p>V&#x1EDB;i m&#x1ED7;i Batch ch&#x1EE9;a m&#x1ED9;t Draw Call, CPU s&#x1EBD; ti&#x1EBF;p t&#x1EE5;c th&#x1EF1;c hi&#x1EC7;n nh&#x1B0; sau:</p>
<ul>
<li>CPU s&#x1EBD; g&#x1EED;i m&#x1ED9;t l&#x1EC7;nh t&#x1EDB;i GPU &#x111;&#x1EC3; thay &#x111;&#x1ED5;i m&#x1ED9;t s&#x1ED1; bi&#x1EBF;n &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>Render State</code>. Nh&#x1EEF;ng l&#x1EC7;nh n&#xE0;y &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; <code>SetPass Call</code>. M&#x1ED9;t Setpass Call s&#x1EBD; g&#x1ECD;i cho GPU nh&#x1EEF;ng setting n&#xE0;o s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng cho mesh ti&#x1EBF;p theo. M&#x1ED9;t Setpass Call s&#x1EBD; ch&#x1EC9; &#x111;&#x1B0;&#x1EE3;c g&#x1EED;i &#x111;i n&#x1EBF;u mesh ti&#x1EBF;p theo &#x111;&#x1B0;&#x1EE3;c render y&#xEA;u c&#x1EA7;u m&#x1ED9;t thay &#x111;&#x1ED5;i trong Render State t&#x1EEB; mesh tr&#x1B0;&#x1EDB;c &#x111;&#xF3;.</li>
<li>Sau &#x111;&#xF3;, CPU s&#x1EBD; g&#x1EED;i Draw Call t&#x1EDB;i GPU. Draw Call s&#x1EBD; ch&#x1EC9; th&#x1ECB; GPU render mesh b&#x1EB1;ng c&#xE1;ch s&#x1EED; d&#x1EE5;ng c&#xE1;c setting &#x111;&#x1B0;&#x1EE3;c x&#xE1;c &#x111;&#x1ECB;nh trong cu&#x1ED9;c g&#x1ECD;i SetPass Call g&#x1EA7;n nh&#x1EA5;t.</li>
<li>Trong m&#x1ED9;t v&#xE0;i tr&#x1B0;&#x1EDD;ng h&#x1EE3;p, c&#xF3; th&#x1EC3; c&#x1EA7;n nhi&#x1EC1;u h&#x1A1;n m&#x1ED9;t pass c&#xF3; th&#x1EC3; &#x111;&#x1B0;&#x1EE3;c y&#xEA;u c&#x1EA7;u cho Batch. M&#x1ED9;t <code>Pass</code> l&#xE0; m&#x1ED9;t ph&#x1EA7;n c&#x1EE7;a shader code v&#xE0; m&#x1ED9;t pass m&#x1EDB;i y&#xEA;u c&#x1EA7;u m&#x1ED9;t s&#x1EF1; thay &#x111;&#x1ED5;i t&#x1EDB;i Render State. V&#x1EDB;i m&#x1ED7;i pass trong Batch, CPU s&#x1EBD; g&#x1EED;i m&#x1ED9;t cu&#x1ED9;c g&#x1ECD;i SetPass Call m&#x1EDB;i v&#xE0; sau &#x111;&#xF3; s&#x1EBD; g&#x1EED;i l&#x1EA1;i Draw Call.</li>
</ul>
<p>GPU s&#x1EBD; x&#x1EED; l&#xFD; v&#x1EBD; c&#xE1;c object nh&#x1B0; sau:</p>
<ul>
<li>GPU s&#x1EBD; x&#x1EED; l&#xFD; c&#xE1;c t&#xE1;c v&#x1EE5; t&#x1EEB; CPU theo th&#x1EE9; t&#x1EF1; ch&#xFA;ng &#x111;&#x1B0;&#x1EE3;c g&#x1EED;i.</li>
<li>N&#x1EBF;u t&#xE1;c v&#x1EE5; hi&#x1EC7;n t&#x1EA1;i l&#xE0; m&#x1ED9;t cu&#x1ED9;c g&#x1ECD;i SetPass Call, GPU s&#x1EBD; c&#x1EAD;p nh&#x1EAD;t l&#x1EA1;i Render State.</li>
<li>N&#x1EBF;u t&#xE1;c v&#x1EE5; hi&#x1EC7;n t&#x1EA1;i l&#xE0; m&#x1ED9;t Draw Call, GPU s&#x1EBD; render Mesh.</li>
<li>Qu&#xE1; tr&#xEC;nh n&#xE0;y s&#x1EBD; l&#x1EB7;p l&#x1EA1;i li&#xEA;n t&#x1EE5;c cho &#x111;&#x1EBF;n khi t&#x1EA5;t c&#x1EA3; c&#xE1;c t&#xE1;c v&#x1EE5; &#x111;&#x1B0;&#x1EE3;c g&#x1EED;i t&#x1EEB; CPU &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c x&#x1EED; l&#xFD; b&#x1EDF;i GPU.</li>
</ul>
<h2 id="ktlun">K&#x1EBE;T LU&#x1EAC;N</h2>
<p>&#x110;i&#x1EC1;u quan tr&#x1ECD;ng nh&#x1EA5;t m&#xE0; ch&#xFA;ng ta c&#x1EA7;n hi&#x1EC3;u v&#x1EC1; rendering l&#xE0;: c&#x1EA3; CPU v&#xE0; GPU ph&#x1EA3;i ho&#xE0;n th&#xE0;nh t&#x1EA5;t c&#x1EA3; c&#xE1;c t&#xE1;c v&#x1EE5; &#x111;&#x1EC3; render frame. Do v&#x1EAD;y, ch&#x1EC9; c&#x1EA7;n m&#x1ED9;t t&#xE1;c v&#x1EE5; n&#xE0;o &#x111;&#xF3; t&#x1ED1;n nhi&#x1EC1;u th&#x1EDD;i gian &#x111;&#x1EC3; ho&#xE0;n th&#xE0;nh, n&#xF3; s&#x1EBD; l&#xE0; nguy&#xEA;n nh&#xE2;n g&#xE2;y ra delay trong vi&#x1EC7;c render frame -&gt; gi&#x1EA3;m FPS c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng. Khi &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a ch&#xFA;ng ta t&#x1ED1;n qu&#xE1; nhi&#x1EC1;u th&#x1EDD;i gian &#x111;&#x1EC3; render m&#x1ED9;t frame do CPU th&#x1EF1;c hi&#x1EC7;n c&#xE1;c t&#xE1;c v&#x1EE5; th&#xEC; &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; CPU Bound. V&#xE0; t&#x1B0;&#x1A1;ng t&#x1EF1; v&#x1EDB;i GPU &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i l&#xE0; GPU Bound. &#x110;&#x1EC3; t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE9;ng d&#x1EE5;ng, tr&#x1B0;&#x1EDB;c khi &#x111;i v&#xE0;o t&#x1ED1;i &#x1B0;u ch&#xFA;ng ta c&#x1EA7;n n&#x1EAF;m &#x111;&#x1B0;&#x1EE3;c &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a m&#xEC;nh &#x111;ang b&#x1ECB; CPU bound hay GPU bound, t&#x1EEB; &#x111;&#xF3; t&#xEC;m ra h&#x1B0;&#x1EDB;ng &#x111;i cho vi&#x1EC7;c t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng.<br>
Trong ph&#x1EA7;n ti&#x1EBF;p theo, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u cho c&#xE1;c b&#x1EA1;n c&#xE1;ch t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng khi &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n b&#x1ECB; CPU bound hay GPU bound.<br>
<a href="https://blog.arrow-tech.vn/unity-series-3-toi-uu-hieu-nang-ung-dung-game-unity-toi-uu-cpu/">[Unity Series 3] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - T&#x1ED1;i &#x1B0;u CPU</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[[Unity Series 1] Tối ưu hiệu năng Ứng dụng game Unity - Các công cụ tối ưu]]></title><description><![CDATA[Trong Series này, mình sẽ giới thiệu cho các bạn cách tìm ra những nguyên nhân cũng như cách giải quyết các vấn đề về tối ưu hiệu năng ứng dụng Game trong Unity.]]></description><link>https://blog.arrow-tech.vn/unity-series-toi-uu-hieu-nang-ung-dung/</link><guid isPermaLink="false">63915acd7a2f410001205d9a</guid><category><![CDATA[Unity]]></category><dc:creator><![CDATA[Datbq ]]></dc:creator><pubDate>Mon, 15 Jan 2018 09:07:36 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/Untitled-2-1.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u"><p>T&#x1ED1;i &#x1B0;u h&#xF3;a hi&#x1EC7;u n&#x103;ng l&#xE0; r&#x1EA5;t quan tr&#x1ECD;ng khi n&#xF3;i &#x111;&#x1EBF;n th&#xE0;nh c&#xF4;ng c&#x1EE7;a m&#x1EE5;c ti&#xEA;u c&#x1EE7;a b&#x1EA1;n. Th&#xF4;ng qua t&#x1ED1;i &#x1B0;u h&#xF3;a, b&#x1EA1;n c&#xF3; th&#x1EC3; t&#x1EA1;o ra nh&#x1EEF;ng &#x1EE9;ng d&#x1EE5;ng v&#xE0; game c&#xF3; dung l&#x1B0;&#x1EE3;ng th&#x1EA5;p v&#xE0; ch&#x1EA1;y m&#x1B0;&#x1EE3;t m&#xE0;, nh&#x1EAD;n &#x111;&#x1B0;&#x1EE3;c nhi&#x1EC1;u l&#x1B0;&#x1EE3;ng t&#x1EA3;i ho&#x1EB7;c ho&#xE0;n th&#xE0;nh b&#x1EA5;t k&#x1EF3; m&#x1EE5;c ti&#xEA;u n&#xE0;o kh&#xE1;c c&#x1EE7;a m&#xEC;nh.</p>
</blockquote>
<p>Trong qu&#xE1; tr&#xEC;nh l&#xE0;m game v&#xE0; &#x1EE9;ng d&#x1EE5;ng, ch&#x1EAF;c h&#x1EB3;n t&#x1EA5;t c&#x1EA3; m&#x1ECD;i ng&#x1B0;&#x1EDD;i &#x111;&#xE3; g&#x1EB7;p &#xED;t nh&#x1EA5;t m&#x1ED9;t l&#x1EA7;n nh&#x1EE9;c &#x111;&#x1EA7;u v&#x1EDB;i v&#x1EA5;n &#x111;&#x1EC1; dung l&#x1B0;&#x1EE3;ng qu&#xE1; l&#x1EDB;n hay FPS qu&#xE1; th&#x1EA5;p. Ng&#x1B0;&#x1EDD;i d&#xF9;ng s&#x1EBD; c&#xE0;ng &#xED;t ki&#xEA;n nh&#x1EAB;n khi ph&#x1EA3;i &#x111;&#x1EE3;i t&#x1EA3;i m&#x1ED9;t &#x1EE9;ng d&#x1EE5;ng v&#x1EDB;i dung l&#x1B0;&#x1EE3;ng l&#x1EDB;n, c&#x169;ng nh&#x1B0; v&#x1EA5;n &#x111;&#x1EC1; v&#x1EC1; dung l&#x1B0;&#x1EE3;ng 3G c&#x1EA7;n s&#x1EED; d&#x1EE5;ng &#x111;&#x1EC3; t&#x1EA3;i &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a ch&#xFA;ng ta. &#x110;i&#x1EC1;u n&#xE0;y d&#x1EAB;n &#x111;&#x1EBF;n ng&#x1B0;&#x1EDD;i d&#xF9;ng c&#x1EA3;m th&#x1EA5;y ng&#x1EA7;n ng&#x1EA1;i trong vi&#x1EC7;c t&#x1EA3;i &#x1EE9;ng d&#x1EE5;ng. T&#x1B0;&#x1A1;ng t&#x1EF1; v&#x1EDB;i FPS qu&#xE1; th&#x1EA5;p, vi&#x1EC7;c gi&#x1EAD;t lag c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng s&#x1EBD; g&#xE2;y c&#x1EA3;m gi&#xE1;c &#x1EE9;c ch&#x1EBF; cho t&#x1EA5;t c&#x1EA3; ng&#x1B0;&#x1EDD;i d&#xF9;ng. B&#x1EA1;n &#x111;&#x1EEB;ng ng&#x1EA7;n ng&#x1EA1;i b&#x1ECF; ra th&#xEA;m th&#x1EDD;i gian &#x111;&#x1EC3; t&#x1ED1;i &#x1B0;u dung l&#x1B0;&#x1EE3;ng v&#xE0; &#x1EE9;ng d&#x1EE5;ng cu&#x1EA3; m&#xEC;nh, n&#x1EBF;u b&#x1EA1;n kh&#xF4;ng mu&#x1ED1;n nh&#x1EAD;n h&#xE0;ng lo&#x1EA1;t nh&#x1EEF;ng &#x111;&#xE1;nh gi&#xE1; t&#x1EC7; v&#xE0; rating c&#x1EF1;c th&#x1EA5;p cho &#x1EE9;ng d&#x1EE5;ng m&#xE0; m&#xEC;nh &#x111;&#xE3; t&#x1ED1;n c&#xF4;ng s&#x1EE9;c v&#xE0; t&#xE2;m huy&#x1EBF;t &#x111;&#x1EC3; l&#xE0;m. Trong Series b&#xE0;i vi&#x1EBF;t n&#xE0;y, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u cho c&#xE1;c b&#x1EA1;n c&#xE1;ch t&#xEC;m ra nh&#x1EEF;ng nguy&#xEA;n nh&#xE2;n c&#x169;ng nh&#x1B0; c&#xE1;ch gi&#x1EA3;i quy&#x1EBF;t c&#xE1;c v&#x1EA5;n &#x111;&#x1EC1;. B&#xE0;i vi&#x1EBF;t &#x111;&#x1B0;&#x1EE3;c tham kh&#x1EA3;o t&#x1EEB; ngu&#x1ED3;n Performance Optimization Tutorial c&#x1EE7;a Unity.</p>
<p>Tr&#x1B0;&#x1EDB;c khi b&#x1EAF;t &#x111;&#x1EA7;u v&#xE0;o t&#x1ED1;i &#x1B0;u &#x1EE9;ng d&#x1EE5;ng, vi&#x1EC7;c &#x111;&#x1EA7;u ti&#xEA;n ch&#xFA;ng ta c&#x1EA7;n l&#xE0;m l&#xE0; x&#xE1;c &#x111;&#x1ECB;nh nguy&#xEA;n nh&#xE2;n n&#xE0;o g&#xE2;y ra &#x1EE9;ng d&#x1EE5;ng ch&#x1EA1;y ch&#x1EAD;m, gi&#x1EAD;t lag. Trong ph&#x1EA7;n 1, m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u cho c&#xE1;c b&#x1EA1;n c&#xE1;c c&#xF4;ng c&#x1EE5; c&#x1EF1;c k&#xEC; h&#x1EEF;u &#xED;ch &#x111;&#x1EC3; ki&#x1EC3;m tra ho&#x1EA1;t &#x111;&#x1ED9;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng. C&#xE1;c c&#xF4;ng c&#x1EE5; n&#xE0;y &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c t&#xED;ch h&#x1EE3;p s&#x1EB5;n trong Unity, c&#xF4;ng vi&#x1EC7;c c&#x1EE7;a c&#xE1;c b&#x1EA1;n l&#xE0; ch&#x1EC9; c&#x1EA7;n m&#x1EDF; n&#xF3; v&#xE0; b&#x1EAF;t &#x111;&#x1EA7;u qu&#xE1; tr&#xEC;nh t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng cho &#x1EE9;ng d&#x1EE5;ng cu&#x1EA3; m&#xEC;nh.</p>
<h2 id="profilerwindow">PROFILER WINDOW</h2>
<p>Profiler window l&#xE0; c&#xF4;ng c&#x1EE5; &#x111;&#x1EA7;u ti&#xEA;n m&#xEC;nh s&#x1EBD; gi&#x1EDB;i thi&#x1EC7;u cho c&#xE1;c b&#x1EA1;n. C&#xF4;ng c&#x1EE5; n&#xE0;y s&#x1EBD; cho b&#x1EA1;n c&#xE1;c th&#xF4;ng tin chi ti&#x1EBF;t &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n &#x111;ang &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n nh&#x1B0; th&#x1EBF; n&#xE0;o. V&#x1EDB;i giao di&#x1EC7;n &#x111;&#x1A1;n gi&#x1EA3;n v&#xE0; chi ti&#x1EBF;t, c&#xE1;c b&#x1EA1;n s&#x1EBD; d&#x1EC5; d&#xE0;ng t&#xEC;m ra nh&#x1EEF;ng nguy&#xEA;n nh&#xE2;n l&#xE0;m cho &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a c&#xE1;c b&#x1EA1;n ch&#x1EA1;y ch&#x1EAD;m.</p>
<blockquote>
<p>&#x110;&#x1EC3; m&#x1EDF; Profiler, ch&#x1ECD;n Window tr&#xEA;n thanh menubar &gt; Profiler.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic2.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u" loading="lazy"></p>
<p><strong>Hierarchy View</strong><br>
B&#xEA;n tr&#xE1;i c&#x1EED;a s&#x1ED5; Profiler l&#xE0; c&#xE1;c m&#x1EE5;c Profiler nh&#x1B0; CPU,Rendering, Audio, Physics, UI,&#x2026; v&#xE0; b&#xEA;n ph&#x1EA3;i t&#x1EEB;ng m&#x1EE5;c l&#xE0; d&#xF2;ng timeline ho&#x1EA1;t &#x111;&#x1ED9;ng c&#x1EE7;a c&#xE1;c Profiler. B&#xE2;y gi&#x1EDD;, b&#x1EA1;n h&#xE3;y ch&#x1EA1;y &#x1EE9;ng d&#x1EE5;ng v&#xE0; theo d&#xF5;i ho&#x1EA1;t &#x111;&#x1ED9;ng c&#x1EE7;a Profiler. Theo d&#xF5;i FPS v&#xE0; d&#xF2;ng ho&#x1EA1;t &#x111;&#x1ED9;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng, ch&#x1ECD;n nh&#x1EEF;ng frame FPS th&#x1EA5;p v&#xE0; t&#xEC;m hi&#x1EC3;u ph&#x1EA7;n n&#xE0;o &#x111;ang chi&#x1EBF;m nhi&#x1EC1;u CPU &#x1EDF; b&#xEA;n d&#x1B0;&#x1EDB;i (Hierarchy). L&#xE0;m t&#x1B0;&#x1A1;ng t&#x1EF1; v&#x1EDB;i c&#xE1;c m&#x1EE5;c Profiler kh&#xE1;c.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic1-1.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u" loading="lazy"><br>
N&#x1EBF;u nh&#x1B0; c&#xE1;c b&#x1EA1;n kh&#xF4;ng hi&#x1EC3;u nh&#x1EEF;ng t&#xE1;c v&#x1EE5; x&#x1EA3;y ra trong m&#x1EE5;c Hierarchy (trong Profiler CPU Usage), h&#xE3;y t&#xEC;m hi&#x1EC3;u k&#x129; &#x111;&#x1B0;&#x1EDD;ng link b&#xEA;n d&#x1B0;&#x1EDB;i c&#x1EE7;a Unity:<br>
<a href="https://docs.unity3d.com/Manual/ProfilerCPU.html?ref=blog.arrow-tech.vn">https://docs.unity3d.com/Manual/ProfilerCPU.html</a><br>
<strong>Timeline View</strong></p>
<blockquote>
<p>&#x110;&#x1EC3; m&#x1EDF; Timeline View, ch&#x1ECD;n CPU Usage -&gt; ch&#x1ECD;n Hierarchy -&gt; ch&#x1ECD;n Timeline.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic3-4.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u" loading="lazy"><br>
Timeline s&#x1EBD; cung c&#x1EA5;p cho ch&#xFA;ng ta 2 th&#xF4;ng tin: th&#x1EE9; t&#x1EF1; m&#xE0; c&#xE1;c t&#xE1;c v&#x1EE5; CPU &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n v&#xE0; thread n&#xE0;o ch&#x1ECB;u tr&#xE1;ch nhi&#x1EC7;m th&#x1EF1;c hi&#x1EC7;n t&#xE1;c v&#x1EE5; &#x111;&#xF3;.<br>
Trong Unity, C&#xE1;c thread cho ph&#xE9;p c&#xE1;c t&#xE1;c v&#x1EE5; x&#x1EA3;y ra &#x111;&#x1ED3;ng th&#x1EDD;i (Mutilple threading). C&#xF3; 3 lo&#x1EA1;i thread &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng trong qu&#xE1; tr&#xEC;nh rendering bao g&#x1ED3;m: main thread, render thread v&#xE0; worker thread. Main thread l&#xE0; n&#x1A1;i th&#x1EF1;c hi&#x1EC7;n ph&#x1EA7;n l&#x1EDB;n c&#xE1;c t&#xE1;c v&#x1EE5; CPU, bao g&#x1ED3;m m&#x1ED9;t v&#xE0;i t&#xE1;c v&#x1EE5; rendering. Render thread l&#xE0; m&#x1ED9;t thread &#x111;&#x1EB7;c bi&#x1EC7;t c&#xF3; nhi&#x1EC7;m v&#x1EE5; g&#x1EED;i c&#xE1;c l&#x1EC7;nh &#x111;&#x1EBF;n GPU. Worker thread s&#x1EBD; th&#x1EF1;c hi&#x1EC7;n c&#xE1;c t&#xE1;c v&#x1EE5; ri&#xEA;ng l&#x1EBB; v&#xED; d&#x1EE5; nh&#x1B0; culling ho&#x1EB7;c mesh skinning. T&#xE1;c v&#x1EE5; n&#xE0;o &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n b&#x1EDF;i thread n&#xE0;o ph&#x1EE5; thu&#x1ED9;c v&#xE0;o ph&#x1EA7;n c&#xE0;i &#x111;&#x1EB7;t &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a ch&#xFA;ng ta v&#xE0; ph&#x1EA7;n c&#x1EE9;ng thi&#x1EBF;t b&#x1ECB; m&#xE0; &#x1EE9;ng d&#x1EE5;ng &#x111;&#x1B0;&#x1EE3;c ch&#x1EA1;y.<br>
<strong>Profiler tr&#xEA;n thi&#x1EBF;t b&#x1ECB; android</strong><br>
&#x110;&#x1EEB;ng v&#x1ED9;i m&#x1EEB;ng khi &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n &#x111;ang c&#xF3; FPS cao nh&#xE9;. Profiler &#x111;ang record ho&#x1EA1;t &#x111;&#x1ED9;ng c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng d&#x1EF1;a tr&#xEA;n ph&#x1EA7;n c&#x1EE9;ng m&#xE1;y t&#xED;nh. &#x110;i&#x1EC1;u n&#xE0;y c&#xF3; th&#x1EC3; r&#x1EA5;t kh&#xE1;c bi&#x1EC7;t khi b&#x1EA1;n ch&#x1EA1;y tr&#xEA;n &#x111;i&#x1EC7;n tho&#x1EA1;i. &#x110;&#x1EC3; c&#xF3; c&#xE1;i nh&#xEC;n chi ti&#x1EBF;t v&#x1EC1; c&#xE1;ch ho&#x1EA1;t &#x111;&#x1ED9;ng tr&#xEA;n &#x111;i&#x1EC7;n tho&#x1EA1;i, c&#xE1;c b&#x1EA1;n c&#xF3; th&#x1EC3; ch&#x1EA1;y Profiler tr&#xEA;n &#x111;i&#x1EC7;n tho&#x1EA1;i nh&#x1B0; sau (thi&#x1EBF;t b&#x1ECB; Android):</p>
<blockquote>
<p>T&#x1EA1;i Build Setting, ch&#x1ECD;n platform &gt; Development Build &gt; Autoconnect Profiler &gt; Build&amp;Run.<br>
T&#x1EA1;i m&#x1EE5;c Connected Player &#x1EDF; c&#x1EED;a s&#x1ED5; Profiler ch&#x1ECD;n thi&#x1EBF;t b&#x1ECB; android.</p>
</blockquote>
<h2 id="editorlog">EDITOR LOG</h2>
<p>Gi&#x1EEF; k&#xED;ch th&#x1B0;&#x1EDB;c &#x1EE9;ng d&#x1EE5;ng &#x1EDF; m&#x1EE9;c t&#x1ED1;i thi&#x1EC3;u l&#xE0; r&#x1EA5;t quan tr&#x1ECD;ng. B&#x1B0;&#x1EDB;c &#x111;&#x1EA7;u ti&#xEA;n trong vi&#x1EC7;c t&#x1ED1;i &#x1B0;u k&#xED;ch th&#x1B0;&#x1EDB;c file l&#xE0; x&#xE1;c &#x111;&#x1ECB;nh nh&#x1EEF;ng Asset t&#x1ED1;n nhi&#x1EC1;u b&#x1ED9; nh&#x1EDB; nh&#x1EA5;t. &#x110;i&#x1EC1;u n&#xE0;y c&#xF3; th&#x1EC3; d&#x1EC5; d&#xE0;ng theo d&#xF5;i b&#x1EB1;ng c&#x1EED;a s&#x1ED5; Editor Log trong Unity (l&#x1B0;u tr&#x1EEF; th&#xF4;ng tin c&#x1EE7;a l&#x1EA7;n build g&#x1EA7;n nh&#x1EA5;t).</p>
<blockquote>
<p>&#x110;&#x1EC3; m&#x1EDF; Editor Log, click chu&#x1ED9;t ph&#x1EA3;i v&#xE0;o c&#x1EED;a s&#x1ED5; Console v&#xE0; ch&#x1ECD;n Open Editor Log.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic4.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u" loading="lazy"><br>
Th&#xF4;ng th&#x1B0;&#x1EDD;ng, Texture, Sound v&#xE0; Animation chi&#x1EBF;m nhi&#x1EC1;u b&#x1ED9; nh&#x1EDB; nh&#x1EA5;t. X&#xE1;c &#x111;&#x1ECB;nh nh&#x1EEF;ng Asset t&#x1ED1;n nhi&#x1EC1;u b&#x1ED9; nh&#x1EDB;, t&#x1EEB; &#x111;&#xF3; t&#xEC;m c&#xE1;ch t&#x1ED1;i &#x1B0;u nh&#x1EEF;ng Assets n&#xE0;y &#x111;&#x1EC3; gi&#x1EA3;m k&#xED;ch th&#x1B0;&#x1EDB;c &#x1EE9;ng d&#x1EE5;ng.</p>
<h2 id="renderingstatistic">RENDERING STATISTIC</h2>
<p>B&#x1EA1;n c&#xF3; th&#x1EC3; theo d&#xF5;i c&#xE1;c s&#x1ED1; li&#x1EC7;u v&#x1EC1; Rendering t&#x1EA1;i c&#x1EED;a s&#x1ED5; n&#xE0;y (Ch&#x1ECD;n Stats trong c&#x1EED;a s&#x1ED5; Game)  N&#xF3; ch&#x1EE9;a c&#xE1;c th&#xF4;ng tin h&#x1EEF;u &#xED;ch v&#x1EC1; Audio v&#xE0; Graphics. &#x110;&#x1EB7;c bi&#x1EC7;t c&#xE1;c th&#xF4;ng tin v&#x1EC1; s&#x1ED1; Batches, Save by batching hay Setpass calls v&#xE0; Shadow casters, c&#x169;ng nh&#x1B0; s&#x1ED1; l&#x1B0;&#x1EE3;ng Tris v&#xE0; Verts. C&#xE1;c ch&#x1EC9; s&#x1ED1; n&#xE0;y s&#x1EBD; &#x111;&#x1B0;&#x1EE3;c n&#xF3;i k&#x129; t&#x1EA1;i c&#xE1;c ph&#x1EA7;n sau c&#x1EE7;a Series. B&#x1EA1;n c&#x169;ng c&#xF3; th&#x1EC3; xem c&#xE1;c th&#xF4;ng tin n&#xE0;y trong ph&#x1EA7;n Rendering t&#x1EA1;i Profiler.<br>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/topic5.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u" loading="lazy"><br>
<em><strong>L&#x1B0;u &#xFD;:</strong></em> FPS trong c&#x1EED;a s&#x1ED5; Statistic kh&#xF4;ng ph&#x1EA3;i l&#xE0; FPS th&#x1EF1;c t&#x1EBF; trong  &#x1EE9;ng d&#x1EE5;ng c&#x1EE7;a b&#x1EA1;n. N&#xF3; ch&#x1EC9; hi&#x1EC3;n th&#x1ECB; th&#x1EDD;i gian &#x111;&#x1EC3; update Frame v&#xE0; render Game view.</p>
<h2 id="framedebugger">FRAME DEBUGGER</h2>
<p>Unity c&#xF2;n cho ph&#xE9;p b&#x1EA1;n theo d&#xF5;i chi ti&#x1EBF;t qu&#xE1; tr&#xEC;nh Rendering c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng th&#xF4;ng qua c&#x1EED;a s&#x1ED5; Frame Debugger. C&#x1EED;a s&#x1ED5; Frame Debugger cho ph&#xE9;p b&#x1EA1;n theo d&#xF5;i t&#x1EEB;ng b&#x1B0;&#x1EDB;c Render &#x111;&#x1ED3; ho&#x1EA1; &#x1EE9;ng d&#x1EE5;ng t&#x1EA1;i Frame hi&#x1EC7;n t&#x1EA1;i v&#xE0; t&#x1EEB;ng Draw Call &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng &#x111;&#x1EC3; Render Frame &#x111;&#xF3;.</p>
<blockquote>
<p>&#x110;&#x1EC3; m&#x1EDF; c&#x1EED;a s&#x1ED5; Frame Debugger, T&#x1EA1;i menu Windows &gt; Frame Debugger.</p>
</blockquote>
<p><img src="https://blog.arrow-tech.vn/content/images/2018/01/topic6.jpg" alt="[Unity Series 1] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - C&#xE1;c c&#xF4;ng c&#x1EE5; t&#x1ED1;i &#x1B0;u" loading="lazy"><br>
List b&#xEA;n tr&#xE1;i hi&#x1EC3;n th&#x1ECB; tr&#xEC;nh t&#x1EF1; c&#xE1;c DrawCalls &#x111;&#x1B0;&#x1EE3;c v&#x1EBD; (v&#xE0; c&#xE1;c event kh&#xE1;c nh&#x1B0; framebuffer clear). B&#xEA;n ph&#x1EA3;i hi&#x1EC3;n th&#x1ECB; th&#xF4;ng tin c&#x1EE7;a DrawCall nh&#x1B0; geometry hay shader.</p>
<h2 id="ktlun">K&#x1EBE;T LU&#x1EAC;N</h2>
<p>Th&#xF4;ng qua nh&#x1EEF;ng c&#xF4;ng c&#x1EE5; n&#xE0;y, ch&#xFA;ng ta s&#x1EBD; t&#xEC;m hi&#x1EC3;u &#x111;&#x1B0;&#x1EE3;c nguy&#xEA;n nh&#xE2;n do &#x111;&#xE2;u g&#xE2;y ra hi&#x1EC7;n t&#x1B0;&#x1EE3;ng gi&#x1EAD;t lag v&#xE0; dung l&#x1B0;&#x1EE3;ng l&#x1EDB;n c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng. Trong nh&#x1EEF;ng ph&#x1EA7;n ti&#x1EBF;p theo, m&#xEC;nh s&#x1EBD; &#x111;i v&#xE0;o gi&#x1EDB;i thi&#x1EC7;u lu&#x1ED3;ng ho&#x1EA1;t &#x111;&#x1ED9;ng, c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p t&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng t&#x1EEB;ng ph&#x1EA7;n c&#x1EE7;a &#x1EE9;ng d&#x1EE5;ng nh&#x1B0; t&#x1ED1;i &#x1B0;u CPU, GPU hay t&#x1EAD;p trung s&#xE2;u h&#x1A1;n nh&#x1B0; t&#x1ED1;i &#x1B0;u Model, UI.</p>
<p><a href="https://blog.arrow-tech.vn/unity-series-toi-uu-hieu-nang-ung-dung-phan-2/">[Unity Series 2] T&#x1ED1;i &#x1B0;u hi&#x1EC7;u n&#x103;ng &#x1EE8;ng d&#x1EE5;ng game Unity - Rendering Pipeline</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>