<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: GameOptim</title>
    <description>The latest articles on DEV Community by GameOptim (@gameoptim).</description>
    <link>https://dev.to/gameoptim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3712156%2F2856be03-78df-4cc3-848e-f48a8d1ce581.png</url>
      <title>DEV Community: GameOptim</title>
      <link>https://dev.to/gameoptim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gameoptim"/>
    <language>en</language>
    <item>
      <title>How Can Unity Developers Define Test Intervals and Automate GOT Online Data Uploads?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Wed, 23 Sep 2026 07:53:45 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-define-test-intervals-and-automate-got-online-data-uploads-9aj</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-define-test-intervals-and-automate-got-online-data-uploads-9aj</guid>
      <description>&lt;p&gt;GOT Online now supports two new runtime capabilities: developers can upload test data through an API and use runtime Tags to define custom test intervals for report statistics. These features make it easier to integrate GOT Online with automated testing workflows and analyze performance across different gameplay scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;GOT Online has added two practical features for Unity development and performance testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload test data through an API at runtime.&lt;/li&gt;
&lt;li&gt;Define custom test intervals with runtime Tags for interval-based statistics in online reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features are particularly useful when a single test covers multiple scenes or gameplay states, or when teams want to integrate performance profiling into automated testing pipelines.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Can Unity Developers Compare Performance Across Different Test Scenarios?
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;Overview&lt;/strong&gt; mode of a GOT Online report, many pages provide important performance metrics such as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fztr39bg25mw5qdtvf8i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fztr39bg25mw5qdtvf8i3.png" alt=" " width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of these metrics are calculated as averages across the entire test. This provides an overview of overall performance, but a single test may cover multiple scenes or gameplay scenarios with very different performance characteristics.&lt;/p&gt;

&lt;p&gt;For example, one scene may have relatively low CPU usage while another may contain more complex gameplay logic and significantly higher CPU time.&lt;/p&gt;

&lt;p&gt;If all data is averaged together, performance spikes in a specific scenario can be diluted by the rest of the test.&lt;/p&gt;

&lt;p&gt;To make these differences easier to identify, GOT Online now supports &lt;strong&gt;test interval statistics&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Different gameplay scenarios can be treated as separate intervals, allowing developers to analyze performance for each interval independently.&lt;/p&gt;

&lt;p&gt;This provides a more detailed view of how performance changes throughout a test instead of relying only on the overall average.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Can Developers Define Custom Test Intervals at Runtime?
&lt;/h2&gt;

&lt;p&gt;Scene-based intervals may not always be detailed enough.&lt;/p&gt;

&lt;p&gt;Even within the same Unity scene, different gameplay states can produce very different performance characteristics. For example, a scene might include exploration, combat, and UI-heavy interactions.&lt;/p&gt;

&lt;p&gt;To provide more flexibility, GOT Online introduces the &lt;code&gt;UWAEngine.Tag&lt;/code&gt; API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;UWAEngine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tag&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developers can call this function at runtime to mark a specific test interval.&lt;/p&gt;

&lt;p&gt;Once a Tag is applied, it will override the original Unity scene name for the corresponding interval.&lt;/p&gt;

&lt;p&gt;As a result, the scene name displayed in the GOT Online report and the interval statistics will use the specified &lt;strong&gt;Tag&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This allows development teams to define performance intervals based on actual gameplay states rather than relying only on Unity scene transitions.&lt;/p&gt;

&lt;p&gt;For example, instead of analyzing an entire scene as one interval, developers can define separate intervals such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exploration&lt;/li&gt;
&lt;li&gt;Combat&lt;/li&gt;
&lt;li&gt;Boss Fight&lt;/li&gt;
&lt;li&gt;Inventory&lt;/li&gt;
&lt;li&gt;UI Interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact Tags depend on the team's testing workflow and what they want to measure.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Can Developers Automatically Upload GOT Online Test Data?
&lt;/h2&gt;

&lt;p&gt;Performance testing is increasingly being integrated with automated testing workflows.&lt;/p&gt;

&lt;p&gt;Many teams are combining GOT with automated testing tools to reduce repetitive manual work and make performance testing easier to run at scale.&lt;/p&gt;

&lt;p&gt;Previously, after a test was completed, developers needed to manually click the upload button to send the collected data to GOT Online.&lt;/p&gt;

&lt;p&gt;The new runtime upload API allows this step to be automated.&lt;/p&gt;

&lt;p&gt;After configuring the required project and account information in advance, test data can be uploaded automatically without manual interaction.&lt;/p&gt;

&lt;p&gt;The API is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;UWAEngine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Upload&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;timeLimitSec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;projectName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;timeLimitSec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The parameters are documented in the SDK documentation.&lt;/p&gt;

&lt;p&gt;This makes the API suitable for automated testing workflows where a test can be executed, data can be collected, and the resulting performance data can then be uploaded automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Should Developers Know About the Runtime Upload API?
&lt;/h2&gt;

&lt;p&gt;There are two important limitations to keep in mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The automatic upload feature is only available for GOT Online.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is designed specifically for uploading performance test data to the GOT Online service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. IL2CPP compatibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When using the IL2CPP scripting backend, the API supports &lt;strong&gt;Unity 2018 and later&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During the upload process, the application displays an &lt;strong&gt;uploading&lt;/strong&gt; status. After the upload is completed successfully, it displays a &lt;strong&gt;completed&lt;/strong&gt; status.&lt;/p&gt;

&lt;p&gt;This provides basic feedback during automated or semi-automated testing workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Do Runtime Tags and Automatic Upload Work Together?
&lt;/h2&gt;

&lt;p&gt;These two features can also be useful when building a more automated performance testing process.&lt;/p&gt;

&lt;p&gt;A typical workflow could be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run automated test → Mark gameplay intervals with &lt;code&gt;UWAEngine.Tag&lt;/code&gt; → Collect performance data → Upload data with &lt;code&gt;UWAEngine.Upload&lt;/code&gt; → Analyze interval statistics in GOT Online&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With runtime Tags, developers can define meaningful performance intervals during the test itself.&lt;/p&gt;

&lt;p&gt;With runtime upload, the resulting data can be sent to GOT Online automatically.&lt;/p&gt;

&lt;p&gt;Together, they reduce manual steps while making performance data more structured and easier to compare across different gameplay scenarios.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Can Unity Developers Take Away?
&lt;/h2&gt;

&lt;p&gt;The new GOT Online runtime APIs address two common problems in performance testing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 1: Overall averages can hide local performance issues.&lt;/strong&gt;&lt;br&gt;
Runtime Tags allow developers to divide a test into meaningful intervals and analyze each interval separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2: Manual data uploads add unnecessary steps to automated testing.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;UWAEngine.Upload&lt;/code&gt; allows test data to be uploaded automatically after testing.&lt;/p&gt;

&lt;p&gt;For teams building automated Unity performance testing workflows, these capabilities can make test data collection and analysis more consistent and easier to integrate into existing pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can &lt;code&gt;UWAEngine.Tag&lt;/code&gt; be used to define performance intervals?
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;code&gt;UWAEngine.Tag(string tag)&lt;/code&gt; can be called at runtime to mark test intervals. The specified Tag overrides the original Unity scene name for the corresponding interval in GOT Online.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does GOT Online only support scene-based performance analysis?
&lt;/h3&gt;

&lt;p&gt;No. Runtime Tags allow developers to define more granular intervals within the same Unity scene based on gameplay states or other testing requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can GOT Online test data be uploaded automatically?
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;code&gt;UWAEngine.Upload&lt;/code&gt; can upload test data automatically after the required project and account information has been configured.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does automatic upload support IL2CPP?
&lt;/h3&gt;

&lt;p&gt;Yes. For IL2CPP projects, the upload API supports Unity 2018 and later.&lt;/p&gt;




&lt;h2&gt;
  
  
  About GameOptim GOT Online
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GameOptim GOT Online&lt;/strong&gt; is a cloud-based performance analysis platform for Unity game development. It provides detailed performance data and analysis across areas such as CPU, GPU, memory, Lua, and rendering.&lt;/p&gt;

&lt;p&gt;By combining runtime data collection with cloud-based analysis, GOT Online helps development teams identify performance issues, compare different test scenarios, and support performance optimization throughout development and testing.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>performance</category>
      <category>testing</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>How Can Unity Developers Identify the Causes of GPU Pressure on Mobile Devices?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Mon, 21 Sep 2026 09:16:30 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-identify-the-causes-of-gpu-pressure-on-mobile-devices-1mbn</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-identify-the-causes-of-gpu-pressure-on-mobile-devices-1mbn</guid>
      <description>&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;As mobile games continue to pursue higher visual quality, GPU optimization has become increasingly important. Differences between mobile GPU architectures can make GPU bottlenecks difficult to identify and optimize.&lt;/p&gt;

&lt;p&gt;GameOptim GOT Online GPU Mode provides a set of tools for analyzing GPU pressure from multiple perspectives, including GPU rendering, bandwidth, rendering resources, Overdraw, and device temperature. These metrics help Unity developers move from identifying GPU pressure to locating the specific rendering workload behind it.&lt;/p&gt;

&lt;p&gt;This article introduces the key GPU analysis features and explains how developers can use them to investigate common GPU performance issues.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Higher-quality visuals often mean more complex rendering workloads. More geometry, textures, shader calculations, transparency, and post-processing can all increase GPU pressure on mobile devices.&lt;/p&gt;

&lt;p&gt;At the same time, different GPU vendors and architectures expose different performance metrics, making it difficult to rely on a single indicator when investigating GPU bottlenecks.&lt;/p&gt;

&lt;p&gt;GameOptim GOT Online GPU Mode provides several analysis modules designed to break GPU pressure down into more actionable data.&lt;/p&gt;

&lt;p&gt;The main capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance Brief:&lt;/strong&gt; Quickly identify areas of high GPU pressure and prioritize optimization tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Analysis:&lt;/strong&gt; Analyze GPU pressure from rendering and bandwidth perspectives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendering Resource Analysis:&lt;/strong&gt; Investigate how textures and meshes are loaded and used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overdraw Snapshot:&lt;/strong&gt; Locate the sources of high Overdraw more easily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Temperature:&lt;/strong&gt; Determine whether GPU workload is a major contributor to device heating.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How Can Developers Quickly Identify GPU Pressure?
&lt;/h1&gt;

&lt;p&gt;The Performance Brief provides a high-level overview of GPU performance during testing.&lt;/p&gt;

&lt;p&gt;GameOptim displays FPS and GPU Clocks and highlights GPU Bound frames with a light red background.&lt;/p&gt;

&lt;p&gt;GPU Bound indicates a high GPU workload, where the number of GPU clock cycles required for computation is high enough that the GPU may not be able to sustain the target frame rate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1kzgbtwqf9x8rt71xeo2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1kzgbtwqf9x8rt71xeo2.png" alt=" " width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Performance Brief also summarizes metrics from four areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU performance&lt;/li&gt;
&lt;li&gt;Rendering statistics&lt;/li&gt;
&lt;li&gt;Texture resource analysis&lt;/li&gt;
&lt;li&gt;Mesh resource analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also provides corresponding optimization tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnp3ie0uthcroppl7cafs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnp3ie0uthcroppl7cafs.png" alt=" " width="799" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The purpose of the brief is not to replace detailed analysis, but to help developers quickly filter a large number of performance metrics and identify high-priority optimization tasks.&lt;/p&gt;

&lt;p&gt;When a metric requires deeper investigation, developers can move into the corresponding analysis module.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can GPU Rendering Metrics Reveal the Source of GPU Pressure?
&lt;/h1&gt;

&lt;p&gt;The GPU Analysis module examines GPU pressure from two perspectives: &lt;strong&gt;rendering&lt;/strong&gt; and &lt;strong&gt;bandwidth&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The available metrics may differ between GPU vendors because GameOptim collects different parameters from different GPU architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can GPU Clocks Be Used to Identify Rendering Pressure?
&lt;/h2&gt;

&lt;p&gt;GPU Clocks is one of the primary metrics for evaluating GPU performance.&lt;/p&gt;

&lt;p&gt;By examining the GPU Clocks curve, developers can quickly identify scenes where GPU pressure is high.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frxf3ti725wahgbeuju4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frxf3ti725wahgbeuju4s.png" alt=" " width="799" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GameOptim also provides average values and performance trends for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU Shaded&lt;/li&gt;
&lt;li&gt;GPU Shader Cycles&lt;/li&gt;
&lt;li&gt;GPU Primitive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When GPU Clocks is high in a particular scene, these metrics can help developers determine which part of the rendering workload is contributing to the GPU pressure and identify potential optimization directions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ifrk7pyyfdlvev33ctu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ifrk7pyyfdlvev33ctu.png" alt=" " width="799" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What Is the Difference Between Shader Instructions and Shader Cycles?
&lt;/h1&gt;

&lt;p&gt;Starting with GameOptim SDK 2.4.9, the Mali GPU report includes &lt;strong&gt;GPU Shader Instructions&lt;/strong&gt;, which represents the number of shader instructions executed by the GPU per frame.&lt;/p&gt;

&lt;p&gt;GPU Shader Instructions and Shader Cycles describe different aspects of shader execution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shader Cycles:&lt;/strong&gt; The processing cycles required when the shader actually runs on the GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shader Instructions:&lt;/strong&gt; The instruction operations contained in the shader.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F92z6p0i7fsmcbcp8s7vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F92z6p0i7fsmcbcp8s7vn.png" alt=" " width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The number of processing cycles required for the same instructions can differ between GPUs with different performance characteristics.&lt;/p&gt;

&lt;p&gt;Therefore, Shader Instructions can help developers understand the complexity of the shader itself, while Shader Cycles provide information about the actual processing workload on the GPU.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Culled Primitives Be Broken Down Further?
&lt;/h1&gt;

&lt;p&gt;GameOptim SDK 2.4.9 also provides a more detailed breakdown of &lt;strong&gt;Culled Primitives&lt;/strong&gt; under GPU Primitive.&lt;/p&gt;

&lt;p&gt;Three additional metrics are available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FacingCullingPrimitives:&lt;/strong&gt; Number of primitives removed through facing culling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FrustumCullingPrimitives:&lt;/strong&gt; Number of primitives removed through frustum culling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CoverageCullingPrimitives:&lt;/strong&gt; Number of small primitives removed through coverage culling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy87qvbspxxlvnusf5eh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy87qvbspxxlvnusf5eh.png" alt=" " width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These metrics help developers understand the composition of Culled Primitives and identify rendering resources that may be causing unnecessary GPU workload in specific scenes.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Analyze GPU Bandwidth Pressure?
&lt;/h1&gt;

&lt;p&gt;High GPU read and write bandwidth can contribute to significant heat generation and power consumption, making bandwidth an important area to investigate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flxvkpeomqge7nslzpv71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flxvkpeomqge7nslzpv71.png" alt=" " width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting with GameOptim SDK 2.4.9, &lt;strong&gt;Read Total&lt;/strong&gt; is further divided into more detailed metrics.&lt;/p&gt;

&lt;p&gt;For Mali GPUs, the report includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-end Read&lt;/li&gt;
&lt;li&gt;LoadStore Read&lt;/li&gt;
&lt;li&gt;Texture Read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These correspond to bandwidth used by the GPU's Tile Unit, Load/Store Unit, and Texture Unit, including reads of TileList data, vertex input attributes, Uniform data, color/depth data, and texture data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe5lggacya62g6a0mnqyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe5lggacya62g6a0mnqyg.png" alt=" " width="798" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Adreno GPUs, Read Total is divided into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vertex Read&lt;/li&gt;
&lt;li&gt;SP Read&lt;/li&gt;
&lt;li&gt;Texture Read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics similarly cover reads of TileList data, vertex input attributes, Uniform data, color/depth data, and texture data.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Does Cache Hit Rate Affect GPU Read Bandwidth?
&lt;/h1&gt;

&lt;p&gt;For different GPU architectures, Read Total depends on the amount of data processed by the relevant GPU units per second as well as the hit rates of the L1 and L2 caches.&lt;/p&gt;

&lt;p&gt;When the total amount of data remains unchanged, a higher cache hit rate results in a lower Read Total because more data can be served from the cache instead of being read from farther memory.&lt;/p&gt;

&lt;p&gt;GameOptim also provides related metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU Texture Filter&lt;/li&gt;
&lt;li&gt;GPU Stall&lt;/li&gt;
&lt;li&gt;GPU Texture Cache Miss&lt;/li&gt;
&lt;li&gt;GPU Primitive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics can help developers further investigate the source of GPU bandwidth pressure.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Check Whether Textures and Meshes Are Being Used Efficiently?
&lt;/h1&gt;

&lt;p&gt;The more textures and meshes participate in rendering, and the more frequently they are sampled, the more likely memory usage, GPU bandwidth, and GPU Clocks are to increase.&lt;/p&gt;

&lt;p&gt;To understand whether rendering resources are actually being used efficiently, developers can enable texture and mesh resource analysis and inspect their specific usage.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Texture Resource Analysis Identify Unused Textures?
&lt;/h1&gt;

&lt;p&gt;The texture resource analysis page provides information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Texture memory usage&lt;/li&gt;
&lt;li&gt;Texture count&lt;/li&gt;
&lt;li&gt;Texture dimensions&lt;/li&gt;
&lt;li&gt;Texture rendering utilization&lt;/li&gt;
&lt;li&gt;Mipmap status&lt;/li&gt;
&lt;li&gt;Mipmap sampling rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpzg1zxhrib5vtuyeeana.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpzg1zxhrib5vtuyeeana.png" alt=" " width="799" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fimaq8t88hley78q7so7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fimaq8t88hley78q7so7r.png" alt=" " width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Texture rendering utilization can help identify textures that remain loaded in memory but never participate in rendering.&lt;/p&gt;

&lt;p&gt;Developers can then investigate whether the unused resources are related to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invisible rendering objects&lt;/li&gt;
&lt;li&gt;Inefficient asset packaging&lt;/li&gt;
&lt;li&gt;Unnecessary loading strategies&lt;/li&gt;
&lt;li&gt;Other resource management issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Can Mipmap Sampling Reveal Oversized Textures?
&lt;/h1&gt;

&lt;p&gt;Yes. A low Mipmap Level 0 sampling rate can indicate that a texture is larger than necessary for its actual usage.&lt;/p&gt;

&lt;p&gt;GameOptim uses a &lt;strong&gt;5%&lt;/strong&gt; Level 0 sampling rate as a reference point. If a texture's Level 0 sampling rate is below 5%, developers can investigate whether its resolution is unnecessarily high.&lt;/p&gt;

&lt;p&gt;Reducing the texture resolution can lower memory pressure without necessarily affecting the rendered result when the higher-resolution Mipmap level is rarely used.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Mesh Resource Analysis Identify Overly Detailed Geometry?
&lt;/h1&gt;

&lt;p&gt;The mesh resource analysis page provides rendering utilization as well as &lt;strong&gt;minimum rendering density&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Meshes with 0% rendering utilization can be investigated in a similar way to unused textures.&lt;/p&gt;

&lt;p&gt;Minimum rendering density provides another way to determine whether a mesh contains excessive geometric detail.&lt;/p&gt;

&lt;p&gt;Rendering density represents the number of mesh vertices within an average area of &lt;strong&gt;10,000 pixels&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If the value is above &lt;strong&gt;1,000&lt;/strong&gt;, the mesh may contain excessive geometric detail for the relatively small screen area it occupies.&lt;/p&gt;

&lt;p&gt;If the minimum rendering density remains above 1,000, developers can consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reducing the mesh polygon count&lt;/li&gt;
&lt;li&gt;Applying LOD&lt;/li&gt;
&lt;li&gt;Reviewing whether the asset needs to be rendered at its current level of detail&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How Can an Overdraw Snapshot Help Locate GPU Pressure?
&lt;/h1&gt;

&lt;p&gt;Overdraw represents the number of times the screen is filled during a frame.&lt;/p&gt;

&lt;p&gt;Transparent objects can cause the same pixel to be rendered multiple times, making them an important source of high Overdraw and potentially increasing GPU workload and device temperature.&lt;/p&gt;

&lt;p&gt;In the Overdraw Snapshot module, GameOptim calculates overall Overdraw using &lt;strong&gt;Fragment Shaded&lt;/strong&gt; and a fixed resolution of &lt;strong&gt;1920 × 1080&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During a GPU Mode test, developers can manually dump a specific scene to capture its detailed Overdraw information.&lt;/p&gt;

&lt;p&gt;The Overdraw Snapshot module then displays Overdraw information for each camera in the captured frame.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Overlay-UI (UWA)&lt;/strong&gt; camera represents the Overdraw generated by the Overlay portion of UGUI, including UI elements that are not attached to any camera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6sxhf5dk7lg55nw4nrdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6sxhf5dk7lg55nw4nrdd.png" alt=" " width="799" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The module also provides an Overdraw heatmap below the chart.&lt;/p&gt;

&lt;p&gt;Brighter areas indicate pixels that were filled more times during the current frame, meaning higher Overdraw and potentially greater GPU pressure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmaapewynwovft5tsfm5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmaapewynwovft5tsfm5k.png" alt=" " width="799" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By comparing the scene screenshot with the Overdraw heatmap, developers can more easily identify which visual elements are responsible for high Overdraw.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Determine Whether GPU Pressure Is Causing Device Heating?
&lt;/h1&gt;

&lt;p&gt;High GPU workload can contribute to increased device temperature.&lt;/p&gt;

&lt;p&gt;GameOptim records GPU, CPU, and battery temperatures, allowing developers to determine whether GPU workload is a major contributor to device heating.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0peo4ct5i6xmde6cgnuk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0peo4ct5i6xmde6cgnuk.png" alt=" " width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If GPU pressure is confirmed as a major factor, developers can further investigate related metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FPS&lt;/li&gt;
&lt;li&gt;GPU Clocks&lt;/li&gt;
&lt;li&gt;GPU Bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Power consumption is also closely related to GPU temperature and can provide another useful signal when investigating energy consumption and thermal issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9gapqwao6n8h4bufnq0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9gapqwao6n8h4bufnq0q.png" alt=" " width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, GPU temperature should not be analyzed in isolation.&lt;/p&gt;

&lt;p&gt;Because the CPU and GPU are physically close on mobile devices, high CPU workload and the resulting heat can also contribute to higher GPU temperature.&lt;/p&gt;

&lt;p&gt;Therefore, when investigating GPU-related thermal problems, developers should also consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU performance pressure&lt;/li&gt;
&lt;li&gt;GPU bandwidth&lt;/li&gt;
&lt;li&gt;CPU main-thread workload&lt;/li&gt;
&lt;li&gt;CPU worker-thread workload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A broader view can help distinguish between GPU-driven and CPU-driven thermal issues.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Should Unity Developers Take Away?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Use GPU Clocks to identify scenes with high GPU pressure, then drill down into more specific rendering metrics.&lt;/li&gt;
&lt;li&gt;Use Shader Instructions and Shader Cycles together to understand shader complexity and actual GPU processing workload.&lt;/li&gt;
&lt;li&gt;Break down Culled Primitives to identify where GPU-side culling is occurring.&lt;/li&gt;
&lt;li&gt;Analyze GPU bandwidth from the relevant GPU-unit metrics and consider cache behavior.&lt;/li&gt;
&lt;li&gt;Check texture and mesh utilization to identify resources that are loaded but rarely or never rendered.&lt;/li&gt;
&lt;li&gt;Use Mipmap sampling rates and mesh rendering density to identify resources with potentially excessive resolution or geometric complexity.&lt;/li&gt;
&lt;li&gt;Use Overdraw snapshots and heatmaps to locate transparent objects and other sources of excessive pixel processing.&lt;/li&gt;
&lt;li&gt;When investigating device heating, analyze GPU, CPU, bandwidth, power, and temperature together rather than treating GPU temperature as an isolated metric.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  FAQ
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Q1. What does GPU Clocks indicate?
&lt;/h3&gt;

&lt;p&gt;GPU Clocks is a primary metric for evaluating GPU performance. A high GPU Clocks value can indicate that the GPU is under significant processing pressure in a particular scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. What is the difference between Shader Instructions and Shader Cycles?
&lt;/h3&gt;

&lt;p&gt;Shader Instructions represents the shader instruction operations, while Shader Cycles represents the processing cycles required when the shader executes on the GPU. The same instructions may require different numbers of processing cycles on GPUs with different performance characteristics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3. Why should developers check Culled Primitives?
&lt;/h3&gt;

&lt;p&gt;Breaking down Culled Primitives into Facing Culling, Frustum Culling, and Coverage Culling helps developers understand why primitives are being removed and identify potential sources of unnecessary GPU workload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q4. How can developers find unused textures and meshes?
&lt;/h3&gt;

&lt;p&gt;Rendering utilization can reveal resources that remain loaded but do not participate in rendering during the test. Developers can then investigate whether the resources are unnecessary, incorrectly packaged, or simply not covered by the test scenario.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q5. What does a low Mipmap Level 0 sampling rate indicate?
&lt;/h3&gt;

&lt;p&gt;A low Level 0 sampling rate may indicate that the texture resolution is higher than required for its actual rendering usage. GameOptim uses 5% as a reference point for identifying textures that may warrant further investigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q6. How can Overdraw Snapshots help with GPU optimization?
&lt;/h3&gt;

&lt;p&gt;The Overdraw Snapshot module provides per-camera Overdraw information and a heatmap. Brighter areas indicate more pixel fills, allowing developers to compare the heatmap with the scene and locate visual elements responsible for high Overdraw.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q7. Is high GPU temperature always caused by GPU workload?
&lt;/h3&gt;

&lt;p&gt;Not necessarily. High CPU workload can also contribute to device heating, and the CPU and GPU are physically close on mobile devices. GPU temperature should therefore be analyzed together with GPU pressure, bandwidth, CPU workload, power consumption, and other relevant metrics.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>performance</category>
      <category>mobile</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Optimizing Canvas.BuildBatch Cost via Static/Dynamic UI Separation</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Thu, 17 Sep 2026 06:52:11 +0000</pubDate>
      <link>https://dev.to/gameoptim/optimizing-canvasbuildbatch-cost-via-staticdynamic-ui-separation-5a1h</link>
      <guid>https://dev.to/gameoptim/optimizing-canvasbuildbatch-cost-via-staticdynamic-ui-separation-5a1h</guid>
      <description>&lt;h2&gt;
  
  
  Problem / Scenario
&lt;/h2&gt;

&lt;p&gt;After optimizing DrawCall and Overdraw on a weapon UI panel, the rendering side looked good. But CPU profiling revealed a significant logic-side bottleneck: &lt;code&gt;Canvas.BuildBatch&lt;/code&gt; was taking too long, causing the main thread to stall waiting for the worker thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Observed
&lt;/h2&gt;

&lt;p&gt;We used &lt;strong&gt;GOT Online&lt;/strong&gt; (GameOptim's performance optimization tool) for profiling, as Unity Editor's built-in Profiler adds its own overhead which can skew results.&lt;/p&gt;

&lt;p&gt;After a 10-minute test, under &lt;strong&gt;Engine → UI&lt;/strong&gt;, we found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Rendering.EmitWorldScreenspaceCameraGeometry&lt;/code&gt;: &lt;strong&gt;0.43 ms&lt;/strong&gt; CPU cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Understanding the Signal
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;EmitWorldScreenspaceCameraGeometry&lt;/code&gt; is a low-level UGUI rendering function that executes after &lt;code&gt;Canvas.BuildBatch&lt;/code&gt; completes on the worker thread. High cost in this function on the main thread indicates that &lt;strong&gt;BuildBatch on the worker thread is the actual bottleneck&lt;/strong&gt;—the main thread is waiting.&lt;/p&gt;

&lt;p&gt;This is a useful diagnostic shortcut: if you see high &lt;code&gt;EmitWorldScreenspaceCameraGeometry&lt;/code&gt; time, BuildBatch is your culprit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root Cause Analysis
&lt;/h2&gt;

&lt;p&gt;The weapon UI panel had a grid of weapon icons (static) plus several rotating circular background elements (dynamic). All lived under the same child Canvas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem chain:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rotating circles change their transform every frame&lt;/li&gt;
&lt;li&gt;Changed elements are marked as dirty&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Canvas.BuildBatch&lt;/code&gt; must rebuild batches for the &lt;strong&gt;entire Canvas&lt;/strong&gt;, not just the dirty elements&lt;/li&gt;
&lt;li&gt;Static elements (icons, backgrounds, frames) get re-batched every frame despite never changing&lt;/li&gt;
&lt;li&gt;The more elements on the Canvas, the more expensive each rebuild&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a classic case of &lt;strong&gt;paying for work you don't need&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization: Static/Dynamic Separation
&lt;/h2&gt;

&lt;p&gt;The principle is simple: &lt;strong&gt;put elements that change at different frequencies on different Canvases.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;We split the UI into two Canvases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Canvas:&lt;/strong&gt; only the rotating circle elements

&lt;ul&gt;
&lt;li&gt;Rebuilds every frame&lt;/li&gt;
&lt;li&gt;Small element count → fast rebuild&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Canvas:&lt;/strong&gt; weapon icons, frames, backgrounds, all non-animated elements

&lt;ul&gt;
&lt;li&gt;Rarely rebuilds (only when content actually changes)&lt;/li&gt;
&lt;li&gt;Large element count → but almost never rebuilt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why It Works
&lt;/h3&gt;

&lt;p&gt;BuildBatch cost scales with the number of elements on the Canvas. By isolating frequently-changing elements to their own small Canvas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-frame BuildBatch processes far fewer elements&lt;/li&gt;
&lt;li&gt;The large static Canvas rarely triggers rebuilds&lt;/li&gt;
&lt;li&gt;Total BuildBatch work across both Canvases is dramatically less than one Canvas rebuilding everything every frame&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;After the change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Rendering.EmitWorldScreenspaceCameraGeometry&lt;/code&gt;: &lt;strong&gt;0.43 ms → 0.09 ms&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;~79% reduction in BuildBatch-related main-thread cost&lt;/li&gt;
&lt;li&gt;The main thread is essentially no longer waiting on the worker thread&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Static/dynamic separation is one of the highest-impact, lowest-effort UGUI optimizations when BuildBatch is a bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to diagnose:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile with a device-side tool (GOT Online or similar) for accurate numbers&lt;/li&gt;
&lt;li&gt;Look for high &lt;code&gt;EmitWorldScreenspaceCameraGeometry&lt;/code&gt; cost&lt;/li&gt;
&lt;li&gt;This correlates with slow &lt;code&gt;Canvas.BuildBatch&lt;/code&gt; on the worker thread&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify elements by update frequency (static, occasional, every-frame)&lt;/li&gt;
&lt;li&gt;Group same-frequency elements on the same Canvas&lt;/li&gt;
&lt;li&gt;Minimize the number of elements on frequently-updated Canvases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs to consider:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More Canvases add management complexity&lt;/li&gt;
&lt;li&gt;Elements on different Canvases can't batch with each other (potential DrawCall increase)&lt;/li&gt;
&lt;li&gt;Each Canvas has small fixed overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, when BuildBatch is a real bottleneck, the CPU savings almost always justify the trade-offs.&lt;/p&gt;

</description>
      <category>ui</category>
      <category>performance</category>
      <category>unity3d</category>
      <category>development</category>
    </item>
    <item>
      <title>UGUI Overdraw Optimization: Tight Meshes, Transparent Culling, and 9-Slicing</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 15 Sep 2026 07:11:38 +0000</pubDate>
      <link>https://dev.to/gameoptim/ugui-overdraw-optimization-tight-meshes-transparent-culling-and-9-slicing-12jb</link>
      <guid>https://dev.to/gameoptim/ugui-overdraw-optimization-tight-meshes-transparent-culling-and-9-slicing-12jb</guid>
      <description>&lt;h2&gt;
  
  
  Problem / Scenario
&lt;/h2&gt;

&lt;p&gt;Overdraw—pixels drawn multiple times by overlapping UI elements—is a major source of GPU cost in UGUI, especially on mobile devices. For a weapon UI panel with circular backgrounds, item frames, and hidden selection states, the Overdraw was visibly high when viewed in Unity's Overdraw mode. The goal: reduce Overdraw without changing any visual output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Observed
&lt;/h2&gt;

&lt;p&gt;Using Scene view's &lt;strong&gt;Overdraw&lt;/strong&gt; shading mode, we identified three problem areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Background circles&lt;/strong&gt; — very bright, indicating high Overdraw from full-quad meshes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selected-state backgrounds&lt;/strong&gt; — elements hidden via Alpha=0 still contributing to Overdraw&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weapon item frames&lt;/strong&gt; — hollow frames drawing full rectangles of mostly transparent pixels&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Analyze It
&lt;/h2&gt;

&lt;p&gt;Overdraw mode color intensity correlates with the number of times pixels are overdrawn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark/black: no Overdraw (drawn once)&lt;/li&gt;
&lt;li&gt;Bright colors: high Overdraw (drawn many times)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each bright area, we asked: is all this drawing necessary? In all three cases, the answer was no.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization Techniques
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Tight Mesh for Sprites with Transparency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Circular and irregular sprites use rectangular (quad) meshes by default. The transparent corners and edges of the quad are still rasterized, wasting GPU fill rate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use Unity's Tight mesh generation.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select sprite asset → Inspector → &lt;strong&gt;Mesh Type: Tight&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;On Image component → &lt;strong&gt;Use Sprite Mesh: enabled&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Adjust &lt;strong&gt;Extrude Edges&lt;/strong&gt; parameter to control mesh polygon count&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Unity generates a polygon mesh that tightly wraps the visible alpha contour of the sprite. Fully transparent areas are excluded from the mesh entirely, so they never reach the rasterizer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polygon count tuning:&lt;/strong&gt; The default Tight mesh can be quite dense (many vertices for smooth contours). Reducing &lt;strong&gt;Extrude Edges&lt;/strong&gt; lowers vertex count while maintaining visual quality. For our circular sprites, a value of 6 produced clean results with minimal polygons.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cull Transparent Mesh for Alpha=0 Elements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; UI elements hidden by setting &lt;code&gt;color.a = 0&lt;/code&gt; are still submitted for rendering. The mesh is built, the draw call is issued, and the fragment shader runs for every pixel—all producing nothing visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Enable &lt;strong&gt;Cull Transparent Mesh&lt;/strong&gt; on the Canvas Renderer component.&lt;/p&gt;

&lt;p&gt;When this option is enabled and the element's final alpha is 0, Unity culls the entire element from rendering. No vertices, no draw call, no Overdraw.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only works when alpha is exactly 0&lt;/li&gt;
&lt;li&gt;Fading animations (alpha from 1 to 0) still render during the transition&lt;/li&gt;
&lt;li&gt;Only the final element alpha matters, not parent canvas group alpha&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 9-Slicing for Hollow Frame Sprites
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Frame/border sprites have large transparent centers. The default mesh covers the full rectangle, including all that empty space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use 9-slicing with Fill Center disabled.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the sprite in Sprite Editor&lt;/li&gt;
&lt;li&gt;Drag the 9-slice border handles inward to match the inner edge of the frame&lt;/li&gt;
&lt;li&gt;Apply changes&lt;/li&gt;
&lt;li&gt;On Image component → &lt;strong&gt;Image Type: Sliced&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Disable &lt;strong&gt;Fill Center&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; 9-slicing divides the sprite into 9 regions. With Fill Center disabled, the center region produces no geometry at all—only the 4 corners and 4 edges generate vertices. The result is a frame shape with no center fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root Cause
&lt;/h2&gt;

&lt;p&gt;The common thread across all three techniques: &lt;strong&gt;UGUI draws more pixels than necessary&lt;/strong&gt; because it defaults to simple rectangular meshes and renders even fully transparent content. Most Overdraw in UGUI isn't from UI elements overlapping each other—it's from individual elements drawing invisible pixels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Overdraw optimization in UGUI mostly comes down to "don't draw what the player can't see." Three techniques cover the vast majority of cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tight Mesh&lt;/td&gt;
&lt;td&gt;Circular/irregular sprites&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cull Transparent Mesh&lt;/td&gt;
&lt;td&gt;Elements hidden via Alpha=0&lt;/td&gt;
&lt;td&gt;Very low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9-Slicing (no Fill Center)&lt;/td&gt;
&lt;td&gt;Frames, borders, buttons&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three preserve visual quality while reducing GPU fill rate usage. They should be standard practice in any UGUI project targeting mobile devices.&lt;/p&gt;

</description>
      <category>ui</category>
      <category>performance</category>
      <category>unity3d</category>
      <category>overdraw</category>
    </item>
    <item>
      <title>Fixing UGUI Batching Breakage from Canvas Rotation and Z-Value Offsets</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Thu, 10 Sep 2026 02:12:34 +0000</pubDate>
      <link>https://dev.to/gameoptim/fixing-ugui-batching-breakage-from-canvas-rotation-and-z-value-offsets-3plc</link>
      <guid>https://dev.to/gameoptim/fixing-ugui-batching-breakage-from-canvas-rotation-and-z-value-offsets-3plc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Problem / Scenario
&lt;/h2&gt;

&lt;p&gt;After optimizing a weapon UI panel down to under 20 Draw Calls via atlas packing and Z-value unification, two issues remained:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rotation breaks batching&lt;/strong&gt; — rotating the panel by even a tiny amount sends DrawCall back above 60&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lost visual quality&lt;/strong&gt; — unifying Z values removed the floating border effect that the art team wanted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The challenge: achieve both the original visual design (floating borders + rotation support) and the performance target.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Observed
&lt;/h2&gt;

&lt;p&gt;Rotation test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Panel static: ~18 Batches&lt;/li&gt;
&lt;li&gt;Panel rotated slightly: 60+ Batches&lt;/li&gt;
&lt;li&gt;The more rotation, the worse it gets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visual issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With all Z = 0, borders lay flat on backgrounds&lt;/li&gt;
&lt;li&gt;Art team wanted a subtle 3D floating effect where borders appear above backgrounds&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Root Cause Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why rotation breaks batching
&lt;/h3&gt;

&lt;p&gt;The Canvas hierarchy was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root Canvas (Screen Space - Overlay) — cannot be rotated&lt;/li&gt;
&lt;li&gt;Child Canvas — actual rotation applied here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since Z values in the VisibleList are computed in &lt;strong&gt;world space&lt;/strong&gt;, rotating the child Canvas gives every element a different world-space Z position. Elements that were at the same depth (and thus batchable) end up at different depths, breaking adjacency in the sorted list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Z offsets break batching
&lt;/h3&gt;

&lt;p&gt;Unity's batching requires elements to be &lt;strong&gt;adjacent in the VisibleList&lt;/strong&gt; and share the same material + atlas. The VisibleList is sorted by Depth → Material → Atlas → Hierarchy.&lt;/p&gt;

&lt;p&gt;When border elements have Z = 0.15 and backgrounds have Z = 0, they're at different depths in the sort order. They can't be adjacent, so they can't batch—even if they share the same atlas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Approach 1: World Space Canvas
&lt;/h3&gt;

&lt;p&gt;Change the root Canvas Render Mode from &lt;strong&gt;Screen Space - Overlay&lt;/strong&gt; to &lt;strong&gt;World Space&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotate the root Canvas itself instead of a child&lt;/li&gt;
&lt;li&gt;Element Z values remain 0 in local (Canvas) space&lt;/li&gt;
&lt;li&gt;Batching is preserved during rotation&lt;/li&gt;
&lt;li&gt;Requires manual camera alignment (no auto-binding like Overlay mode)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; DrawCall stays stable at ~18 during rotation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approach 2: Custom shader vertex offset
&lt;/h3&gt;

&lt;p&gt;Replace transform-based Z offsets with &lt;strong&gt;vertex shader offsets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The shader adds a &lt;code&gt;_Z&lt;/code&gt; property and offsets vertices in the &lt;code&gt;vert&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hlsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In the vertex shader:&lt;/span&gt;
&lt;span class="n"&gt;OUT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worldPosition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;OUT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worldPosition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;_Z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// offset from material property&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two materials using the same shader:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;UI_ADD&lt;/code&gt; — &lt;code&gt;_Z = 0&lt;/code&gt; (backgrounds)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UI_ADD_Z15&lt;/code&gt; — &lt;code&gt;_Z = 0.15&lt;/code&gt; (borders)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait—if they use different materials, won't that also break batching? Good question. Both materials use the &lt;strong&gt;same shader&lt;/strong&gt; but with different material property values. In UGUI, batching considers the material instance, not just the shader. However, the key insight from the original article is that this approach was used successfully as a replacement for Z-value offsets.&lt;/p&gt;

&lt;p&gt;Actually, re-reading the article more carefully: the shader approach replaces the Z-value offset effect. The elements still batch because... hmm, the article says "use a shader instead of Z-value offsets" and shows that it works. The batching still happens because the shader approach creates the visual offset without changing the actual Z position in the Canvas, so the depth sorting is unaffected.&lt;/p&gt;

&lt;p&gt;But wait—different materials would break batching too. Let me re-read...&lt;/p&gt;

&lt;p&gt;The article says: "DrawCall can only be batched when elements are adjacent in the queue and use exactly the same material and atlas." So different materials would break batching. But the article presents this as a solution. &lt;/p&gt;

&lt;p&gt;I think the key might be that the number of materials is small and controlled, and the visual effect is achieved without the Z-value-induced batching chaos. With Z offsets, every icon's layers are at different depths, creating many separate depth levels. With the shader approach, you have at most 2 material groups (offset and non-offset), which is more predictable and manageable.&lt;/p&gt;

&lt;p&gt;Let me present this accurately based on what the article says without adding my own speculation.&lt;/p&gt;

&lt;p&gt;Actually, let me re-read section 3.4 more carefully... The article says the shader replaces the Z-value offset and creates the same visual effect. It doesn't explicitly say batching improves compared to the Z-offset approach—it says it achieves the visual effect without changing Z values. The batching benefit comes from keeping elements at Z=0 so they can be sorted properly.&lt;/p&gt;

&lt;p&gt;I'll present this faithfully as the article does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Two common UGUI batching breakers and their fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canvas rotation&lt;/strong&gt; → use World Space Canvas instead of rotating a child under Overlay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Floating/offset effects&lt;/strong&gt; → use vertex shader offsets instead of transform Z offsets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both techniques preserve batching by keeping element Z values at 0 in the Canvas's local space. The trade-off is added complexity (custom shader, manual camera alignment), but for projects that need both visual polish and performance, these are standard techniques in the UGUI optimization toolkit.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>shader</category>
      <category>ui</category>
      <category>performance</category>
    </item>
    <item>
      <title>UGUI DrawCall Reduction: Atlas Packing and Batching Failure Analysis</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 08 Sep 2026 02:12:22 +0000</pubDate>
      <link>https://dev.to/gameoptim/ugui-drawcall-reduction-atlas-packing-and-batching-failure-analysis-1gaa</link>
      <guid>https://dev.to/gameoptim/ugui-drawcall-reduction-atlas-packing-and-batching-failure-analysis-1gaa</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Problem / Scenario
&lt;/h2&gt;

&lt;p&gt;A weapon UI panel in an MMO project had 86 Batches (DrawCalls after batching). While this might be acceptable on mid-to-high-end devices, it's problematic on low-end mobile devices—especially when the UI must composite with a 3D scene underneath. The question: how do we systematically reduce this number?&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Observed
&lt;/h2&gt;

&lt;p&gt;Using Unity's &lt;strong&gt;Frame Debugger&lt;/strong&gt;, we traced the DrawCall distribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Background elements: drawn individually&lt;/li&gt;
&lt;li&gt;Masking frames: several Draw Calls&lt;/li&gt;
&lt;li&gt;Weapon icon panel: 60+ Draw Calls (each icon had background + icon + outer frame, all separate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weapon icon grid was the clear bottleneck, accounting for the majority of DrawCalls.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Analyze It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with atlas packing
&lt;/h3&gt;

&lt;p&gt;Atlas packing is the standard first step. UGUI provides the Legacy Sprite Packer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable in &lt;strong&gt;Edit → Project Settings → Editor → Sprite Packer → Always Enable (Legacy)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Packing Tag&lt;/strong&gt; on Sprite assets to group them&lt;/li&gt;
&lt;li&gt;View results via &lt;strong&gt;Window → 2D → Sprite Packer&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We tagged background images as &lt;code&gt;main&lt;/code&gt; and weapon sprites as &lt;code&gt;weapon&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result after atlas packing: 86 → 60 Batches&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The circular background elements batched together. Each icon went from 3 draws to 2 (background + frame batched, icon separate). But 48 Draw Calls for the icon grid was still too high—we expected fewer.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Investigate batching failure
&lt;/h3&gt;

&lt;p&gt;Why wouldn't the icons batch more aggressively? The key insight: &lt;strong&gt;Unity can only batch adjacent, non-overlapping elements that share the same material and atlas.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The VisibleList is sorted by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Depth (ascending)&lt;/li&gt;
&lt;li&gt;Material&lt;/li&gt;
&lt;li&gt;Texture atlas&lt;/li&gt;
&lt;li&gt;Hierarchy priority&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If elements overlap, reordering them would change the visual output (wrong occlusion), so they cannot be batched.&lt;/p&gt;

&lt;p&gt;We verified this with a simple test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two buttons, no overlap → 2 Draw Calls&lt;/li&gt;
&lt;li&gt;Two buttons, overlapping → 4 Draw Calls&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Find the hidden overlap
&lt;/h3&gt;

&lt;p&gt;In Scene view with &lt;strong&gt;Shaded Wireframe&lt;/strong&gt; mode, we inspected the icon grid closely. The borders appeared very close together.&lt;/p&gt;

&lt;p&gt;Adjusting Layout spacing from 0 to 1 didn't help. Then we noticed: &lt;strong&gt;the background and border elements had different Z values.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Different Z values mean different depths in the VisibleList sorting. Even if the visual difference is intentional for a floating effect, it prevents batching because elements at different depths aren't adjacent in the draw order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root Cause
&lt;/h2&gt;

&lt;p&gt;The high DrawCall count had two causes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No atlas packing&lt;/strong&gt; — each sprite was its own texture, so no batching possible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different Z values creating effective "overlap"&lt;/strong&gt; — even adjacent icons couldn't batch because their sub-elements had inconsistent Z positions, breaking the adjacency requirement in the VisibleList&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Optimization
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pack atlases&lt;/strong&gt; — group related sprites with Packing Tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unify Z values&lt;/strong&gt; — set all Z values to 0 so elements can be properly sorted and batched&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify with wireframe&lt;/strong&gt; — always check Shaded Wireframe to confirm no unintended overlap&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;DrawCall dropped from &lt;strong&gt;86 to under 20&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Atlas packing is necessary but not sufficient. Batching failures often come from subtle issues like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Z-value differences between elements on the same visual plane&lt;/li&gt;
&lt;li&gt;Pixel-perfect adjacency that Unity interprets as overlap&lt;/li&gt;
&lt;li&gt;Hierarchy ordering that doesn't match visual ordering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always use Frame Debugger + Shaded Wireframe to diagnose batching issues systematically.&lt;/p&gt;

</description>
      <category>ugui</category>
      <category>unity3d</category>
      <category>drawcall</category>
      <category>performance</category>
    </item>
    <item>
      <title>How Can Unity Developers Identify and Reduce GPU Bottlenecks on Mobile Devices?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Thu, 03 Sep 2026 07:33:25 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-identify-and-reduce-gpu-bottlenecks-on-mobile-devices-51fd</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-identify-and-reduce-gpu-bottlenecks-on-mobile-devices-51fd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As mobile games continue to pursue higher visual quality, GPU performance optimization has become increasingly important. Differences between mobile GPU architectures and performance levels can also make GPU bottlenecks difficult to diagnose.&lt;/p&gt;

&lt;p&gt;GameOptim's GOT Online GPU Mode uses &lt;strong&gt;GPU Clocks&lt;/strong&gt; as a primary indicator of GPU pressure. When &lt;code&gt;GPU Clocks × Target FPS &amp;gt;= GPU Maximum Frequency × 80%&lt;/code&gt;, the frame is identified as &lt;strong&gt;GPU Bound&lt;/strong&gt; and highlighted in pink. This indicates that the GPU is spending a high number of clock cycles processing the current frame, making it difficult to sustain the target frame rate.&lt;/p&gt;

&lt;p&gt;Once a frame is identified as GPU Bound, developers can further examine metrics such as &lt;strong&gt;GPU Shaded, GPU Primitive, Overdraw, bandwidth, and Shader Cycles&lt;/strong&gt; to identify the underlying source of GPU pressure.&lt;/p&gt;

&lt;p&gt;This article covers seven common GPU performance issues that can be identified through these metrics.&lt;/p&gt;

&lt;p&gt;&lt;a href="//New%20users%20can%20get%202%20hours%20of%20free%20GOT%20Online%20testing%20time%20after%20completing%20registration."&gt;New users can get 2 hours of free GOT Online testing time after completing registration.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;A GPU Bound frame does not directly tell you what is causing the rendering workload. The actual bottleneck may come from excessive geometry, high Overdraw, memory bandwidth, complex shaders, or inefficient resource usage.&lt;/p&gt;

&lt;p&gt;Therefore, GPU optimization should not stop at identifying GPU Bound frames. Developers need to break the workload down into more specific metrics and determine which rendering resources or operations are contributing most to the GPU cost.&lt;/p&gt;

&lt;p&gt;The following seven issues are common areas worth investigating.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Does a GPU Bound Frame Actually Mean?
&lt;/h1&gt;

&lt;p&gt;In GOT Online GPU Mode, GPU Clocks are used as a primary indicator of GPU performance.&lt;/p&gt;

&lt;p&gt;A frame is classified as GPU Bound when:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GPU Clocks × Target FPS &amp;gt;= GPU Maximum Frequency × 80%&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These frames are highlighted with a pink background.&lt;/p&gt;

&lt;p&gt;GPU Bound indicates that the GPU requires too many clock cycles to process the current frame. In other words, the available GPU clock cycles within the target frame interval may not be sufficient to maintain the target frame rate.&lt;/p&gt;

&lt;p&gt;However, GPU Bound is only a symptom. Developers still need to determine &lt;strong&gt;why the GPU workload is high&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Metrics such as GPU Shaded, GPU Primitive, Overdraw, bandwidth, and Shader Cycles can help narrow down the underlying cause.&lt;/p&gt;

&lt;h1&gt;
  
  
  Could Excessive Mesh Density Be Increasing GPU Pressure?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 93% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mesh rendering density can help determine whether a mesh contains more geometric detail than is necessary for its on-screen size.&lt;/p&gt;

&lt;p&gt;Rendering density represents the number of mesh vertices within an average area of &lt;strong&gt;10,000 pixels (100 × 100 pixels)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If the value is above &lt;strong&gt;1,000&lt;/strong&gt;, the mesh may be unnecessarily complex for the size at which it is rendered.&lt;/p&gt;

&lt;p&gt;When the minimum rendering density of a mesh remains above 1,000, its vertex count is likely too high. Developers can consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reducing the mesh polygon count&lt;/li&gt;
&lt;li&gt;Applying LOD&lt;/li&gt;
&lt;li&gt;Reviewing the asset's rendering lifecycle and usage&lt;/li&gt;
&lt;li&gt;Using culling when the resource does not need to be rendered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The appropriate solution depends on how the asset is actually used. A mesh that is rendered frequently may benefit from geometry reduction or LOD, while a resource that is rarely visible may be a better candidate for culling.&lt;/p&gt;

&lt;h1&gt;
  
  
  Are Too Many Invisible Primitives Being Submitted to the GPU?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 92% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rendering primitives are another important source of GPU workload.&lt;/p&gt;

&lt;p&gt;A high primitive count can indicate overly complex models, but it can also result from large terrain or architectural meshes that have not been properly divided. In such cases, relatively few triangles may eventually be visible, while many primitives are still submitted to the GPU.&lt;/p&gt;

&lt;p&gt;GOT Online's Primitive metrics distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Total Primitives:&lt;/strong&gt; The total number of primitives submitted to the GPU, which is generally close to the number of rendered triangles reported by the engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visible Primitives:&lt;/strong&gt; The triangles that remain after GPU-side culling and participate in rendering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a typical 3D scene, a visible primitive ratio around or above &lt;strong&gt;50%&lt;/strong&gt; can be considered a useful reference point, since many models will have roughly half of their triangles removed due to back-face culling.&lt;/p&gt;

&lt;p&gt;If the visible primitive ratio becomes very low from certain camera angles, developers should investigate large models that are being submitted to the GPU unnecessarily.&lt;/p&gt;

&lt;p&gt;Whenever possible, unnecessary objects should be culled on the CPU side so that fewer primitives need to be submitted to the GPU.&lt;/p&gt;

&lt;h1&gt;
  
  
  Is High Overdraw Increasing the Fragment Workload?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 91% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Overdraw occurs when the same pixel is rendered multiple times, increasing GPU workload.&lt;/p&gt;

&lt;p&gt;For opaque objects with an appropriate rendering order, Overdraw should ideally remain close to 1. In practice, &lt;strong&gt;transparent objects such as particle systems and UI elements&lt;/strong&gt; are often major contributors to high Overdraw.&lt;/p&gt;

&lt;p&gt;GOT Online GPU Mode provides two different Overdraw measurements.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;Hardware Overdraw&lt;/strong&gt;, calculated from Fragment Shaded divided by the hardware resolution. This measurement includes post-processing and operations such as BlitCopy, Copy Depth, and Copy Color.&lt;/p&gt;

&lt;p&gt;The second is the traditional &lt;strong&gt;Overdraw&lt;/strong&gt; measurement, calculated by replacing the rendering shader and measuring the accumulated pixel intensity. This typically focuses on scenes or UI and does not include post-processing or BlitCopy operations.&lt;/p&gt;

&lt;p&gt;The two measurements may therefore differ. If the difference is significant, developers should investigate whether post-processing or full-screen BlitCopy operations are contributing to the additional workload.&lt;/p&gt;

&lt;p&gt;An Overdraw heatmap can further help locate the visual sources of high Overdraw.&lt;/p&gt;

&lt;p&gt;For example, if an explosion effect produces a significantly brighter region in the heatmap, the effect is likely contributing substantially to the frame's Overdraw.&lt;/p&gt;

&lt;p&gt;Possible optimizations include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Limiting the maximum number of particles in the particle system.&lt;/li&gt;
&lt;li&gt;Keeping only important particle effects on mid-range and low-end devices.&lt;/li&gt;
&lt;li&gt;Reducing the screen coverage of particle effects, since larger coverage areas are more likely to produce overlapping pixels and higher Overdraw.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Could High Memory Bandwidth Be Causing GPU Pressure?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 88% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High GPU read and write bandwidth can contribute not only to GPU workload but also to device heat generation and power consumption.&lt;/p&gt;

&lt;p&gt;Bandwidth can generally be divided into &lt;strong&gt;read bandwidth&lt;/strong&gt; and &lt;strong&gt;write bandwidth&lt;/strong&gt;. Read bandwidth often accounts for a significant portion of the workload, including texture and vertex reads.&lt;/p&gt;

&lt;p&gt;Several areas are worth investigating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Texture Compression Formats Appropriate?
&lt;/h3&gt;

&lt;p&gt;Using an appropriate texture compression format can reduce the amount of texture data that needs to be transferred and therefore help reduce bandwidth consumption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Mipmap Enabled Where Appropriate?
&lt;/h3&gt;

&lt;p&gt;For 3D scenes, enabling Mipmap for material textures can reduce bandwidth at the cost of some additional memory usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Texture Sampling Settings Too Expensive?
&lt;/h3&gt;

&lt;p&gt;Anisotropic filtering and trilinear filtering can introduce additional sampling costs on mobile devices.&lt;/p&gt;

&lt;p&gt;Texture sampling first attempts to access data from on-chip cache. When the required data is not found, a cache miss causes the GPU to access system memory, increasing read bandwidth.&lt;/p&gt;

&lt;p&gt;Additional texture samples required by trilinear or anisotropic filtering can increase the probability of cache misses and therefore increase bandwidth usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are RenderTexture Operations Increasing Bandwidth?
&lt;/h3&gt;

&lt;p&gt;Operations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bloom upsampling and downsampling&lt;/li&gt;
&lt;li&gt;Blur&lt;/li&gt;
&lt;li&gt;Depth of Field&lt;/li&gt;
&lt;li&gt;Copy Color&lt;/li&gt;
&lt;li&gt;Copy Depth&lt;/li&gt;
&lt;li&gt;Anti-aliasing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can all have a significant impact on bandwidth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Rendering Resolution Too High?
&lt;/h3&gt;

&lt;p&gt;Reducing the rendering resolution to &lt;strong&gt;0.9× or lower&lt;/strong&gt; reduces the number of pixels involved in texture sampling and can also reduce RenderTexture load/store operations.&lt;/p&gt;

&lt;p&gt;This can ultimately reduce bandwidth.&lt;/p&gt;

&lt;p&gt;Bandwidth and power consumption are also closely related. As a rough reference, &lt;strong&gt;1 GB/s of bandwidth may correspond to approximately 80–100 mW of power consumption&lt;/strong&gt;. Developers can therefore compare bandwidth trends with power consumption trends when investigating excessive battery drain.&lt;/p&gt;

&lt;h1&gt;
  
  
  Is Shader Complexity Too High?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 87% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Shader complexity is another important factor during the fragment stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shader Cycles&lt;/strong&gt; represents the number of GPU clock cycles spent executing shaders. GOT Online also provides more detailed metrics, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shader Arithmetic Cycles&lt;/li&gt;
&lt;li&gt;Shader Interpolator Cycles&lt;/li&gt;
&lt;li&gt;Shader LoadStore Cycles&lt;/li&gt;
&lt;li&gt;Shader Texture Cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics help developers determine which part of shader execution is contributing most to the workload.&lt;/p&gt;

&lt;p&gt;For example, high Arithmetic Cycles may indicate excessive mathematical computation, while high Texture Cycles may point toward texture-related shader workload.&lt;/p&gt;

&lt;p&gt;Developers should pay particular attention to shaders applied across large screen areas. A complex shader used across a large building or terrain surface can produce substantial overall cost simply because of the number of pixels affected.&lt;/p&gt;

&lt;p&gt;Transparent materials also deserve special attention because they can combine complex shaders with high Overdraw, causing the shader to be executed for a large number of pixels.&lt;/p&gt;

&lt;p&gt;Tools such as the &lt;strong&gt;Mali Offline Compiler&lt;/strong&gt; can also be used to inspect shader instruction counts and clock cycles for further shader analysis.&lt;/p&gt;

&lt;h1&gt;
  
  
  Are Some Textures or Meshes Loaded but Never Rendered?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 83% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A rendering utilization of &lt;strong&gt;0%&lt;/strong&gt; means that a texture or mesh was loaded into memory during the test but was never submitted to the GPU for rendering.&lt;/p&gt;

&lt;p&gt;There are several possible explanations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Too Many Resources Being Loaded?
&lt;/h3&gt;

&lt;p&gt;Some resources may be loaded into memory but rarely used or never used.&lt;/p&gt;

&lt;p&gt;Developers should check the actual usage of these resources and determine whether they need to remain loaded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Did the Test Cover the Relevant Content?
&lt;/h3&gt;

&lt;p&gt;A resource may have a low utilization simply because the test did not reach the gameplay content where the resource is used.&lt;/p&gt;

&lt;p&gt;This can happen with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large scenes&lt;/li&gt;
&lt;li&gt;Special story events&lt;/li&gt;
&lt;li&gt;Preloaded effects&lt;/li&gt;
&lt;li&gt;Rare gameplay paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, a more comprehensive test process is needed. Ideally, teams should automate scene and gameplay traversal and run longer tests to cover as much content as possible.&lt;/p&gt;

&lt;h1&gt;
  
  
  Are Mipmap Levels Being Used Efficiently?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Observed in 82% of the analyzed cases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One useful metric is the sampling rate of &lt;strong&gt;Mipmap Level 0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If Level 0 is sampled less than &lt;strong&gt;20%&lt;/strong&gt; of the time, the texture may be larger than necessary for its actual usage.&lt;/p&gt;

&lt;p&gt;For example, a 1024 × 1024 texture may technically have a high resolution, but if Level 0 is never sampled and &lt;strong&gt;96.15% of pixels are sampled from the 128 × 128 Mipmap level&lt;/strong&gt;, the original texture resolution may be unnecessarily high.&lt;/p&gt;

&lt;p&gt;By examining the resource's rendering lifecycle, developers can determine where the texture is used and which Mipmap levels are actually sampled.&lt;/p&gt;

&lt;p&gt;If 96.15% of sampling occurs at Mipmap 3 or higher, reducing the texture from &lt;strong&gt;1024 × 1024 to 128 × 128&lt;/strong&gt; may be a reasonable optimization to consider. This can reduce memory usage and improve loading efficiency without significantly affecting the rendered result in the observed usage scenario.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Should Developers Prioritize GPU Optimization?
&lt;/h1&gt;

&lt;p&gt;GPU optimization rarely has a single root cause. A GPU Bound frame may be the result of geometry complexity, invisible primitives, Overdraw, bandwidth, shader complexity, or inefficient resource usage.&lt;/p&gt;

&lt;p&gt;A more effective workflow is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify GPU Bound frames.&lt;/li&gt;
&lt;li&gt;Examine GPU workload trends.&lt;/li&gt;
&lt;li&gt;Determine whether geometry, Overdraw, bandwidth, shaders, or resources are contributing to the workload.&lt;/li&gt;
&lt;li&gt;Locate the specific assets or rendering operations responsible.&lt;/li&gt;
&lt;li&gt;Evaluate the impact of each potential optimization.&lt;/li&gt;
&lt;li&gt;Prioritize changes based on their actual contribution to GPU pressure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach allows developers to move from &lt;strong&gt;"the GPU is too busy"&lt;/strong&gt; to a much more actionable question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Which rendering workload is consuming the GPU budget, and what can we change?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GOT Online GPU Mode provides these metrics in one analysis workflow, helping developers investigate GPU bottlenecks from multiple perspectives.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Should Unity Developers Take Away?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A GPU Bound frame identifies GPU pressure, but not its root cause.&lt;/li&gt;
&lt;li&gt;High mesh density and excessive invisible primitives can indicate inefficient geometry submission.&lt;/li&gt;
&lt;li&gt;Overdraw should be investigated carefully, especially for transparent effects, particles, and UI.&lt;/li&gt;
&lt;li&gt;Texture settings, RenderTexture operations, and rendering resolution can have a significant impact on bandwidth.&lt;/li&gt;
&lt;li&gt;Shader Cycles can help identify which part of shader execution is responsible for high shader cost.&lt;/li&gt;
&lt;li&gt;Resources with low or zero rendering utilization should be checked for unnecessary loading or incomplete test coverage.&lt;/li&gt;
&lt;li&gt;Mipmap sampling statistics can reveal textures whose resolution is higher than their actual rendering requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  FAQ
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Q1. What does GPU Bound mean in GOT Online?
&lt;/h3&gt;

&lt;p&gt;A frame is classified as GPU Bound when &lt;code&gt;GPU Clocks × Target FPS &amp;gt;= GPU Maximum Frequency × 80%&lt;/code&gt;. It indicates that the GPU is consuming a high number of clock cycles and may not have enough available cycles to sustain the target frame rate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. Does a GPU Bound frame tell you what is causing the bottleneck?
&lt;/h3&gt;

&lt;p&gt;No. GPU Bound identifies GPU pressure but does not directly identify the root cause. Developers should further analyze metrics such as GPU Shaded, GPU Primitive, Overdraw, bandwidth, and Shader Cycles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3. How can high Overdraw be reduced in a mobile game?
&lt;/h3&gt;

&lt;p&gt;Common approaches include limiting particle counts, reducing the screen coverage of transparent effects, and disabling less important effects on lower-end devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q4. Why should developers check visible versus total primitives?
&lt;/h3&gt;

&lt;p&gt;The comparison can reveal whether many primitives are being submitted to the GPU but subsequently removed through GPU-side culling. A low visible primitive ratio from specific camera angles may indicate that large models should be better split or culled earlier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q5. How can developers identify oversized textures?
&lt;/h3&gt;

&lt;p&gt;Mipmap sampling statistics can help. If Mipmap Level 0 has a very low sampling rate, the texture resolution may be higher than necessary for its actual usage. Developers can inspect the resource's lifecycle and sampling levels before deciding whether to reduce its resolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q6. Can reducing rendering resolution help with GPU bandwidth?
&lt;/h3&gt;

&lt;p&gt;Yes. Lowering rendering resolution reduces the number of pixels involved in texture sampling and can reduce RenderTexture load/store operations, which can help lower bandwidth.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>performance</category>
      <category>mobile</category>
    </item>
    <item>
      <title>A Breakdown of UGUI Performance Bottlenecks: Rendering vs. Logic</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 01 Sep 2026 03:47:15 +0000</pubDate>
      <link>https://dev.to/gameoptim/a-breakdown-of-ugui-performance-bottlenecks-rendering-vs-logic-3g7e</link>
      <guid>https://dev.to/gameoptim/a-breakdown-of-ugui-performance-bottlenecks-rendering-vs-logic-3g7e</guid>
      <description>&lt;p&gt;When optimizing UGUI, the first question to answer is: &lt;em&gt;where is the cost actually coming from?&lt;/em&gt; Without this understanding, optimization efforts are likely to be scattered and ineffective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem / Scenario
&lt;/h2&gt;

&lt;p&gt;Mobile game teams often encounter frame-rate drops and device heating as UI complexity grows. The UI system seems simple on the surface—just images and text—but the underlying cost structure is more nuanced than many developers realize.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Dimensions of UI Performance
&lt;/h2&gt;

&lt;p&gt;UGUI performance cost breaks down into two categories: &lt;strong&gt;rendering&lt;/strong&gt; and &lt;strong&gt;logic&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rendering
&lt;/h3&gt;

&lt;h4&gt;
  
  
  DrawCall
&lt;/h4&gt;

&lt;p&gt;DrawCall is primarily a CPU cost. Each draw command issued to the GPU requires state setup and parameter passing. High DrawCall counts directly increase CPU usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark targets from real projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex MMO-style HUD: under 30 Draw Calls&lt;/li&gt;
&lt;li&gt;Combat UI: single-digit Draw Calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These targets apply when the UI is composited on top of a 3D scene. Full-screen UIs without scene rendering can have a slightly relaxed budget.&lt;/p&gt;

&lt;h4&gt;
  
  
  Overdraw
&lt;/h4&gt;

&lt;p&gt;Overdraw measures how many times screen pixels are redrawn by UI elements. Every image or button placed on screen contributes. Translucent UIs (common in high-tech visual styles) are especially prone to Overdraw waste since the 3D scene behind must remain visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic
&lt;/h3&gt;

&lt;p&gt;Three functions account for nearly all UI logic cost:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. EventSystem.Update
&lt;/h4&gt;

&lt;p&gt;Two components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event detection:&lt;/strong&gt; Every frame, Unity traverses all interactive UI elements to check for intersection with touch points. Complexity scales with the number of interactive elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event callback logic:&lt;/strong&gt; Code inside &lt;code&gt;onClick&lt;/code&gt; and similar callbacks runs within this function (though this is application logic, not UI system overhead).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Canvas.SendWillRenderCanvases
&lt;/h4&gt;

&lt;p&gt;This function recalculates vertex data for dirty UI elements. Vertex attributes (positions, UVs, etc.) are stored in C# arrays. When text content changes—or any property affecting vertex positions changes—the arrays must be rebuilt. The data is then transferred to Mesh objects for rendering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; This is pure main-thread C# work. The more elements change per frame, the higher the cost.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Canvas.BuildBatch / BatchJob
&lt;/h4&gt;

&lt;p&gt;After vertex data is ready, each UI element still has its own mesh. Drawing them one by one would result in an unacceptably high DrawCall count. &lt;code&gt;BuildBatch&lt;/code&gt; merges compatible elements into larger meshes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batching considers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same atlas (texture)&lt;/li&gt;
&lt;li&gt;Same material&lt;/li&gt;
&lt;li&gt;Depth order in the VisibleList (sorted by Depth → Material → Atlas → Hierarchy priority)&lt;/li&gt;
&lt;li&gt;Whether elements overlap&lt;/li&gt;
&lt;li&gt;Rendering order adjustments for non-overlapping elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The batching calculation itself has non-trivial CPU cost. However, a significant portion of BatchJobs can run on worker threads, which helps on multi-core devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;In practice, &lt;code&gt;EventSystem.Update&lt;/code&gt; is rarely the primary bottleneck. The usual suspects are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DrawCall&lt;/strong&gt; and &lt;strong&gt;Overdraw&lt;/strong&gt; on the rendering side&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SendWillRenderCanvases&lt;/strong&gt; and &lt;strong&gt;BuildBatch&lt;/strong&gt; on the logic side&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Knowing which one to target is half the battle. The remaining sections in this series dive into optimization techniques for each area, using a real MMO weapon UI panel as a case study.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>ugui</category>
      <category>performance</category>
    </item>
    <item>
      <title>How Can Unity Developers Identify the Functions Behind Game Stutters?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Thu, 27 Aug 2026 03:35:37 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-identify-the-functions-behind-game-stutters-5bg0</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-identify-the-functions-behind-game-stutters-5bg0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;Game stutters are one of the most important performance issues for game developers because they can interrupt gameplay and directly affect the player experience.&lt;/p&gt;

&lt;p&gt;GameOptim GOT Online introduces a new &lt;strong&gt;Stutter Frame Summary&lt;/strong&gt; feature that performs deeper attribution across all stutter points in a performance report. It helps developers identify the functions that contribute most frequently to stutters and have the greatest optimization potential.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Finding the cause of a stutter is not always straightforward. A performance report may contain many stutter frames, and developers need to understand not only how much CPU time each function consumes, but also how frequently it contributes to problematic frames.&lt;/p&gt;

&lt;p&gt;The latest stutter analysis workflow in GOT Online combines stutter frame distribution, CPU time data, function call stacks, and function-level statistics to make this analysis more systematic.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Get an Overview of All Stutter Frames?
&lt;/h1&gt;

&lt;p&gt;The latest stutter analysis page provides information for all stutter frames in the report.&lt;/p&gt;

&lt;p&gt;By combining the &lt;strong&gt;total CPU time curve&lt;/strong&gt; in the Stutter Frame Summary with the stutter frame markers, developers can quickly understand the CPU time and distribution of stutter points across the game.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The CPU time curve takes the maximum CPU time from every 10 frames, while stutter frame markers represent the actual CPU time of each individual frame. As a result, the points and lines in the chart may not always align exactly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This overview provides a starting point for identifying where stutters occur and how CPU time is distributed across those frames.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Analyze Animation and Physics Stutters?
&lt;/h1&gt;

&lt;p&gt;The latest update also adds statistics for &lt;strong&gt;animation stutters&lt;/strong&gt; and &lt;strong&gt;physics stutters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Developers can analyze these two types of stutters in the &lt;strong&gt;Key Function Analysis&lt;/strong&gt; page. The stutter frame data can also be filtered by type, making it easier to locate and investigate specific categories of stutters.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can a Call Stack Flame Chart Reveal Stutter Hotspots?
&lt;/h1&gt;

&lt;p&gt;The stutter function call stack flame chart provides a visual representation of function execution across stutter frames.&lt;/p&gt;

&lt;p&gt;Developers can use it to examine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The proportion of time spent by functions across all stutter frames&lt;/li&gt;
&lt;li&gt;Function nodes at different call-stack depths&lt;/li&gt;
&lt;li&gt;Calling relationships between functions&lt;/li&gt;
&lt;li&gt;Hot functions that make a larger contribution to stutter frames&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These observations can then be combined with the stutter function list below the chart for more detailed investigation.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can You Trace the Same Function Across Different Stutter Frames?
&lt;/h1&gt;

&lt;p&gt;Clicking a function node highlights all function nodes with the same name in the flame chart.&lt;/p&gt;

&lt;p&gt;This makes it easier to understand how the same function contributes across the aggregated stutter frames, including its overall proportion and its impact when called by different parent functions.&lt;/p&gt;

&lt;p&gt;This is particularly useful when the same function appears in multiple call paths.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can You Inspect a Function's Call Relationships?
&lt;/h1&gt;

&lt;p&gt;Double-clicking a function node zooms into its details in the flame chart.&lt;/p&gt;

&lt;p&gt;The chart then displays the function's calling and called-by relationships in greater detail. At the same time, the corresponding function stack is automatically expanded in the function stack list.&lt;/p&gt;

&lt;p&gt;This allows developers to determine which nodes may have higher optimization value based on their position and contribution within the call stack.&lt;/p&gt;

&lt;h1&gt;
  
  
  Which Function Metrics Should Developers Prioritize?
&lt;/h1&gt;

&lt;p&gt;The stutter function list provides common metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total time&lt;/li&gt;
&lt;li&gt;Total time percentage&lt;/li&gt;
&lt;li&gt;Self time&lt;/li&gt;
&lt;li&gt;Self time percentage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, two additional metrics are particularly important when prioritizing stutter optimization:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed Stutter Points&lt;/strong&gt; indicates the number of stutter frames in which a function was called.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Stutter Points&lt;/strong&gt; indicates the number of stutter frames where the function's total call time exceeded &lt;strong&gt;41.67 ms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A function with a high number of key stutter points has a significant impact across multiple stutter frames. This can make it a higher-priority optimization target than a function that consumes considerable CPU time but only affects a small number of stutter frames.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Simulate the Impact of Optimizing a Function?
&lt;/h1&gt;

&lt;p&gt;GOT Online also allows developers to deselect a function node and recalculate the Stutter Frame Summary.&lt;/p&gt;

&lt;p&gt;This effectively simulates the stutter frame situation after removing the selected function's CPU time.&lt;/p&gt;

&lt;p&gt;If subtracting the function's execution time reduces a stutter frame's CPU time to below &lt;strong&gt;83.33 ms&lt;/strong&gt;, that frame is marked as a &lt;strong&gt;green improved stutter frame&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This provides a direct way to estimate how much a specific function contributes to individual stutter frames without requiring developers to immediately modify and retest the code.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can This Simulation Help Prioritize Optimization?
&lt;/h1&gt;

&lt;p&gt;Function-node deselection allows developers to visually evaluate the impact of individual functions on stutter frames and simulate the potential result of optimization.&lt;/p&gt;

&lt;p&gt;This helps answer an important practical question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which function is worth optimizing first?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of prioritizing functions based only on total CPU time, developers can evaluate how many problematic frames a function affects and how much those frames could improve if its execution cost were reduced.&lt;/p&gt;

&lt;p&gt;This provides a more targeted basis for optimization prioritization.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Investigate Important Functions Further?
&lt;/h1&gt;

&lt;p&gt;For functions that require additional investigation, developers can open &lt;strong&gt;Function Details&lt;/strong&gt; from the operation column.&lt;/p&gt;

&lt;p&gt;The details view provides information about the function's CPU time and call count. Developers can also add the function to a function group for further analysis.&lt;/p&gt;

&lt;p&gt;This makes it possible to move from identifying a stutter hotspot to examining the specific function behavior in greater detail.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Should Unity Developers Take Away?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Analyze all stutter frames rather than focusing on a single frame.&lt;/li&gt;
&lt;li&gt;Use stutter frame distribution together with CPU time to identify recurring problems.&lt;/li&gt;
&lt;li&gt;Pay attention to &lt;strong&gt;Key Stutter Points&lt;/strong&gt;, not just total CPU time.&lt;/li&gt;
&lt;li&gt;Use the call stack flame chart to understand where functions contribute across different call paths.&lt;/li&gt;
&lt;li&gt;Use function-node deselection to simulate potential improvements and prioritize optimization targets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  FAQ
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Q1. What is the Stutter Frame Summary in GOT Online?
&lt;/h3&gt;

&lt;p&gt;The Stutter Frame Summary aggregates information across stutter frames in a performance report, helping developers understand stutter distribution and CPU time and identify functions that contribute significantly to stutters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. What does the Key Stutter Points metric indicate?
&lt;/h3&gt;

&lt;p&gt;It indicates the number of stutter frames in which a function's total call time exceeds &lt;strong&gt;41.67 ms&lt;/strong&gt;. A high value means the function has a significant impact across multiple stutter frames.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3. What is the difference between Distributed Stutter Points and Key Stutter Points?
&lt;/h3&gt;

&lt;p&gt;Distributed Stutter Points represents the number of stutter frames in which a function was called. Key Stutter Points represents the number of stutter frames where that function's total call time exceeded 41.67 ms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q4. What happens when a function node is deselected?
&lt;/h3&gt;

&lt;p&gt;GOT Online recalculates the Stutter Frame Summary after subtracting the selected function's execution time. If a stutter frame falls below 83.33 ms after the subtraction, it is marked as a green improved stutter frame.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q5. Can developers analyze animation and physics stutters separately?
&lt;/h3&gt;

&lt;p&gt;Yes. The latest update provides separate animation stutter and physics stutter statistics, which can be analyzed and filtered in the Key Function Analysis page.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>performance</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How Can You Monitor Specific Functions More Precisely in Complex Game Projects?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 25 Aug 2026 03:04:52 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-you-monitor-specific-functions-more-precisely-in-complex-game-projects-2ab4</link>
      <guid>https://dev.to/gameoptim/how-can-you-monitor-specific-functions-more-precisely-in-complex-game-projects-2ab4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;GameOptim's existing function module classification provides a straightforward and efficient way to locate or monitor performance issues. However, this approach may not provide enough granularity for some large or complex projects.&lt;/p&gt;

&lt;p&gt;For example, when a new gameplay feature is introduced during development, developers may need to monitor a specific set of functions related to that feature. This creates a need for more detailed function classification.&lt;/p&gt;

&lt;p&gt;The latest version of GameOptim introduces &lt;strong&gt;Custom Function Groups&lt;/strong&gt;, allowing developers to classify functions in a more precise and personalized way.&lt;/p&gt;

&lt;p&gt;💡 &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;New users can get 2 hours of free GOT Online testing time after completing registration.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GameOptim's existing function module classification provides a simple way to locate and monitor performance issues.&lt;/li&gt;
&lt;li&gt;Large or complex projects may require more granular function classification for targeted monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Function Groups&lt;/strong&gt; allow developers to create more precise and personalized function categories.&lt;/li&gt;
&lt;li&gt;A custom function group can contain up to &lt;strong&gt;15 functions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Once configured, function groups are automatically applied to all reports within the same project.&lt;/li&gt;
&lt;li&gt;Developers can view total time, self time, function count, and the function group's share of total CPU time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Do Complex Projects Need More Granular Function Monitoring?
&lt;/h2&gt;

&lt;p&gt;Predefined function module classifications provide a quick way to locate and monitor performance issues.&lt;/p&gt;

&lt;p&gt;However, they may not be sufficiently granular for some large or complex projects.&lt;/p&gt;

&lt;p&gt;For example, when a new gameplay feature is added during development, developers may want to monitor only the functions related to that feature. In this situation, a more detailed classification of functions can make targeted monitoring possible.&lt;/p&gt;

&lt;p&gt;This is the purpose of &lt;strong&gt;Custom Function Groups&lt;/strong&gt;: to allow developers to define function groups based on their specific monitoring needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Create a Custom Function Group?
&lt;/h2&gt;

&lt;p&gt;Project administrators can &lt;strong&gt;create, edit, or delete&lt;/strong&gt; function groups based on their requirements.&lt;/p&gt;

&lt;p&gt;After a function group is configured, it is automatically applied to &lt;strong&gt;all reports within the same project&lt;/strong&gt;. Developers therefore do not need to configure the same function group repeatedly for individual reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do You Select Functions for a Custom Function Group?
&lt;/h2&gt;

&lt;p&gt;On the Custom Function Group editing page, GameOptim can list up to &lt;strong&gt;4,000 functions with the highest total time&lt;/strong&gt; in the current report.&lt;/p&gt;

&lt;p&gt;The list provides two metrics for reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Average Total Time&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average Self Time&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A custom function group can contain up to &lt;strong&gt;15 functions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Developers can select functions directly from the list or use the search function to locate a specific target function.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Performance Data Can You See After Saving a Function Group?
&lt;/h2&gt;

&lt;p&gt;After saving a function group, developers can view the following information in the function group list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Average Total Time&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average Self Time&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function Count&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function Group / Total CPU Time Percentage&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The performance chart also shows the &lt;strong&gt;total time of each function group&lt;/strong&gt;, allowing developers to view the total execution time of different groups.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Inspect the Functions Within a Group?
&lt;/h2&gt;

&lt;p&gt;Developers can click the &lt;strong&gt;Details&lt;/strong&gt; button in the function group list to view information about the individual functions within a group.&lt;/p&gt;

&lt;p&gt;The display rules for these individual functions are consistent with those used for the function group itself, allowing developers to examine the relevant performance data at the function level.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is the Practical Workflow?
&lt;/h2&gt;

&lt;p&gt;A typical workflow for using Custom Function Groups is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the functions that require targeted monitoring.&lt;/li&gt;
&lt;li&gt;Open the Custom Function Group editing page.&lt;/li&gt;
&lt;li&gt;Review the functions listed from the current report.&lt;/li&gt;
&lt;li&gt;Select up to 15 functions or locate specific functions through search.&lt;/li&gt;
&lt;li&gt;Save the function group.&lt;/li&gt;
&lt;li&gt;Monitor the group's performance data across reports within the project.&lt;/li&gt;
&lt;li&gt;Open the group details when individual function information is needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Existing function module classification provides a straightforward way to locate and monitor performance issues.&lt;/li&gt;
&lt;li&gt;More granular function classification can be useful when complex projects require targeted monitoring of specific gameplay features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Function Groups&lt;/strong&gt; allow developers to create personalized function classifications.&lt;/li&gt;
&lt;li&gt;Each function group can contain up to &lt;strong&gt;15 functions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Up to &lt;strong&gt;4,000 functions ranked by total time&lt;/strong&gt; can be listed on the editing page for the current report.&lt;/li&gt;
&lt;li&gt;Once configured, a function group is automatically applied to all reports within the same project.&lt;/li&gt;
&lt;li&gt;Developers can analyze both group-level and individual-function performance data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When is a Custom Function Group useful?
&lt;/h3&gt;

&lt;p&gt;It can be useful when developers need to monitor a specific set of functions, such as functions associated with a newly added gameplay feature, rather than relying only on broader function module classifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many functions can one Custom Function Group contain?
&lt;/h3&gt;

&lt;p&gt;A custom function group can contain up to &lt;strong&gt;15 functions&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to configure the function group for every report?
&lt;/h3&gt;

&lt;p&gt;No. Once configured, the function group is automatically applied to all reports within the same project.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many functions can be displayed when editing a group?
&lt;/h3&gt;

&lt;p&gt;The editing page can list up to &lt;strong&gt;4,000 functions ranked by total time&lt;/strong&gt; in the current report.&lt;/p&gt;

&lt;h3&gt;
  
  
  What information is available for a function group?
&lt;/h3&gt;

&lt;p&gt;The function group list displays &lt;strong&gt;Average Total Time, Average Self Time, Function Count, and Function Group / Total CPU Time Percentage&lt;/strong&gt;. The performance chart also shows the total time of each function group.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>performance</category>
      <category>gamedev</category>
      <category>development</category>
    </item>
    <item>
      <title>Why Do Developers Need Cross-Module Performance Dashboards Instead of Separate Reports?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Thu, 20 Aug 2026 09:55:33 +0000</pubDate>
      <link>https://dev.to/gameoptim/why-do-developers-need-cross-module-performance-dashboards-instead-of-separate-reports-4a1g</link>
      <guid>https://dev.to/gameoptim/why-do-developers-need-cross-module-performance-dashboards-instead-of-separate-reports-4a1g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;GameOptim has introduced Custom Dashboard, allowing developers to build reusable dashboards that combine performance metrics from multiple report modules into a single view.&lt;/p&gt;

&lt;p&gt;Instead of navigating through separate GPU, runtime, thermal, and power reports, developers can correlate key indicators more efficiently and identify optimization priorities faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Are Separate Reports Sometimes Not Enough?
&lt;/h2&gt;

&lt;p&gt;Performance optimization isn't about isolated metrics.&lt;br&gt;
When FPS suddenly decreases, the underlying cause may begin with GPU workload, continue through thermal accumulation, trigger CPU frequency reduction, and finally appear as frame instability.&lt;br&gt;
Looking at these reports independently often hides the relationship between them.&lt;br&gt;
Developers need context—not just data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does Custom Dashboard Work?
&lt;/h2&gt;

&lt;p&gt;Project administrators can create reusable dashboards by selecting up to 15 performance metrics from six categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime Information&lt;/li&gt;
&lt;li&gt;GPU&lt;/li&gt;
&lt;li&gt;Overall Performance Trend&lt;/li&gt;
&lt;li&gt;Key Function Analysis&lt;/li&gt;
&lt;li&gt;Power Consumption&lt;/li&gt;
&lt;li&gt;Temperature Change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once created, dashboards automatically appear across all reports within the same project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built-in Templates for Common Optimization Scenarios
&lt;/h2&gt;

&lt;p&gt;To simplify everyday investigations, GameOptim provides several preset templates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thermal Throttling Analysis&lt;/li&gt;
&lt;li&gt;GPU Pressure &amp;amp; Power Consumption&lt;/li&gt;
&lt;li&gt;Snapdragon Vertex Pressure Analysis&lt;/li&gt;
&lt;li&gt;UGUI CPU Cost Analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These templates are fully customizable and can be adapted to different projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Diagnosing Thermal Throttling
&lt;/h2&gt;

&lt;p&gt;Suppose a game gradually loses FPS during gameplay.&lt;br&gt;
Using the Thermal Throttling Analysis dashboard, developers can immediately compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FPS&lt;/li&gt;
&lt;li&gt;GPU Frequency&lt;/li&gt;
&lt;li&gt;CPU Frequency&lt;/li&gt;
&lt;li&gt;Temperature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The relationship becomes obvious:&lt;br&gt;
Higher GPU workload increases chip temperature, thermal accumulation triggers CPU frequency reduction, and frame rate eventually drops.&lt;br&gt;
Instead of checking four independent reports, developers identify the bottleneck in one dashboard before moving into detailed GPU analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional GPU Analysis Improvements
&lt;/h2&gt;

&lt;p&gt;GameOptim has also updated the GPU Analysis module.&lt;br&gt;
Metrics are now organized into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primary Metrics&lt;/li&gt;
&lt;li&gt;Secondary Metrics&lt;/li&gt;
&lt;li&gt;Reference Metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Child parameters now include overview summaries, allowing developers to quickly identify abnormal values without expanding every metric.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Limitations
&lt;/h2&gt;

&lt;p&gt;At the moment, Custom Dashboard is available for GOT Online reports.&lt;br&gt;
Support for Unreal Engine reports and Mini Game reports is planned for future updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How many metrics can one dashboard contain?&lt;/strong&gt;&lt;br&gt;
Up to 15 metrics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can multiple projects share the same dashboard?&lt;/strong&gt;&lt;br&gt;
Dashboards are automatically reused across reports within the same project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are preset templates editable?&lt;/strong&gt;&lt;br&gt;
Yes. Every template can be customized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this feature replace existing report modules?&lt;/strong&gt;&lt;br&gt;
No. It complements them by providing a higher-level cross-module view for faster diagnosis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;If you'd like to experience the feature yourself, register for GOT Online on GameOptim and receive 2 hours of free trial access.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>developers</category>
      <category>performance</category>
      <category>gpu</category>
    </item>
    <item>
      <title>How Can Unity Developers Trace Frame-Level CPU Bottlenecks More Precisely?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 18 Aug 2026 06:47:53 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-trace-frame-level-cpu-bottlenecks-more-precisely-301o</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-trace-frame-level-cpu-bottlenecks-more-precisely-301o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🌐 Website: &lt;a href="https://www.gameoptim.com/?fopt=dev" rel="noopener noreferrer"&gt;www.gameoptim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When a Unity game shows a CPU performance anomaly, module-level statistics may not be enough to identify the actual cause. A function can be called repeatedly across consecutive frames, originate from another module, or appear as part of untracked profiling overhead.&lt;/p&gt;

&lt;p&gt;The latest &lt;strong&gt;GameOptim GOT Online&lt;/strong&gt; update addresses these cases with frame-level performance analysis, an &lt;strong&gt;Overhead&lt;/strong&gt; breakdown, and cross-module function call tracking. The update also adds Unity Profiler-based rendering metrics, rendering resolution data, and asynchronous loading priority statistics to provide more context during performance analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frame-level analysis&lt;/strong&gt; improves function curve precision to individual frames, making short CPU spikes and abnormal frame ranges easier to locate.&lt;/li&gt;
&lt;li&gt;The new &lt;strong&gt;Overhead&lt;/strong&gt; module separates untracked function time and SDK collection overhead from identified module costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-module call paths&lt;/strong&gt; help developers trace functions back to the root functions that actually triggered them.&lt;/li&gt;
&lt;li&gt;Unity Profiler-based &lt;strong&gt;DrawCall, Batches, and Triangle&lt;/strong&gt; statistics provide rendering information when OpenGL data cannot be obtained through the SDK.&lt;/li&gt;
&lt;li&gt;Additional rendering and loading parameters provide more context for evaluating rendering configuration and scene-loading strategies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Does Frame-Level Analysis Help Find CPU Performance Problems?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Overall Performance Trend&lt;/strong&gt; section in GOT Online now supports frame-level analysis across its tabs, with function curve precision improved to individual frames.&lt;/p&gt;

&lt;p&gt;This is particularly useful when a function is called continuously across multiple frames.&lt;/p&gt;

&lt;p&gt;For example, when analyzing the &lt;strong&gt;UI module&lt;/strong&gt;, developers can inspect the performance behavior of a function on each individual frame instead of relying only on a broader trend. The corresponding function stack is also available in the stack information area below the performance curve.&lt;/p&gt;

&lt;p&gt;This makes it easier to answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which specific frame contains the CPU spike?&lt;/li&gt;
&lt;li&gt;Is a function consistently expensive across consecutive frames?&lt;/li&gt;
&lt;li&gt;Does the abnormal cost occur only within a particular frame range?&lt;/li&gt;
&lt;li&gt;Which functions are responsible for the observed cost?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The module timing statistics can also help developers identify relationships between different function modules and narrow down abnormal frames or time ranges more precisely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Is the New Overhead Module Useful?
&lt;/h2&gt;

&lt;p&gt;Module-level CPU statistics do not necessarily account for every piece of execution time.&lt;/p&gt;

&lt;p&gt;The new &lt;strong&gt;Overhead&lt;/strong&gt; module in GOT Online collects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Untracked function execution time&lt;/li&gt;
&lt;li&gt;Performance overhead generated by GameOptim's data collection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This distinction is useful when evaluating the actual contribution of different CPU costs to frame performance.&lt;/p&gt;

&lt;p&gt;Instead of treating every measured cost as an optimization target, developers can use the Overhead breakdown to distinguish between &lt;strong&gt;key performance factors and secondary costs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This can help avoid spending optimization effort on costs that have little practical impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Can You See Inside Overhead?
&lt;/h3&gt;

&lt;p&gt;After expanding the Overhead module, developers can inspect more detailed timing information for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Untracked functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDK data collection overhead&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This information can also help evaluate whether specific data collection modules should remain enabled during a test.&lt;/p&gt;

&lt;p&gt;For example, developers can use the collected overhead information to assess the impact of modules such as &lt;strong&gt;Resources&lt;/strong&gt; and &lt;strong&gt;Lua memory&lt;/strong&gt; collection and adjust the profiling configuration when appropriate.&lt;/p&gt;

&lt;p&gt;The goal is not simply to minimize profiling overhead, but to make the collection process better aligned with the performance question being investigated.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can Cross-Module Call Paths Reveal the Actual Root Function?
&lt;/h2&gt;

&lt;p&gt;A function's performance cost does not always originate from the module where the function is displayed.&lt;/p&gt;

&lt;p&gt;Previously, when analyzing the &lt;strong&gt;Animation&lt;/strong&gt; performance page, developers could primarily observe calls under animation-related root functions. If an animation function was called by a root function belonging to another module, developers needed to switch to the corresponding module and inspect its parent function stack.&lt;/p&gt;

&lt;p&gt;The updated &lt;strong&gt;Overall Performance Trend&lt;/strong&gt; analysis makes this relationship easier to inspect.&lt;/p&gt;

&lt;p&gt;In the Animation performance page, developers can enable &lt;strong&gt;"Animation function calls from other modules"&lt;/strong&gt; from the upper-right corner. This allows animation functions called by functions from other modules to be displayed directly within the Animation analysis.&lt;/p&gt;

&lt;p&gt;Developers can also click the &lt;strong&gt;call path&lt;/strong&gt; next to a function name in the function stack to trace the animation function back to the root function that invoked it.&lt;/p&gt;

&lt;p&gt;This provides a more complete view of the function call chain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root function → Cross-module call → Target function&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of optimizing the function where the cost becomes visible, developers can investigate the function that actually initiated the call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which New Rendering Metrics Are Available?
&lt;/h2&gt;

&lt;p&gt;The update adds several additional performance parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  DrawCall, Batches, and Triangles
&lt;/h3&gt;

&lt;p&gt;The Rendering module now provides &lt;strong&gt;DrawCall, Batches, and Triangle&lt;/strong&gt; statistics based on the Unity Profiler.&lt;/p&gt;

&lt;p&gt;This is particularly useful when the SDK cannot obtain OpenGL-related data. Developers can still inspect these rendering metrics during performance testing rather than losing visibility into basic rendering statistics.&lt;/p&gt;

&lt;p&gt;These values provide additional context when investigating rendering-related performance behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rendering Resolution and Interval
&lt;/h3&gt;

&lt;p&gt;The Rendering module also adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rendering resolution width&lt;/li&gt;
&lt;li&gt;Rendering resolution height&lt;/li&gt;
&lt;li&gt;Rendering interval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These parameters make it easier to monitor the rendering configuration used during a test and correlate rendering settings with observed performance behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can Loading Priority Help Analyze Scene Loading?
&lt;/h2&gt;

&lt;p&gt;The Loading module now includes the configured asynchronous loading priority from Unity's &lt;code&gt;Application.backgroundLoadingPriority&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allows developers to inspect the loading priority configuration when evaluating scene loading time.&lt;/p&gt;

&lt;p&gt;Rather than looking only at the final loading duration, developers can also check whether the current loading strategy leaves room for optimization through loading configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Should You Check First When Investigating a CPU Performance Issue?
&lt;/h2&gt;

&lt;p&gt;A practical investigation flow based on these capabilities is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Locate the abnormal frame or time range.&lt;/strong&gt;&lt;br&gt;
Use frame-level analysis to identify where the CPU performance anomaly occurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inspect the function stack.&lt;/strong&gt;&lt;br&gt;
Determine which functions contribute to the observed cost instead of looking only at module-level totals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check cross-module calls.&lt;/strong&gt;&lt;br&gt;
If the function appears expensive within one module, verify whether it was actually triggered by a root function from another module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review Overhead.&lt;/strong&gt;&lt;br&gt;
Separate identified application costs from untracked functions and SDK collection overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check rendering or loading parameters when relevant.&lt;/strong&gt;&lt;br&gt;
Use DrawCall, Batches, Triangles, rendering resolution, rendering interval, or asynchronous loading priority to provide additional context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prioritize the optimization target.&lt;/strong&gt;&lt;br&gt;
Focus on the costs that materially contribute to the performance problem rather than treating every measured value as an optimization requirement.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Practical Recommendations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;What to inspect&lt;/th&gt;
&lt;th&gt;How it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Short CPU spike&lt;/td&gt;
&lt;td&gt;Frame-level function analysis&lt;/td&gt;
&lt;td&gt;Identifies the specific abnormal frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous function cost&lt;/td&gt;
&lt;td&gt;Per-frame function curve and stack&lt;/td&gt;
&lt;td&gt;Shows how the cost changes across frames&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unclear CPU attribution&lt;/td&gt;
&lt;td&gt;Overhead module&lt;/td&gt;
&lt;td&gt;Separates untracked time and SDK collection overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function appears expensive in the wrong module&lt;/td&gt;
&lt;td&gt;Cross-module calls and call paths&lt;/td&gt;
&lt;td&gt;Helps trace the function back to its root caller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendering performance is unclear&lt;/td&gt;
&lt;td&gt;DrawCall, Batches, Triangles&lt;/td&gt;
&lt;td&gt;Provides additional rendering statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendering configuration may affect results&lt;/td&gt;
&lt;td&gt;Resolution and rendering interval&lt;/td&gt;
&lt;td&gt;Adds configuration context to performance data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scene loading takes too long&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Application.backgroundLoadingPriority&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Helps evaluate the configured asynchronous loading strategy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frame-level analysis is useful for short-lived CPU anomalies&lt;/strong&gt; because it allows developers to inspect function behavior at individual-frame granularity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhead should be separated from application-level costs&lt;/strong&gt; so profiling overhead and untracked functions do not automatically become optimization targets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-module call paths matter when the visible bottleneck is not the root cause.&lt;/strong&gt; Tracing the caller can reveal where the expensive function was actually triggered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendering and loading parameters provide important context&lt;/strong&gt; when analyzing DrawCalls, Batches, Triangles, rendering configuration, or scene loading.&lt;/li&gt;
&lt;li&gt;Effective performance analysis depends not only on finding expensive functions, but also on understanding &lt;strong&gt;when they execute, what calls them, and what portion of the measured cost is actually relevant to the application&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does frame-level analysis replace the function stack?
&lt;/h3&gt;

&lt;p&gt;No. Frame-level analysis shows when a function's performance cost occurs, while the function stack provides information about the functions involved in that execution. Using both together provides a more precise way to investigate abnormal frames.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the Overhead module include?
&lt;/h3&gt;

&lt;p&gt;The Overhead module includes &lt;strong&gt;untracked function execution time&lt;/strong&gt; and &lt;strong&gt;SDK data collection overhead&lt;/strong&gt; generated during GameOptim testing. These values help developers distinguish measured overhead from identified application module costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why should I check cross-module function calls?
&lt;/h3&gt;

&lt;p&gt;A function displayed under one module may have been called by a root function belonging to another module. Cross-module call paths allow developers to trace the function back to its actual caller instead of investigating only the module where the cost becomes visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can GOT Online show DrawCalls when OpenGL data is unavailable?
&lt;/h3&gt;

&lt;p&gt;The updated Rendering module provides &lt;strong&gt;DrawCall, Batches, and Triangle&lt;/strong&gt; statistics based on the Unity Profiler, allowing these rendering metrics to remain available when the SDK cannot obtain OpenGL data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is &lt;code&gt;Application.backgroundLoadingPriority&lt;/code&gt; useful for performance analysis?
&lt;/h3&gt;

&lt;p&gt;The Loading module now records the configured asynchronous loading priority. This gives developers additional information when evaluating scene loading time and determining whether the loading strategy may provide an opportunity for optimization.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>developer</category>
      <category>performance</category>
      <category>cpu</category>
    </item>
  </channel>
</rss>
