BUILDING A FAST USER INTERFACE
Transcription
BUILDING A FAST USER INTERFACE
BUILDING A FAST USER INTERFACE • Tim Cooper • Rune Johansen COPYRIGHT 2015 @ UNITY TECHNOLOGIES THINGS YOU WILL KNOW • Author high performance UI’s • Use the new Unity Frame debugger • Understand what ‘batching’ is and why you want it • The performance cost of a CanvasRenderer • How to write optimised custom UI components COPYRIGHT 2015 @ UNITY TECHNOLOGIES WHO ARE WE? COPYRIGHT 2014 2015 @ UNITY TECHNOLOGIES TIM COOPER COPYRIGHT 2015 @ UNITY TECHNOLOGIES RUNE JOHANSEN COPYRIGHT 2015 @ UNITY TECHNOLOGIES BATCHING COPYRIGHT 2014 2015 @ UNITY TECHNOLOGIES WHAT IS BATCHING? • Decreases draw calls • Combine input elements into one output element • Reduces the load on the render thread COPYRIGHT 2015 @ UNITY TECHNOLOGIES No Batching Batching HOW DOES BATCHING GET CALCULATED? • Based on a number of internal rules • Material changes • Element overlaps • Shared material properties • You need to configure your project to take advantage of this • You need to understand your content ;) COPYRIGHT 2015 @ UNITY TECHNOLOGIES **BEFORE WE BEGIN** UNITY 5 FRAME DEBUGGER • Step through individual draw calls • Easiest way to see what is getting batched • Works in editor! • How do I use it? COPYRIGHT 2015 @ UNITY TECHNOLOGIES DEMO COPYRIGHT 2015 @ UNITY TECHNOLOGIES BACK TO BATCHING • Batch calculations happen for each canvas • This includes nested canvases! • What are the rules? COPYRIGHT 2015 @ UNITY TECHNOLOGIES RULE #1A • If elements use the same material and texture • They can batch together COPYRIGHT 2015 @ UNITY TECHNOLOGIES RULE #1B • If elements use the same material and texture and overlap • They can still batch! COPYRIGHT 2015 @ UNITY TECHNOLOGIES RULE #2 • Batches will be broken when a material / texture change is required COPYRIGHT 2015 @ UNITY TECHNOLOGIES RULE #2A • Simple case: • Material / Texture change • Elements can not batch • Separate draw calls are required COPYRIGHT 2015 @ UNITY TECHNOLOGIES RULE #2B • Less simple case • Overlapping elements • Elements need to be rendered in order • If there are different materials / textures between two non overlapping elements… • Batching will break COPYRIGHT 2015 @ UNITY TECHNOLOGIES BATCH SORTING • Internal to the UI System • Uses rect overlaps to calculate this. • Rearranges draw order • Least material changes • Least texture changes • Keeps output appearing the same COPYRIGHT 2015 @ UNITY TECHNOLOGIES SPECIAL RULE (5.2) • Only elements that are coplanar with the Canvas will sort for batching • If the UI is in perspective mode, or elements are rotated things can render incorrectly. COPYRIGHT 2015 @ UNITY TECHNOLOGIES Modified internal code to show issue SPECIAL RULE (5.2) • If we ‘break’ the sorting • The issue will be fixed • Depending on content this may or may not cost more draw calls. COPYRIGHT 2015 @ UNITY TECHNOLOGIES SPECIAL RULE (5.2) • What makes an element break coplanerness? • Elements having a different z-value from the canvas • Elements rotated out of canvas alignment • Input mesh with vertices where the z value is not aligned with the canvas COPYRIGHT 2015 @ UNITY TECHNOLOGIES RULE SUMMARY • Changing materials breaks a batch • Changing textures breaks a batch • Elements offset from the canvas breaks a batch COPYRIGHT 2015 @ UNITY TECHNOLOGIES APPLYING THE RULES • Minimise material changes in your UI • Use materials for effects, or special things • Use a single material for most of the UI • 5.2 • Text and normal UI elements can use the same material COPYRIGHT 2015 @ UNITY TECHNOLOGIES APPLYING THE RULES • Minimise texture changes in your UI • Use sprite atlases. • Note - Text is not put in a sprite atlas • Can lead to increased draw calls. COPYRIGHT 2015 @ UNITY TECHNOLOGIES APPLYING THE RULES • Keep elements in coplanar with the Canvas • You can use nested canvas • It’s okay to move some elements off the canvas • Buttons that pop out ect • Make it the exception COPYRIGHT 2015 @ UNITY TECHNOLOGIES RENDERING •Fast Batches •Slow Batches COPYRIGHT 2015 @ UNITY TECHNOLOGIES SLOW BATCHES • Whenever a material is changed • The shader must be changed • Slow process • Internal rendering state needs to be rebuilt • “SetPass” in the stats window • Minimise material changes COPYRIGHT 2015 @ UNITY TECHNOLOGIES FAST BATCHES • Whenever a texture is changed • The material can stay the same • Internal rendering state stays the same • The shader uniforms are updated • Just another draw call COPYRIGHT 2015 @ UNITY TECHNOLOGIES IN PRACTICE • Example COPYRIGHT 2015 @ UNITY TECHNOLOGIES CANVAS RENDERER COPYRIGHT 2014 2015 @ UNITY TECHNOLOGIES BUILDING BLOCKS • All renderable UI elements have a CanvasRenderer • The UI components configure a CanvasRenderer • Texture • Mesh • Colour • What happens when you change a CanvasRenderer? • What happens if you reparent or reorder CanvasRenders? COPYRIGHT 2015 @ UNITY TECHNOLOGIES MODIFICATION • Causes Rebatching! • Need to recalculate internal state • Could change batching / other elements • Not slow, but also not fast • Do it as little as possible! COPYRIGHT 2015 @ UNITY TECHNOLOGIES REORDERING • Rearrange hierarchy / Change sibling order • We need to recalculate the depths of all elements • Manually iterate all CanvasRenders on a Canvas • Then do a Rebatch • Avoid this whenever you can! COPYRIGHT 2015 @ UNITY TECHNOLOGIES PIXEL PERFECT • Snaps RectTransform edges to vertex boundaries • Happens whenever a Rect is moved • Including children • Means that vertices need to be regenerated • SLOW! COPYRIGHT 2015 @ UNITY TECHNOLOGIES PIXEL PERFECT • For speed • Disable pixel perfect on Canvases where elements move • You can disable at the start of movement, reenable after • Pixel perfect only works on Screen Space canvas! COPYRIGHT 2015 @ UNITY TECHNOLOGIES OPTIMIZING CUSTOM UI COMPONENTS COPYRIGHT 2014 2015 @ UNITY TECHNOLOGIES CUSTOM UI ELEMENTS You can make your own UI components • Custom graphics (controls Canvas Renderer) • Custom layout (controls Rect Transforms) Optimization means: • Layout and graphics should only be rebuilt when needed COPYRIGHT 2015 @ UNITY TECHNOLOGIES CANVAS ELEMENT • Custom UI elements can be Canvas Elements • Implement ICanvasElement public interface ICanvasElement { void Rebuild(CanvasUpdate executing); … } COPYRIGHT 2015 @ UNITY TECHNOLOGIES public interface ICanvasElement { void Rebuild(CanvasUpdate executing); … } • CanvasUpdate • Prelayout • Layout • PostLayout • PreRender • LatePreRender COPYRIGHT 2015 @ UNITY TECHNOLOGIES REBUILD CALLBACKS • PreLayout • Update data needed for layout calculations • Layout • Used by auto-layout system • PostLayout • Update data dependent on layout • PreRender • Update vertices and materials • LatePreRender • Update vertices dependent on generated text character data COPYRIGHT 2015 @ UNITY TECHNOLOGIES TRIGGERING REBUILDS Layout CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild • PreLayout • Layout • PostLayout Graphic CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild • PreRender • LatePreRender COPYRIGHT 2015 @ UNITY TECHNOLOGIES TRIGGERING REBUILDS • Rebuilds are delayed, not immediate • Multiple things may trigger the same rebuild • but it only happens once COPYRIGHT 2015 @ UNITY TECHNOLOGIES Canvas.willRenderCanvases > delegate invoked (5.2+) The CanvasUpdater is invoked as part of willRenderCanvases Each rebuild can be triggered by multiple things in the same frame, but the callback only happens once. COPYRIGHT 2015 @ UNITY TECHNOLOGIES WHAT SHOULD TRIGGER WHICH REBUILDS? • We want rebuilds to happen when needed • Otherwise we get buggy behavior • We only want the rebuilds when needed • Otherwise performance suffers COPYRIGHT 2015 @ UNITY TECHNOLOGIES PROPERTY CHANGES IN YOUR COMPONENT If a property change may require changes to vertices or materials (anything on CanvasRenderer) • RegisterCanvasElementForGraphicRebuild Examples • Color change • Sprite change • Essentially anything that affects appearance COPYRIGHT 2015 @ UNITY TECHNOLOGIES PROPERTY CHANGES IN YOUR COMPONENT If a property change may require changes to position or size (anything on RectTransform) • Change RectTransform immediately (simple things - slider) • LayoutRebuilder.MarkLayoutForRebuild (auto-layout) RegisterCanvasElementForLayoutRebui • CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild ld is only rarely used Normally higher level LayoutRebuilder is used instead. COPYRIGHT 2015 @ UNITY TECHNOLOGIES CHANGES TO RECTTRANSFORM OR HIERARCHY Outside changes may require a rebuild • OnRectTransformDimensionsChange • OnTransformParentChanged • OnTransformChildrenChanged (for layout groups) • OnCanvasGroupChanged COPYRIGHT 2015 @ UNITY TECHNOLOGIES SHORTCUTS Inherit from existing built-in classes that do much of the work • Graphic • Selectable • LayoutGroup COPYRIGHT 2015 @ UNITY TECHNOLOGIES OPTIMIZING CUSTOM LAYOUT COMPONENTS COPYRIGHT 2014 2015 @ UNITY TECHNOLOGIES AUTO-LAYOUT Auto-Layout system has • Layout Elements (Image, Text, LayoutElement) • Layout Controllers • Layout Groups (HorizontalLayoutGroup) • Layout Self Controllers (ContentSizeFitter) COPYRIGHT 2015 @ UNITY TECHNOLOGIES LAYOUT ELEMENTS Layout Elements provide layout input: • Minimum size • Preferred size • Flexible size COPYRIGHT 2015 @ UNITY TECHNOLOGIES LAYOUT ELEMENTS public interface ILayoutElement { void CalculateLayoutInputHorizontal(); void CalculateLayoutInputVertical(); float minWidth { get; } float preferredWidth { get; } float flexibleWidth { get; } float minHeight { get; } float preferredHeight { get; } float flexibleHeight { get; } int layoutPriority { get; } } COPYRIGHT 2015 @ UNITY TECHNOLOGIES LAYOUT CONTROLLERS Layout Controllers use the layout input and control • RectTransform sizes • RectTransform positions COPYRIGHT 2015 @ UNITY TECHNOLOGIES LAYOUT CONTROLLERS public interface ILayoutController { void SetLayoutHorizontal(); void SetLayoutVertical(); } COPYRIGHT 2015 @ UNITY TECHNOLOGIES AUTO-LAYOUT CALLBACK ORDER Layout input data can depend on children • Calculate children first, parents afterwards! Layout control of RectTransform can affect children • Calculate parents first, children afterwards! This avoids calculations becoming obsolete because of child or parent changes in the same frame • No need to re-calculate COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES COPYRIGHT 2015 @ UNITY TECHNOLOGIES LAYOUT ELEMENT OPTIMIZATION Optimize the layout calculations by storing the calculated layout input for when it’s used • CalculateLayoutInputHorizontal • Calculate and store minimum, preferred, flexible • minWidth, preferredWidth, flexibleWidth properties • Simply return stored result COPYRIGHT 2015 @ UNITY TECHNOLOGIES