Skip to content

Commit 04aa00e

Browse files
committed
Optimized UI events processing. Updates are no longer processed if not over a UI element, or not pressed a UI element.
1 parent 0c368b5 commit 04aa00e

1 file changed

Lines changed: 49 additions & 9 deletions

File tree

Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
using UnityEngine;
1111
using UnityEngine.EventSystems;
1212
using UnityEngine.UI;
13+
using Pointer = TouchScript.Pointers.Pointer;
14+
using UnityEngine.Profiling;
1315

1416
namespace TouchScript.Layers.UI
1517
{
@@ -62,7 +64,7 @@ public static TouchScriptInputModule Instance
6264
private static TouchScriptInputModule instance;
6365
private static FieldInfo raycastersProp;
6466
private static PropertyInfo canvasProp;
65-
private static Dictionary<int, Canvas> raycasterCanvasCache = new Dictionary<int, Canvas>();
67+
private static Dictionary<int, Canvas> raycasterCanvasCache = new Dictionary<int, Canvas>(10);
6668

6769
private int refCount = 0;
6870
private UIStandardInputModule ui;
@@ -218,11 +220,7 @@ private void disable()
218220

219221
#endregion
220222

221-
#region Event handlers
222-
223-
#endregion
224-
225-
#region Copypasted code from UI
223+
#region Copy-pasted code from UI
226224

227225
/// <summary>
228226
/// Basically, copied code from UI Input Module which handles all UI pointer processing logic.
@@ -232,9 +230,13 @@ private class UIStandardInputModule
232230
{
233231
protected TouchScriptInputModule input;
234232

233+
private CustomSampler uiSampler;
234+
235235
public UIStandardInputModule(TouchScriptInputModule input)
236236
{
237237
this.input = input;
238+
239+
uiSampler = CustomSampler.Create("[TouchScript] Update UI");
238240
}
239241

240242
#region Unchanged from PointerInputModule
@@ -243,7 +245,7 @@ public UIStandardInputModule(TouchScriptInputModule input)
243245
private Vector2 m_LastMoveVector;
244246
private float m_PrevActionTime;
245247

246-
private Dictionary<int, PointerEventData> m_PointerData = new Dictionary<int, PointerEventData>();
248+
private Dictionary<int, PointerEventData> m_PointerData = new Dictionary<int, PointerEventData>(10);
247249

248250
public bool IsPointerOverGameObject(int pointerId)
249251
{
@@ -429,15 +431,24 @@ private void convertRaycast(RaycastHitUI old, ref RaycastResult current)
429431

430432
public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventArgs)
431433
{
434+
uiSampler.Begin();
435+
432436
var pointers = pointerEventArgs.Pointers;
433437
var raycast = new RaycastResult();
434438
var count = pointers.Count;
435439
for (var i = 0; i < count; i++)
436440
{
437441
var pointer = pointers[i];
442+
// Don't update the pointer if it is pressed not over an UI element
443+
if ((pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) > 0)
444+
{
445+
var press = pointer.GetPressData();
446+
if (press.Type != HitData.HitType.UI) continue;
447+
}
438448

439449
var over = pointer.GetOverData();
440-
if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue;
450+
// Don't update the pointer if it is not over an UI element
451+
if (over.Type != HitData.HitType.UI) continue;
441452

442453
PointerEventData data;
443454
GetPointerData(pointer.Id, out data, true);
@@ -487,18 +498,23 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA
487498
ExecuteEvents.ExecuteHierarchy(scrollHandler, data, ExecuteEvents.scrollHandler);
488499
}
489500
}
501+
502+
uiSampler.End();
490503
}
491504

492505
public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventArgs)
493506
{
507+
uiSampler.Begin();
508+
494509
var pointers = pointerEventArgs.Pointers;
495510
var count = pointers.Count;
496511
for (var i = 0; i < count; i++)
497512
{
498513
var pointer = pointers[i];
499514

500515
var over = pointer.GetOverData();
501-
if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue;
516+
// Don't update the pointer if it is not over an UI element
517+
if (over.Type != HitData.HitType.UI) continue;
502518

503519
PointerEventData data;
504520
GetPointerData(pointer.Id, out data, true);
@@ -560,15 +576,23 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA
560576
if (data.pointerDrag != null)
561577
ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.initializePotentialDrag);
562578
}
579+
580+
uiSampler.End();
563581
}
564582

565583
public virtual void ProcessReleased(object sender, PointerEventArgs pointerEventArgs)
566584
{
585+
uiSampler.Begin();
586+
567587
var pointers = pointerEventArgs.Pointers;
568588
var count = pointers.Count;
569589
for (var i = 0; i < count; i++)
570590
{
571591
var pointer = pointers[i];
592+
var press = pointer.GetPressData();
593+
// Don't update the pointer if it is was not pressed over an UI element
594+
if (press.Type != HitData.HitType.UI) continue;
595+
572596
var over = pointer.GetOverData();
573597

574598
PointerEventData data;
@@ -611,15 +635,20 @@ public virtual void ProcessReleased(object sender, PointerEventArgs pointerEvent
611635
input.HandlePointerExitAndEnter(data, currentOverGo);
612636
}
613637
}
638+
639+
uiSampler.End();
614640
}
615641

616642
public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEventArgs)
617643
{
644+
uiSampler.Begin();
645+
618646
var pointers = pointerEventArgs.Pointers;
619647
var count = pointers.Count;
620648
for (var i = 0; i < count; i++)
621649
{
622650
var pointer = pointers[i];
651+
623652
var over = pointer.GetOverData();
624653

625654
PointerEventData data;
@@ -648,21 +677,32 @@ public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEven
648677
ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler);
649678
data.pointerEnter = null;
650679
}
680+
681+
uiSampler.End();
651682
}
652683

653684
public virtual void ProcessRemoved(object sender, PointerEventArgs pointerEventArgs)
654685
{
686+
uiSampler.Begin();
687+
655688
var pointers = pointerEventArgs.Pointers;
656689
var count = pointers.Count;
657690
for (var i = 0; i < count; i++)
658691
{
659692
var pointer = pointers[i];
693+
694+
var over = pointer.GetOverData();
695+
// Don't update the pointer if it is not over an UI element
696+
if (over.Type != HitData.HitType.UI) continue;
697+
660698
PointerEventData data;
661699
GetPointerData(pointer.Id, out data, true);
662700

663701
if (data.pointerEnter) ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler);
664702
RemovePointerData(pointer.Id);
665703
}
704+
705+
uiSampler.End();
666706
}
667707

668708
#endregion

0 commit comments

Comments
 (0)