From b65b81a07442d48713683a22358ba4b29b1848fc Mon Sep 17 00:00:00 2001 From: David Friedman Date: Fri, 23 Sep 2016 12:29:40 -0700 Subject: [PATCH] Docs: New document on interpreting Profile GPU tool results Bug: 31312918 Change-Id: Ic0f181585087c2f0bf739ad319b9c5baf1c94f64 --- docs/html/topic/performance/images/bars.png | Bin 0 -> 337862 bytes .../performance/images/s-profiler-legend.png | Bin 0 -> 83021 bytes docs/html/topic/performance/profile-gpu.jd | 406 ++++++++++++++++++ 3 files changed, 406 insertions(+) create mode 100644 docs/html/topic/performance/images/bars.png create mode 100644 docs/html/topic/performance/images/s-profiler-legend.png create mode 100644 docs/html/topic/performance/profile-gpu.jd diff --git a/docs/html/topic/performance/images/bars.png b/docs/html/topic/performance/images/bars.png new file mode 100644 index 0000000000000000000000000000000000000000..3afea465c975a766b39ecfe33e7dd3e25761e5ce GIT binary patch literal 337862 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 literal 0 HcmV?d00001 diff --git a/docs/html/topic/performance/images/s-profiler-legend.png b/docs/html/topic/performance/images/s-profiler-legend.png new file mode 100644 index 0000000000000000000000000000000000000000..968fd381156a363bce0ad6d763b23804f1a33f2f GIT binary patch literal 83021 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 literal 0 HcmV?d00001 diff --git a/docs/html/topic/performance/profile-gpu.jd b/docs/html/topic/performance/profile-gpu.jd new file mode 100644 index 0000000000000..11c38e40783d5 --- /dev/null +++ b/docs/html/topic/performance/profile-gpu.jd @@ -0,0 +1,406 @@ +page.title=Analyzing Rendering with Profile GPU +page.metaDescription=Use the Profile GPU tool to help you optimize your app's rendering performance. + +meta.tags="power" +page.tags="power" + +@jd:body + + + +

+The +Profile GPU Rendering tool indicates the relative time that each stage of +the rendering pipeline takes to render the previous frame. This knowledge +can help you identify bottlenecks in the pipeline, so that you +can know what to optimize to improve your app's rendering performance. +

+ +

+This page briefly explains what happens during each pipeline stage, and +discusses issues that can cause bottlenecks there. Before reading +this page, you should be familiar with the information presented in the +Profile GPU +Rendering Walkthrough. In addition, to understand how all of the +stages fit together, it may be helpful to review + +how the rendering pipeline works. +

+ +

Visual Representation

+ +

+The Profile GPU Rendering tool displays stages and their relative times in the +form of a graph: a color-coded histogram. Figure 1 shows an example of +such a display. +

+ + +

+Figure 1. Profile GPU Rendering Graph +

+ +

+ +

+Each segment of each vertical bar displayed in the Profile GPU Rendering +graph represents a stage of the pipeline and is highlighted using a specific +color in +the bar graph. Figure 2 shows a key to the meaning of each displayed color. +

+ + +

+Figure 2. Profile GPU Rendering Graph Legend +

+ +

+Once you understand what each color signfiies, +you can target specific aspects of your +app to try to optimize its rendering performance. +

+ +

Stages and Their Meanings

+ +

+This section explains what happens during each stage corresponding +to a color in Figure 2, as well as bottleneck causes to look out for. +

+ + +

Input Handling

+ +

+The input handling stage of the pipeline measures how long the app +spent handling input events. This metric indicates how long the app +spent executing code called as a result of input event callbacks. +

+ +

When this segment is large

+ +

+High values in this area are typically a result of too much work, or +too-complex work, occurring inside the input-handler event callbacks. +Since these callbacks always occur on the main thread, solutions to this +problem focus on optimizing the work directly, or offloading the work to a +different thread. +

+ +

+It’s also worth noting that {@link android.support.v7.widget.RecyclerView} +scrolling can appear in this phase. +{@link android.support.v7.widget.RecyclerView} scrolls immediately when it +consumes the touch event. As a result, +it can inflate or populate new item views. For this reason, it’s important to +make this operation as fast as possible. Profiling tools like Traceview or +Systrace can help you investigate further. +

+ +

Animation

+ +

+The Animations phase shows you just how long it took to evaluate all the +animators that were running in that frame. The most common animators are +{@link android.animation.ObjectAnimator}, +{@link android.view.ViewPropertyAnimator}, and +Transitions. +

+ +

When this segment is large

+ +

+High values in this area are typically a result of work that’s executing due +to some property change of the animation. For example, a fling animation, +which scrolls your {@link android.widget.ListView} or +{@link android.support.v7.widget.RecyclerView}, causes large amounts of view +inflation and population. +

+ +

Measurement/Layout

+ +

+In order for Android to draw your view items on the screen, it executes +two specific operations across layouts and views in your view hierarchy. +

+ +

+First, the system measures the view items. Every view and layout has +specific data that describes the size of the object on the screen. Some views +can have a specific size; others have a size that adapts to the size +of the parent layout container +

+ +

+Second, the system lays out the view items. Once the system calculates +the sizes of children views, the system can proceed with layout, sizing +and positioning the views on the screen. +

+ +

+The system performs measurement and layout not only for the views to be drawn, +but also for the parent hierarchies of those views, all the way up to the root +view. +

+ +

When this segment is large

+ +

+If your app spends a lot of time per frame in this area, it is +usually either because of the sheer volume of views that need to be +laid out, or problems such as + +double taxation at the wrong spot in your +hierarchy. In either of these cases, addressing performance involves +improving +the performance of your view hierarchies. +

+ +

+Code that you’ve added to +{@link android.view.View#onLayout(boolean, int, int, int, int)} or +{@link android.view.View#onMeasure(int, int)} +can also cause performance +issues. Traceview and +Systrace can help you examine +the callstacks to identify problems your code may have. +

+ +

Drawing

+ +

+The draw stage translates a view’s rendering operations, such as drawing +a background or drawing text, into a sequence of native drawing commands. +The system captures these commands into a display list. +

+ +

+The Draw bar records how much time it takes to complete capturing the commands +into the display list, for all the views that needed to be updated on the screen +this frame. The measured time applies to any code that you have added to the UI +objects in your app. Examples of such code may be the +{@link android.view.View#onDraw(android.graphics.Canvas) onDraw()}, +{@link android.view.View#dispatchDraw(android.graphics.Canvas) dispatchDraw()}, +and the various draw ()methods belonging to the subclasses of the +{@link android.graphics.drawable.Drawable} class. +

+ +

When this segment is large

+ +

+In simplified terms, you can understand this metric as showing how long it took +to run all of the calls to +{@link android.view.View#onDraw(android.graphics.Canvas) onDraw()} +for each invalidated view. This +measurement includes any time spent dispatching draw commands to children and +drawables that may be present. For this reason, when you see this bar spike, the +cause could be that a bunch of views suddenly became invalidated. Invalidation +makes it necessary to regenerate views' display lists. Alternatively, a +lengthy time may be the result of a few custom views that have some extremely +complex logic in their +{@link android.view.View#onDraw(android.graphics.Canvas) onDraw()} methods. +

+ +

Sync/Upload

+ +

+The Sync & Upload metric represents the time it takes to transfer +bitmap objects from CPU memory to GPU memory during the current frame. +

+ +

+As different processors, the CPU and the GPU have different RAM areas +dedicated to processing. When you draw a bitmap on Android, the system +transfers the bitmap to GPU memory before the GPU can render it to the +screen. Then, the GPU caches the bitmap so that the system doesn’t need to +transfer the data again unless the texture gets evicted from the GPU texture +cache. +

+ +

Note: On Lollipop devices, this stage is +purple. +

+ +

When this segment is large

+ +

+All resources for a frame need to reside in GPU memory before they can be +used to draw a frame. This means that a high value for this metric could mean +either a large number of small resource loads or a small number of very large +resources. A common case is when an app displays a single bitmap that’s +close to the size of the screen. Another case is when an app displays a +large number of thumbnails. +

+ +

+To shrink this bar, you can employ techniques such as: +

+ +
    +
  • +Ensuring your bitmap resolutions are not much larger than the size at which they +will be displayed. For example, your app should avoid displaying a 1024x1024 +image as a 48x48 image. +
  • + +
  • +Taking advantage of {@link android.graphics.Bitmap#prepareToDraw()} +to asynchronously pre-upload a bitmap before the next sync phase. +
  • +
+ +

Issuing Commands

+ +

+The Issue Commands segment represents the time it takes to issue all +of the commands necessary for drawing display lists to the screen. +

+ +

+For the system to draw display lists to the screen, it sends the +necessary commands to the GPU. Typically, it performs this action through the +OpenGL ES API. +

+ +

+This process takes some time, as the system performs final transformation +and clipping for each command before sending the command to the GPU. Additional +overhead then arises on the GPU side, which computes the final commands. These +commands include final transformations, and additional clipping. +

+ +

When this segment is large

+ +

+The time spent in this stage is a direct measure of the complexity and +quantity of display lists that the system renders in a given +frame. For example, having many draw operations, especially in cases where +there's a small inherent cost to each draw primitive, could inflate this time. +For example: +

+ +
+for (int i = 0; i < 1000; i++)
+canvas.drawPoint()
+
+ +

+is a lot more expensive to issue than: +

+ +
+canvas.drawPoints(mThousandPointArray);
+
+ +

+There isn’t always a 1:1 correlation between issuing commands and +actually drawing display lists. Unlike Issue Commands, +which captures the time it takes to send drawing commands to the GPU, +the Draw metric represents the time that it took to capture the issued +commands into the display list. +

+ +

+This difference arises because the display lists are cached by +the system wherever possible. As a result, there are situations where a +scroll, transform, or animation requires the system to re-send a display +list, but not have to actually rebuild it—recapture the drawing +commands—from scratch. As a result, you can see a high “Issue +commands” bar without seeing a high Draw commands bar. +

+ +

Processing/Swapping Buffers

+ +

+Once Android finishes submitting all its display list to the GPU, +the system issues one final command to tell the graphics driver that it's +done with the current frame. At this point, the driver can finally present +the updated image to the screen. +

+ +

When this segment is large

+ +

+It’s important to understand that the GPU executes work in parallel with the +CPU. The Android system issues draw commands to the GPU, and then moves on to +the next task. The GPU reads those draw commands from a queue and processes +them. +

+ +

+In situations where the CPU issues commands faster than the GPU +consumes them, the communications queue between the processors can become +full. When this occurs, the CPU blocks, and waits until there is space in the +queue to place the next command. This full-queue state arises often during the +Swap Buffers stage, because at that point, a whole frame’s worth of +commands have been submitted. +

+ +

+The key to mitigating this problem is to reduce the complexity of work occurring +on the GPU, in similar fashion to what you would do for the “Issue Commands” +phase. +

+ + +

Miscellaneous

+ +

+In addition to the time it takes the rendering system to perform its work, +there’s an additional set of work that occurs on the main thread and has +nothing to do with rendering. Time that this work consumes is reported as +misc time. Misc time generally represents work that might be occurring +on the UI thread between two consecutive frames of rendering. +

+ +

When this segment is large

+ +

+If this value is high, it is likely that your app has callbacks, intents, or +other work that should be happening on another thread. Tools such as +Method +Tracing or Systrace can provide +visibility into the tasks that are running on +the main thread. This information can help you target performance improvements. +