osu-framework icon indicating copy to clipboard operation
osu-framework copied to clipboard

Assertion hit in ScrollContainer.OnDrag

Open peppy opened this issue 6 years ago • 4 comments


Assertion Failed

   at osu.Framework.Graphics.Containers.ScrollContainer`1.OnDrag(DragEvent e) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Graphics\Containers\ScrollContainer.cs:line 304
   at osu.Game.Graphics.Containers.OsuScrollContainer.OnDrag(DragEvent e) in C:\Users\Dean\Projects\osu\osu.Game\Graphics\Containers\OsuScrollContainer.cs:line 60
   at osu.Framework.Graphics.Drawable.TriggerEvent(UIEvent e) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Graphics\Drawable.cs:line 1877
   at osu.Framework.Input.MouseButtonEventManager.<>c__DisplayClass38_0.<PropagateMouseButtonEvent>b__0(Drawable target) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\MouseButtonEv
entManager.cs:line 269
   at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Func`2 predicate, Boolean& found)
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at osu.Framework.Input.MouseButtonEventManager.PropagateMouseButtonEvent(IEnumerable`1 drawables, MouseButtonEvent e) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\MouseButtonEv
entManager.cs:line 269
   at osu.Framework.Input.MouseButtonEventManager.HandleMouseDrag(InputState state, Vector2 lastPosition) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\MouseButtonEventManager.cs:l
ine 225
   at osu.Framework.Input.MouseButtonEventManager.HandlePositionChange(InputState state, Vector2 lastPosition) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\MouseButtonEventManager
.cs:line 116
   at osu.Framework.Input.InputManager.HandleMousePositionChange(MousePositionChangeEvent e) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\InputManager.cs:line 470
   at osu.Framework.Input.InputManager.HandleInputStateChange(InputStateChangeEvent inputStateChange) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\InputManager.cs:line 437
   at osu.Framework.Input.UserInputManager.HandleInputStateChange(InputStateChangeEvent inputStateChange) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\UserInputManager.cs:line 45
   at osu.Framework.Input.StateChanges.MousePositionAbsoluteInput.Apply(InputState state, IInputStateChangeHandler handler) in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\StateChang
es\MousePositionAbsoluteInput.cs:line 33
   at osu.Framework.Input.InputManager.Update() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\InputManager.cs:line 238
   at osu.Framework.Input.PassThroughInputManager.Update() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Input\PassThroughInputManager.cs:line 129
   at osu.Framework.Graphics.Drawable.UpdateSubTree() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Graphics\Drawable.cs:line 442
   at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Graphics\Containers\CompositeDrawable.cs:line 802
   at osu.Framework.Platform.GameHost.UpdateFrame() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Platform\GameHost.cs:line 303
   at osu.Framework.Threading.GameThread.ProcessFrame() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Threading\GameThread.cs:line 140
   at osu.Framework.Threading.GameThread.runWork() in C:\Users\Dean\Projects\osu-framework\osu.Framework\Threading\GameThread.cs:line 110
   at System.Threading.Thread.ThreadMain_ThreadStart()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)

peppy avatar Jul 25 '19 14:07 peppy

This is happening to me occasionally and I was able to reproduce it with some numbers:

BeatmapCarousel+CarouselScrollContainer
scrollOffset:3.1470947, clampedScrollOffset:3.1484375
3.1470947 > 3.1484375 (-0.0013428)

The acceptable diff from Precision.AlmostBigger is by default 0.001, compared to the diff here which is 0.0013428

kOchirasu avatar Mar 16 '20 02:03 kOchirasu

Seems to be a problem with float precision on larger values. The target scroll position that is being used for this calculation can sometimes only hold 2 digits of precision which causes this assert to be hit.

Example:

float x = 0.1111111111f;
for (int i = 0; i < 10; i++) {
  Console.WriteLine(x);
  x *= 10;
}
0.1111111
1.111111
11.11111
111.1111
1111.111
11111.11
111111.1
1111111
1.111111E+07
1.111111E+08

kOchirasu avatar Mar 16 '20 03:03 kOchirasu

Steps to reproduce:

  1. Have a long enough song list to cause precision problems
  2. Go to the bottom of the list
  3. Scroll back and forth quickly

kOchirasu avatar Mar 16 '20 03:03 kOchirasu

Also reproduced in editor timeline, caused by the scroll range being defined in milliseconds, which can make it quite large.

We really probably definitely want double support for ScrollContainer internals (although not sure how feasible that is without changes to Drawable etc.)

peppy avatar Apr 15 '21 07:04 peppy