-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Osu!CTB Replays are incorrect on maps with a very high note per second rate #26436
Comments
For reference, here is a close-up at one of the false misses while watching the replay: CleanShot.2024-01-11.at.10.27.31.mp4It appears that the catcher's position is being updated prior to marking the hyper dash fruit as judged. Unassigning for now as this does not look to be a simple one at my current state and knowledge of catch replay handling. |
Bumping this to priority 0. This needs immediate attention as it may cause issues with gameplay recorded on lazer too. osu!catch is one of the examples where replays should never go wrong because we have guaranteed frame stability on all inputs. |
Hello, in addition to what was reported by @patatitta, I'd like to add that I've seen this issue on simpler maps, with inconsistencies when playing the same replay several times in a row, which showed incorrect droplet counts. Also, I've noticed that skipping in replays with the song progress bar led to completely messed up replays, which might be related to this. (But maybe a bit more expected due to how everything ends up being processed really fast ?) |
Just asking: is #26104 a separate issue or related to this? |
this hasn't been investigated, so can't confirm or deny. |
When errors occur in the catch replay of the lazer game, more serious errors will also occur in the stable, but shouldn't there be any difference in the playback of the two? I think? Hope this content is useful for investigation notice that replay error in stable will reappear in lazer when frame by frame (or skip) Notice to key count, key count display in gameplay is different from replay. |
Intended as at least a partial solution to ppy#26436. In testing, two of the three replays from the issue are FCs with this change, and the third is improved (and not fully fixed). As it turns out, stable truncates the end time of sliders to integers: https://github.com/peppy/osu-stable-reference/blob/79addff0f5d2a328059d2842d6d2968cfb740956/osu!/GameplayElements/HitObjects/Osu/SliderOsu.cs#L1037 and the start time of all juice stream parts is also truncated to integers: https://github.com/peppy/osu-stable-reference/blob/79addff0f5d2a328059d2842d6d2968cfb740956/osu!/GameplayElements/HitObjects/Fruits/SliderFruits.cs#L86-L166 This matters for replay playback when mappers push limits. For instance, let's take one case from the issue. In one of the maps involved, there was a juice-stream-ending fruit at time 7093.9655 according to lazer, which was also a hyperfruit. The broken replay on this map included one frame at time 7093, with the catcher position before the hyperdash, and one frame at time 7097, with the catcher position *after* the hyperdash. Which meant that the replay handler moved *out of the way* of the hyperfruit at time 7093.9655, deciding that it is *after* the replay frame that was supposed to be catching it. (For reference, the relevant replay playback code is here: https://github.com/ppy/osu/blob/3da5831075b187e967ca300dcba0a6761f07d1dd/osu.Game.Rulesets.Catch/Replays/CatchFramedReplayInputHandler.cs#L20-L31 Note the handling of `position`. Any frame with an action is important, which means that as long as any key is held, interpolation will not take place.) On stable this is not a thing, because the fruit's end time was being truncated to `int`, therefore moving it back to time 7093 and restoring temporal integrity. This probably doesn't matter in other rulesets that much because the input tolerances in something like osu! or taiko are much higher. catch is rather knife-edge, what with mappers doing the "edge dash" / "pixel jump" stuff (tl;dr: placing a circle just barely outside of hyperdash range, so that a perfect normal dash is required to catch it). Thus, this is applied locally to catch for now until proven necessary to put it elsewhere too.
Type
Game behaviour
Bug description
While watching phob's replay on the map "Sonic Blaster" I noticed a great discrepancy between the play and the replay, while in the original play they FCed the map, in the replay, they missed very often.
Phob's play was realized on the current stable version of osu!, however, I did multiple tests on the same map on lazer and got similar results. I have seen this bug happen on more maps, like motion's play on pacific girl and dahcreepers NFDT fc on noxious. Most other maps seem to work perfectly, it's only these high note per second maps that are an issue.
I'm aware that refresh rate can affect the replays. All my screenshots were tested with ulimited FPS and no frame drops. Always played at 1.0x speed and always focusing on the window.
Screenshots or videos
Lazer original play
Replay end result
The mod only changes the HP to 0, forgot to remove it from a test earlier, map contains the first 16 second of the map
Phob's Original play
Phob's replay when watched in osu!lazer
Dahcreeper's Original play on Noxious
Dahcreeper's Play on noxious when watched in osu!lazer
Version
2023.1231.0-lazer
Logs
compressed-logs.zip
The text was updated successfully, but these errors were encountered: