<?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 Identify GC Stutters, Lua Leaks, and Mono Memory Issues with GOT Online?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Fri, 16 Oct 2026 06:26:13 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-identify-gc-stutters-lua-leaks-and-mono-memory-issues-with-got-online-2m7e</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-identify-gc-stutters-lua-leaks-and-mono-memory-issues-with-got-online-2m7e</guid>
      <description>&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;Investigating game performance issues often requires developers to connect CPU execution costs, garbage collection (GC) activity, Lua function calls, and Mono heap memory usage. GameOptim's GOT Online provides analysis capabilities across Overview, Lua, and Mono modes to help development teams identify performance bottlenecks and investigate memory-related problems.&lt;/p&gt;

&lt;p&gt;This article introduces several improvements to these modes, including GC call-frequency monitoring, CPU call-stack visualization, reverse Lua call-stack analysis, Lua leak investigation caused by Mono references, and more detailed Mono heap allocation and object-reference analysis. These features help developers move from observing performance symptoms to examining the functions, objects, and memory changes behind them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Detect Frequent GC Calls in Unity?
&lt;/h2&gt;

&lt;p&gt;Garbage collection (GC) activity is one of the important indicators to examine when investigating game stuttering. To help developers monitor GC call frequency, GOT Online has added GC statistics to the loading module in Overview mode.&lt;/p&gt;

&lt;p&gt;GC call frequency is influenced by heap memory allocation. When functions allocate more heap memory, or allocate it more frequently, GC can be triggered sooner.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;GC.Collect&lt;/code&gt; is called frequently, as illustrated in the image above, developers should investigate the allocation behavior of the functions involved. This is particularly important when GC calls become increasingly frequent as the game runs longer.&lt;/p&gt;

&lt;p&gt;In such cases, developers can use GameOptim GOT Online's Mono mode to investigate whether Mono memory is being allocated too quickly or in excessive quantities. This helps connect observed GC activity with potential heap allocation issues that warrant further analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Identify CPU Performance Hotspots More Quickly?
&lt;/h2&gt;

&lt;p&gt;GOT Online has improved the CPU call-stack analysis page to make it easier to understand execution-time trends and identify functions that contribute to CPU workload.&lt;/p&gt;

&lt;p&gt;The CPU execution-time chart displays the overall execution-time trend alongside the trends for top functions. By comparing these curves, developers can quickly identify which functions may be contributing to execution-time peaks.&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%2Fkn0bzloh9gt7xrdo75ms.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%2Fkn0bzloh9gt7xrdo75ms.png" alt="CPU execution-time trends and top functions in GOT Online" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This visualization makes it easier to examine changes in CPU execution time and investigate which functions are associated with unusually high values.&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%2F663jabch52m7t2a6r5ci.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%2F663jabch52m7t2a6r5ci.png" alt="Detailed CPU function execution-time analysis in GOT Online" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The updated page also supports scene-specific analysis. Developers can navigate to a particular scene and examine the execution-time distribution of individual functions within that scene.&lt;/p&gt;

&lt;p&gt;This makes it easier to narrow the investigation to the relevant scene instead of relying only on aggregated CPU performance data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can Reverse Call-Stack Analysis Help Identify Lua Performance Issues?
&lt;/h2&gt;

&lt;p&gt;Reverse analysis is one of the useful features in GOT Online's Lua mode because it helps developers trace memory allocation back through function relationships without repeatedly expanding deep call stacks.&lt;/p&gt;

&lt;p&gt;In reverse-analysis mode, expanding a node displays a list of direct parent functions that call the function represented by that node and generate heap allocations. By following these relationships, developers can trace the allocation back toward the functions responsible for it.&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%2F26msaw2uogpphev3vb9e.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%2F26msaw2uogpphev3vb9e.png" alt="Reverse call-stack analysis in GOT Online Lua mode" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach reduces the need to navigate deeply nested call stacks one level at a time and helps developers narrow down the underlying allocation source more directly.&lt;/p&gt;

&lt;p&gt;The latest version also adds self-time percentage to the stack information for a selected frame. This metric helps developers identify functions that account for a larger proportion of the execution time within the analyzed stack.&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%2Fxkk9czo7byu8c5bslbzd.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%2Fxkk9czo7byu8c5bslbzd.png" alt="Self-time percentage in Lua frame stack information" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By examining self-time percentage alongside the existing stack information, developers can more easily identify functions that deserve closer investigation when analyzing performance costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Investigate Lua Memory Leaks Caused by Mono References?
&lt;/h2&gt;

&lt;p&gt;Lua memory leaks caused by Mono references are another important area of investigation in GOT Online's Lua mode.&lt;/p&gt;

&lt;p&gt;In the latest version, GOT Online improves how Mono objects are presented during leak analysis. Developers can inspect detailed information about Mono objects on a single page, including the number of destroyed objects and how that number changes over time.&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%2Fu5rplig5gkj54dw2r54y.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%2Fu5rplig5gkj54dw2r54y.png" alt="Mono object details for Lua leak analysis in GOT Online" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The comparison mode also allows developers to compare different sampling points and examine whether the observed memory changes are reasonable.&lt;/p&gt;

&lt;p&gt;By reviewing object details, destruction counts, and changes between samples, developers can investigate potential Lua leaks associated with Mono references and determine which changes require further analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Understand Where Mono Heap Memory Is Being Used?
&lt;/h2&gt;

&lt;p&gt;High Mono memory usage can be difficult to investigate because memory problems can arise in different ways. Developers need to understand not only how much memory is occupied, but also where that memory is being used.&lt;/p&gt;

&lt;p&gt;GOT Online's latest Mono mode improves the presentation of heap memory leak analysis, making it easier to investigate why Mono memory usage is high and how the memory is distributed.&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%2Fol98dkyxdy0gusb7tn3x.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%2Fol98dkyxdy0gusb7tn3x.png" alt="Mono heap memory usage and leak analysis in GOT Online" width="799" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The visualization provides an overview of Mono memory usage, helping developers examine the memory distribution and identify areas that warrant closer investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Trace Mono Heap Memory Back to Specific Functions and Variables?
&lt;/h2&gt;

&lt;p&gt;GOT Online provides additional details at both the function and memory-sample levels to help developers investigate Mono memory usage.&lt;/p&gt;

&lt;p&gt;The function view displays the actual heap memory usage associated with each function during game execution. This helps developers examine which functions are associated with memory consumption.&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%2F9zpxas1mdlwe4z6am7az.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%2F9zpxas1mdlwe4z6am7az.png" alt="Function-level Mono heap memory usage in GOT Online" width="799" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Developers can also select any bar in the chart below to inspect details about actual heap memory usage and the variables residing in memory at that sample.&lt;/p&gt;

&lt;p&gt;Within the Mono object reference view, developers can select any two memory samples from the bar chart and compare their memory changes. This comparison helps them identify specific functions associated with memory growth and investigate the corresponding memory increments and variables.&lt;/p&gt;

&lt;p&gt;By tracing changes across sampling points, developers can narrow down potential sources of memory leaks and gather more specific information for further debugging and remediation.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Monitor GC call frequency: Use GC statistics in Overview mode to investigate frequent &lt;code&gt;GC.Collect&lt;/code&gt; calls and potential excessive heap allocation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use CPU execution-time trends: Compare overall CPU costs with top-function trends and inspect specific scenes to narrow down performance hotspots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trace Lua allocations through reverse analysis: Follow parent-function relationships to investigate allocation sources, and use self-time percentage to identify functions with higher execution costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compare Mono object samples: Examine object details, destruction counts, and changes between sampling points when investigating Lua leaks caused by Mono references.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trace Mono memory to functions and variables: Use function-level heap memory data and comparisons between memory samples to investigate memory growth and potential leak sources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Q1. How can developers investigate frequent GC calls in Unity?
&lt;/h3&gt;

&lt;p&gt;Developers can use the GC statistics in GOT Online's Overview mode to examine GC call frequency. If calls become increasingly frequent during gameplay, they can use Mono mode to investigate whether heap memory allocation is occurring too quickly or in excessive quantities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. How does GOT Online help identify CPU performance hotspots?
&lt;/h3&gt;

&lt;p&gt;Overview mode displays overall CPU execution-time trends alongside trends for top functions. Developers can examine execution-time peaks, investigate the functions associated with those peaks, and use scene-specific analysis to inspect function execution-time distributions within individual scenes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3. What is reverse analysis in GOT Online's Lua mode?
&lt;/h3&gt;

&lt;p&gt;Reverse analysis displays direct parent functions that call a selected function and generate heap allocations. Developers can follow these function relationships to trace allocations toward their sources without repeatedly navigating deeply nested call stacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q4. How can developers investigate Lua leaks caused by Mono references?
&lt;/h3&gt;

&lt;p&gt;Developers can inspect Mono object details, including destruction counts and their trends, in GOT Online's Lua leak analysis. They can also compare sampling points to investigate memory changes and determine whether the observed increments warrant further investigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q5. How can GOT Online help investigate Mono memory leaks?
&lt;/h3&gt;

&lt;p&gt;Mono mode provides function-level heap memory usage, detailed information about memory usage at selected samples, and the variables residing in memory. Comparing two sampling points in the Mono object reference view helps developers investigate memory increments and identify functions and variables associated with potential leaks.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>performance</category>
      <category>memory</category>
    </item>
    <item>
      <title>How Can Unity Developers Identify and Analyze Stuttering Frames with GOT Online?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 13 Oct 2026 09:19:34 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-identify-and-analyze-stuttering-frames-with-got-online-5eon</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-identify-and-analyze-stuttering-frames-with-got-online-5eon</guid>
      <description>&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;Identifying the root cause of frame stuttering in Unity games can be time-consuming, especially when developers need to inspect performance data and function call stacks manually. GOT Online's Overview mode now includes a Stutter Analysis feature that automatically identifies stuttering frames and provides detailed function stack statistics for each identified point.&lt;/p&gt;

&lt;p&gt;This article explains how stuttering frames are identified in GOT Online, what function stack data is available, and how Unity developers can use this information to investigate performance issues more efficiently.&lt;/p&gt;

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

&lt;p&gt;Frame stuttering can negatively affect the gameplay experience, but identifying its root cause requires more than simply observing a drop in frame rate. Developers need to determine which frames experienced significant delays and investigate the function calls responsible for the additional execution time.&lt;/p&gt;

&lt;p&gt;To make this process more efficient, GameOptim has introduced Stutter Analysis in GOT Online's Overview mode, incorporating feedback from development teams. The feature identifies stuttering frames during gameplay and provides detailed function stack statistics to help developers investigate the underlying causes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Qualifies as a Stuttering Frame in GOT Online?
&lt;/h2&gt;

&lt;p&gt;GOT Online's Stutter Analysis feature identifies frames that meet both of the following conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The current frame time exceeds 83.33 ms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The current frame time exceeds twice the average frame time of the previous three frames.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A frame must satisfy both conditions to be classified as a stuttering frame.&lt;/p&gt;

&lt;p&gt;By applying these criteria, GOT Online lists the identified stuttering frames in a dedicated Stutter Analysis section on the Overview report page. Developers can use this list to quickly locate frames that experienced significant delays during execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uploader.shimo.im/f/wYylBgfFa0ARVQzn.png" rel="noopener noreferrer"&gt;Image: Stutter Analysis section in the GOT Online Overview report&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Function Stack Data Is Available for Each Stuttering Point?
&lt;/h2&gt;

&lt;p&gt;Identifying a stuttering frame is only the first step. Developers also need to investigate which function calls contributed to the delay.&lt;/p&gt;

&lt;p&gt;GOT Online provides detailed function stack statistics for the relevant nodes associated with each stuttering point. The available information includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Execution time percentage: The proportion of time attributed to a function or node.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execution time: The specific time consumed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call count: The number of times the function was called.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics help developers examine the execution costs associated with abnormal nodes and investigate the function stacks behind a stuttering frame.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uploader.shimo.im/f/ZwrdQMQIX3y9kgyQ.png" rel="noopener noreferrer"&gt;Image: Function stack statistics for a stuttering point in GOT Online&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can Developers Use Stutter Analysis to Investigate Performance Issues?
&lt;/h2&gt;

&lt;p&gt;GOT Online allows developers to switch quickly between different stuttering points and inspect the corresponding function stacks.&lt;/p&gt;

&lt;p&gt;This workflow helps development teams move from identifying a frame-time anomaly to examining the detailed execution data associated with that specific point.&lt;/p&gt;

&lt;p&gt;Rather than investigating every frame manually, developers can focus on the identified stuttering frames, compare the relevant function stack information, and use execution time, time percentage, and call count to investigate potential causes.&lt;/p&gt;

&lt;p&gt;The function stack data provides a more detailed basis for determining which parts of execution warrant further investigation, helping developers locate the specific causes of stuttering more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does Stutter Analysis Fit into the GOT Online Overview Workflow?
&lt;/h2&gt;

&lt;p&gt;Stutter Analysis is integrated directly into the Overview report in GOT Online. Developers can review the list of stuttering frames and inspect the corresponding function stack statistics within the same reporting workflow.&lt;/p&gt;

&lt;p&gt;This integration connects two important stages of performance investigation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Identify abnormal frames: Locate frames that meet the stuttering criteria.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect execution details: Examine function stack statistics at each stuttering point to investigate the cause.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By bringing these capabilities together, GOT Online helps streamline the process of moving from frame-time anomalies to detailed performance analysis.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Check both stuttering criteria: A frame must exceed 83.33 ms and twice the average frame time of the previous three frames.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start with the identified frames: Use the Stutter Analysis section in the GOT Online Overview report to locate stuttering points.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect function stack statistics: Examine execution time percentage, execution time, and call count for relevant nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compare different stuttering points: Switch between identified frames to investigate their corresponding function stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use detailed execution data to guide investigation: Move beyond identifying frame-time anomalies and investigate the specific causes through function stack analysis.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Q1. What is considered a stuttering frame in GOT Online?
&lt;/h3&gt;

&lt;p&gt;A frame is classified as a stuttering frame when its frame time exceeds 83.33 ms and is more than twice the average frame time of the previous three frames. Both conditions must be met.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. Where can I find stuttering frames in GOT Online?
&lt;/h3&gt;

&lt;p&gt;Stuttering frames are listed in the Stutter Analysis section of the Overview report in the latest version that includes this feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3. What information does GOT Online provide for each stuttering point?
&lt;/h3&gt;

&lt;p&gt;GOT Online provides detailed function stack statistics, including execution time percentage, specific execution time, and call count, helping developers investigate the execution costs associated with abnormal nodes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q4. How can developers investigate the causes of stuttering?
&lt;/h3&gt;

&lt;p&gt;Developers can switch between different stuttering points and inspect their corresponding function stacks. By examining execution time, time percentage, and call count, they can investigate which function calls may be contributing to the observed delays.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q5. Is Stutter Analysis available in GOT Online's Overview mode?
&lt;/h3&gt;

&lt;p&gt;Yes. GameOptim has introduced Stutter Analysis in GOT Online's Overview mode, adding a dedicated section for identified stuttering frames and their associated function stack statistics.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>performance</category>
      <category>stutter</category>
    </item>
    <item>
      <title>How Can Unity Developers Track Managed Heap Allocations on Worker Threads?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Fri, 09 Oct 2026 03:21:28 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-developers-track-managed-heap-allocations-on-worker-threads-2d4e</link>
      <guid>https://dev.to/gameoptim/how-can-unity-developers-track-managed-heap-allocations-on-worker-threads-2d4e</guid>
      <description>&lt;p&gt;Moving work that does not require Unity APIs to worker threads can reduce main-thread pressure and help improve frame rates. However, identifying managed heap allocations on these threads can be challenging because Unity Profiler may not show their &lt;code&gt;GC.Alloc&lt;/code&gt; activity.&lt;/p&gt;

&lt;p&gt;GOT Online's Mono mode now supports &lt;strong&gt;multithreaded allocation statistics&lt;/strong&gt;, allowing developers to inspect managed heap allocations made by non-main threads, investigate potential memory leaks, and compare heap growth between snapshots.&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;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;To reduce main-thread workload and improve frame rates, Unity developers often move operations that do not depend on Unity APIs to worker threads.&lt;/p&gt;

&lt;p&gt;However, when analyzing managed heap usage, it can be difficult to identify exactly where allocations occur on these threads. This makes memory profiling and leak investigation more challenging.&lt;/p&gt;

&lt;p&gt;To address this issue, GOT Online supports multithreaded statistics in &lt;strong&gt;Mono mode&lt;/strong&gt;. Combined with GOT Online's flexible workflow for testing changes and checking results, this feature helps developers investigate memory allocation issues more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should Unity Developers Track Heap Allocations on Worker Threads?
&lt;/h2&gt;

&lt;p&gt;Consider a component that starts two worker threads in &lt;code&gt;Start()&lt;/code&gt;. Both threads periodically allocate managed heap memory.&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%2Fdgtut3ow59ua31mzdrle.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%2Fdgtut3ow59ua31mzdrle.png" alt=" " width="800" height="1092"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this scenario, Unity Profiler may not display the &lt;code&gt;GC.Alloc&lt;/code&gt; activity associated with these worker-thread allocations.&lt;/p&gt;

&lt;p&gt;However, these allocations still matter. Like allocations on the main thread, they can contribute to garbage collection overhead when allocations occur frequently. If objects remain referenced longer than intended, they can also contribute to sustained heap growth or memory leaks.&lt;/p&gt;

&lt;p&gt;Being able to identify where these allocations originate is therefore important when investigating managed memory usage in multithreaded Unity projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can GOT Online Identify Managed Allocations on Worker Threads?
&lt;/h2&gt;

&lt;p&gt;Run a test using &lt;strong&gt;Mono mode&lt;/strong&gt; in GOT Online, then open the &lt;strong&gt;Detailed Heap Allocations&lt;/strong&gt; page in the performance report.&lt;/p&gt;

&lt;p&gt;Functions associated with allocations on non-main threads appear with the &lt;code&gt;Thread&lt;/code&gt; prefix. This indicates that the function was called on a non-main thread and performed managed heap allocations.&lt;/p&gt;

&lt;p&gt;Select a function to inspect its allocation details.&lt;/p&gt;

&lt;p&gt;This allows developers to investigate allocation activity that may otherwise be difficult to identify when focusing only on the main thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can Developers Investigate Heap Growth and Potential Memory Leaks?
&lt;/h2&gt;

&lt;p&gt;Allocations on worker threads can also be relevant when investigating managed heap growth.&lt;/p&gt;

&lt;p&gt;If objects remain referenced and cannot be reclaimed by the garbage collector, the corresponding memory growth can be examined in the &lt;strong&gt;Heap Memory Leak Analysis&lt;/strong&gt; panel.&lt;/p&gt;

&lt;p&gt;Developers can locate the relevant function and compare two selected nodes to inspect changes in heap usage between them.&lt;/p&gt;

&lt;p&gt;This comparison helps developers investigate whether heap usage is increasing over time and narrow down the functions associated with that growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can Developers Inspect the Objects Behind Heap Allocations?
&lt;/h2&gt;

&lt;p&gt;After identifying a function of interest, click the blue button on the right to view the associated managed heap object types.&lt;/p&gt;

&lt;p&gt;The report displays the allocation size and object count for each type, helping developers understand which objects account for the observed memory usage.&lt;/p&gt;

&lt;p&gt;This additional detail can help developers determine whether a function is allocating too frequently or contributing significantly to heap growth.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Moving work to worker threads can reduce main-thread pressure, but managed heap allocations on those threads still need to be monitored.&lt;/li&gt;
&lt;li&gt;Unity Profiler may not expose all worker-thread allocation activity through the expected &lt;code&gt;GC.Alloc&lt;/code&gt; view.&lt;/li&gt;
&lt;li&gt;GOT Online Mono mode identifies non-main-thread allocation functions with the &lt;code&gt;Thread&lt;/code&gt; prefix.&lt;/li&gt;
&lt;li&gt;The Detailed Heap Allocations page provides function-level allocation details.&lt;/li&gt;
&lt;li&gt;Heap Memory Leak Analysis helps developers investigate memory growth and compare selected nodes.&lt;/li&gt;
&lt;li&gt;Object type, allocation size, and object count provide additional clues for diagnosing memory issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By including worker-thread allocations in managed memory analysis, Unity teams can investigate heap usage more comprehensively instead of focusing exclusively on the main thread.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Can worker threads allocate managed heap memory in Unity?
&lt;/h3&gt;

&lt;p&gt;Yes. Worker-thread code can allocate managed objects, depending on the operations it performs. These allocations can contribute to garbage collection overhead and sustained heap growth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why might Unity Profiler not show worker-thread allocations in the expected &lt;code&gt;GC.Alloc&lt;/code&gt; view?
&lt;/h3&gt;

&lt;p&gt;The allocation activity described here may not be visible in the usual Unity Profiler view. GOT Online Mono mode provides additional statistics for investigating managed heap allocations made by non-main threads.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does GOT Online identify worker-thread allocation functions?
&lt;/h3&gt;

&lt;p&gt;In the Detailed Heap Allocations page, functions associated with allocations on non-main threads are marked with the &lt;code&gt;Thread&lt;/code&gt; prefix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can GOT Online help investigate memory leaks involving worker threads?
&lt;/h3&gt;

&lt;p&gt;Yes. Developers can use Heap Memory Leak Analysis to examine heap growth associated with relevant functions and compare two selected nodes. Object types, allocation sizes, and object counts provide further information for investigation.&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 tools for investigating CPU, GPU, and memory performance, helping development teams identify bottlenecks and analyze issues using detailed test reports.&lt;/p&gt;

&lt;p&gt;Its Mono mode supports managed heap allocation analysis, including multithreaded allocation statistics, to help developers investigate memory behavior beyond the main thread.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>memory</category>
      <category>performance</category>
    </item>
    <item>
      <title>How Can Unity Teams Analyze Performance Across Multiple Test Devices at Once?</title>
      <dc:creator>GameOptim</dc:creator>
      <pubDate>Tue, 29 Sep 2026 07:56:47 +0000</pubDate>
      <link>https://dev.to/gameoptim/how-can-unity-teams-analyze-performance-across-multiple-test-devices-at-once-1opd</link>
      <guid>https://dev.to/gameoptim/how-can-unity-teams-analyze-performance-across-multiple-test-devices-at-once-1opd</guid>
      <description>&lt;h1&gt;
  
  
  How Can Unity Teams Analyze Performance Across Multiple Test Devices at Once?
&lt;/h1&gt;

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

&lt;p&gt;As game teams increasingly run automated performance tests across multiple physical devices at the same time, the amount of test data can quickly grow from a few reports to dozens or even hundreds.&lt;/p&gt;

&lt;p&gt;Reviewing these reports one by one is time-consuming and makes it difficult to quickly determine which devices, test cases, or performance metrics require attention.&lt;/p&gt;

&lt;p&gt;GOT Online now provides &lt;strong&gt;Batch Test Analysis&lt;/strong&gt;, which automatically analyzes multiple test reports and generates an Excel file containing an overall test summary, optimization tasks, affected device models, test failures, and performance data.&lt;/p&gt;

&lt;p&gt;This allows development teams to move from reviewing individual reports to identifying common performance problems across an entire batch of automated tests.&lt;/p&gt;

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

&lt;p&gt;A typical automated performance testing workflow may look like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build the game → Install it on multiple physical devices → Run automated tests → Collect performance data → Upload the data to GameOptim → Analyze the results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running tests in parallel across many devices can significantly reduce testing time and increase scenario coverage.&lt;/p&gt;

&lt;p&gt;However, this approach creates a new problem: &lt;strong&gt;how do you efficiently analyze dozens or hundreds of test results?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are usually two questions that development teams need to answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which devices and test cases have performance problems?&lt;/li&gt;
&lt;li&gt;Did any functional problems occur during testing, such as crashes or blocked gameplay?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To address these problems, GOT Online introduces &lt;strong&gt;Batch Test Analysis&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Analyze Multiple GOT Online Reports at Once?
&lt;/h1&gt;

&lt;p&gt;In an Overview mode report, developers can select &lt;strong&gt;Batch Test Analysis&lt;/strong&gt;, choose the test data to analyze, and click &lt;strong&gt;Start Analysis&lt;/strong&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%2F2fqx2eu89wexchrwsid5.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%2F2fqx2eu89wexchrwsid5.png" alt=" " width="799" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system then automatically generates an Excel workbook containing five sheets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test Overview&lt;/li&gt;
&lt;li&gt;Optimization Queue Details&lt;/li&gt;
&lt;li&gt;Devices with Significant Performance Issues&lt;/li&gt;
&lt;li&gt;Test Failure Details&lt;/li&gt;
&lt;li&gt;Performance Reports&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each sheet provides a different perspective on the batch test results.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Can the Test Overview Tell You?
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Test Overview&lt;/strong&gt; sheet provides a high-level summary of the overall test results.&lt;/p&gt;

&lt;p&gt;For example, in the following test, the compatibility pass rate is &lt;strong&gt;40%&lt;/strong&gt;. Among the 10 analyzed tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 passed the performance criteria&lt;/li&gt;
&lt;li&gt;5 failed the performance criteria&lt;/li&gt;
&lt;li&gt;1 exited unexpectedly due to a crash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of opening each report individually, developers can use these summary results to quickly understand how the project performs across the tested devices.&lt;/p&gt;

&lt;p&gt;This is especially useful when a test batch contains a large number of devices.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Batch Analysis Identify Common Performance Problems?
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Optimization Queue Details&lt;/strong&gt; sheet summarizes performance problems that appear across the analyzed test data.&lt;/p&gt;

&lt;p&gt;Rather than simply reporting that a test failed, the analysis provides more detail about the performance bottlenecks, including the affected modules and devices.&lt;/p&gt;

&lt;p&gt;This gives the development team a clearer picture of which performance problems occur repeatedly across the test batch.&lt;/p&gt;

&lt;p&gt;It also makes optimization prioritization more meaningful.&lt;/p&gt;

&lt;p&gt;For example, a performance issue that appears across many devices may deserve higher priority than an issue that occurs in only one specific test case.&lt;/p&gt;

&lt;h1&gt;
  
  
  Can Batch Analysis Identify the Specific Devices Affected by a Bottleneck?
&lt;/h1&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;The analysis can drill down to the specific &lt;strong&gt;device, test case, and performance module&lt;/strong&gt; associated with a performance problem.&lt;/p&gt;

&lt;p&gt;The report also provides links to the corresponding performance reports.&lt;/p&gt;

&lt;p&gt;Developers can therefore use the batch analysis to first identify the problematic devices and test cases, then open the individual reports for deeper investigation.&lt;/p&gt;

&lt;p&gt;This creates a two-step workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batch analysis → Identify the problem → Open the detailed performance report&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How Can Developers Find Crashes During Automated Testing?
&lt;/h1&gt;

&lt;p&gt;Performance is not the only issue that can occur during automated testing.&lt;/p&gt;

&lt;p&gt;A test may also encounter functional problems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game crashes&lt;/li&gt;
&lt;li&gt;Unexpected exits&lt;/li&gt;
&lt;li&gt;Gameplay tasks that cannot be completed&lt;/li&gt;
&lt;li&gt;Other test failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a crash occurs during one of the test cases, the &lt;strong&gt;Test Failure Details&lt;/strong&gt; sheet records relevant information about that test.&lt;/p&gt;

&lt;p&gt;Developers can use information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Device&lt;/li&gt;
&lt;li&gt;Test time&lt;/li&gt;
&lt;li&gt;Runtime duration before the crash&lt;/li&gt;
&lt;li&gt;Memory usage at the time of the crash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;as clues for further investigation.&lt;/p&gt;

&lt;p&gt;This means that automated testing can provide more than performance data. It can also help teams identify functional failures encountered during the testing process.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Performance Data Can Be Compared Across Test Cases?
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Performance Reports&lt;/strong&gt; sheet provides an overview of important high-level performance metrics.&lt;/p&gt;

&lt;p&gt;These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FPS&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Power consumption&lt;/li&gt;
&lt;li&gt;Temperature&lt;/li&gt;
&lt;li&gt;Network traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The report also provides scenario-level performance information, allowing developers to identify which gameplay scenarios may contain performance bottlenecks.&lt;/p&gt;

&lt;p&gt;This makes it easier to connect a performance problem with the specific scenario in which it occurs.&lt;/p&gt;

&lt;h1&gt;
  
  
  When Is Batch Test Analysis Useful?
&lt;/h1&gt;

&lt;p&gt;Batch Test Analysis is particularly useful for workflows that combine &lt;strong&gt;GOT Online with automated testing across multiple physical devices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Compared with simply checking device compatibility, this approach provides more targeted performance information.&lt;/p&gt;

&lt;p&gt;Instead of asking only:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Does the game run on this device?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;developers can ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Which performance problems occur on which devices, how frequently do they occur, and which problems should we optimize first?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the same time, crash information collected during the test provides another layer of information that development teams often need when running automated tests.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Are the Requirements for Batch Test Analysis?
&lt;/h1&gt;

&lt;p&gt;Batch Test Analysis is available for GOT Online test data generated &lt;strong&gt;on or after August 14&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The following conditions must be met:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each individual test must run for at least &lt;strong&gt;3 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;At least &lt;strong&gt;5 test data records&lt;/strong&gt; are required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When these conditions are satisfied, the Batch Test Analysis feature can be used to analyze the test batch.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Should Teams Consider When Using Poco Automation?
&lt;/h1&gt;

&lt;p&gt;When using the &lt;strong&gt;Poco-based automated testing scripts&lt;/strong&gt; with GOT Online's Overview mode, the scripts may introduce additional CPU overhead.&lt;/p&gt;

&lt;p&gt;Development teams should therefore also consider optimizing the Poco automation scripts themselves.&lt;/p&gt;

&lt;p&gt;Otherwise, some of the CPU workload observed during the test may come from the automation process rather than the game itself.&lt;/p&gt;

&lt;p&gt;This is particularly important when evaluating CPU-related performance metrics.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Running performance tests across many physical devices provides broader coverage but also creates a large amount of data to analyze.&lt;/li&gt;
&lt;li&gt;Batch analysis can identify common performance problems without requiring developers to manually inspect every report.&lt;/li&gt;
&lt;li&gt;Performance issues can be traced to specific devices, test cases, and performance modules.&lt;/li&gt;
&lt;li&gt;Crash information can be analyzed alongside performance test results.&lt;/li&gt;
&lt;li&gt;FPS, memory, power, temperature, and network data provide a high-level view of performance across the test batch.&lt;/li&gt;
&lt;li&gt;Individual performance reports can then be opened for deeper investigation.&lt;/li&gt;
&lt;li&gt;When using Poco-based automation, teams should account for the CPU overhead introduced by the automation scripts.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Q1. What is Batch Test Analysis in GOT Online?
&lt;/h3&gt;

&lt;p&gt;Batch Test Analysis allows developers to analyze multiple GOT Online test reports together instead of reviewing them individually. It generates an Excel workbook containing test summaries, optimization information, affected devices, test failures, and performance data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. How many test reports are required for Batch Test Analysis?
&lt;/h3&gt;

&lt;p&gt;At least &lt;strong&gt;5 test data records&lt;/strong&gt; are required, and each individual test must be at least &lt;strong&gt;3 minutes long&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q3. Can Batch Test Analysis identify which devices have performance problems?
&lt;/h3&gt;

&lt;p&gt;Yes. The analysis can identify specific devices, test cases, and performance modules associated with performance problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q4. Can the feature detect crashes?
&lt;/h3&gt;

&lt;p&gt;Yes. If a test case crashes or exits unexpectedly, the test failure information can be included in the batch analysis. Developers can use device information, test time, runtime duration, and memory usage as clues for further investigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q5. What performance metrics are included in the batch analysis?
&lt;/h3&gt;

&lt;p&gt;The performance overview includes high-level information such as FPS, memory, power consumption, temperature, and network traffic. Scenario-level performance information is also provided.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q6. Does Poco automation affect performance measurements?
&lt;/h3&gt;

&lt;p&gt;Potentially. Poco-based automation scripts used with GOT Online Overview mode may introduce additional CPU overhead. Teams should consider optimizing the automation scripts when interpreting CPU-related performance results.&lt;/p&gt;

&lt;h1&gt;
  
  
  About GameOptim GOT Online
&lt;/h1&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 helps development teams collect and analyze performance data across areas such as CPU, GPU, memory, power, temperature, and network performance.&lt;/p&gt;

&lt;p&gt;With automated testing and batch analysis, teams can move from manually reviewing individual performance reports toward a more scalable performance testing workflow.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>performance</category>
      <category>testing</category>
    </item>
    <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>
  </channel>
</rss>
