osu-framework
osu-framework copied to clipboard
Assertion hit in ScrollContainer.OnDrag
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)
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
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
Steps to reproduce:
- Have a long enough song list to cause precision problems
- Go to the bottom of the list
- Scroll back and forth quickly
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.)