2017 05 02

published 02 May 2017

Lots of pieces are moving! Hard to keep up with posting these things.

Ability to confine mouse to window

Until now the setting was visible but didn’t actually work. You will now be able to confine the mouse cursor to the window either always, or only when in borderless/fullscreen mode.

Functional Frame Limiter

I added support for frame limiter settings at a very basic level. Currently you can choose between VSync, 2x refresh, 4x refresh, 8x refresh and unlimited. The default is 2x.

Keep in mind that as we have decoupled update and draw updates, this setting is specifying the draw rate. Updates will run at a fixed 2x on top of the draw rate.

This may seem quite confusing to the end-user… well that’s because it is! Going forward I hope to work on exposing this setting in an understandable way that doesn’t require knowledge of multi-threaded architecture.

Tidying of unimplemented options

I took the opportunity of removing all unimplemented options from the codebase. While having them all in the options menu (albeit in a disabled state) made it look populated, going forward many of these options will be deprecated or replaced by more refined versions, so it felt counter-productive for the time being.

Now the only options you will see are one which actually function correctly.

Nested dependency support

DependencyContainers lie at the core of the osu! framework. They provide each drawable with resources they need to access in a safe yet flexible way. Until now, these dependencies have been shared game-wide.

With the work today, dependencies can now be overridden at any point in the draw hierarchy. An example of how this can be used that will make sense to the average osu! player is adding skinning support. Now somewhere before the playfield, things such as the texture and sample resource store can be overridden with prioritised lookups on skins’ and beatmaps’ resources, before failing back to game-wide defaults.

Searchable playlist

With the framework support finally being merged, adding searchability to playlists was but a simple change.

Other things

  • Work continues on the localisation engine. It’s rapidly approaching a usable state!

No release today!

Too many things going on to warrant pushing a new release out today. Maybe tomorrow :).


2017 05 01

published 01 May 2017

I guess may is already upon us. How time flies!

Transform sequences

I didn’t get to mention this last week, but I spent some time thinking about how to tidy up places where we use many transforms in a row. Until recently, it was very easily to add delays when making things move and not cleaning up after yourself, creating unintended side-effects somewhere further down the draw tree. Take this example:

We now use the using() pattern to automatically roll back any applied delays, avoiding potential user errors. Some of our contributors have already replaced most existing instances of Delay and DelayReset with this new pattern; once everything is switched over we can remove these two methods completely.

In addition to the delay sequence, there is also the concept of an absolute sequence. This can be used to start transforms from a known time value, which is useful for things like hit objects where you know exactly when you want things to happen, as opposed to applying transforms relative to the current time.

Playlist controller

DrabWeb made some good headway on the playlist implementation, but it was still some way from being in a usable state. I spent some time today refactoring and extending the implementation so his effort in implementing the UI would not be wasted. Getting search hooked up is just one step away (dependent on another few pull requests which need further review)!

Paragraph (and word wrap) support

Again building on DrabWeb’s initiative, I polished the Paragraph logic so we can finally wrap words correctly. While this isn’t used anywhere in-game yet, here’s a quick look at where things stand.

Other things

  • The localisation system continues to get more implementation details thanks to huoyaoyuan #678.
  • A potential regression was fixed post song select performance improvements #693.
  • Quite a sizeable refactor of osu! autoplay code by gracefu was merged #665. No visible changes, but the code is much more elegant.

New release available

2017.501.0 is now available from github releases (or via auto-update if you already have lazer installed)! Contains everything above.


2017 04 28

published 28 Apr 2017

Song select performance

I spent some time today addressing the stuttering performance at song select. Being the centre of osu!, song select is important to get right. There are a lot of piece working together, so it’s essential to get the threading and debouncing logic correct from the get-go.

The changes I worked on today improve performance when quickly selecting multiple beatmaps (especially when using the arrow keys), as well as begin cleaning up the event flow of panel selection which was quite convoluted until now.

Improved lead-in time support

There were still a few remaining issues with lead-in time which have now been resolved. As of the next release all maps with any amount of lead-in should be playable, finally!

Other things

No release today!

Waiting to get a few more pull requests merged before pushing out the next build.

Oh and you may have noticed I skipped a day’s blog yesterday. While I will try and keep up daily blogs, I am not holding myself to it. I regularly need to take breaks from coding to catch up on email, accounting, support, etc. so keep that in mind if you don’t hear from me for a period of time :).


2017 04 26

published 26 Apr 2017

Continued work on clocks and seeking support

Here’s a very raw preview of seeking support utilising speed changes. Rewind support isn’t completely implemented, but can be generally fixed with a few lines of change (though the correct solution will take a bit more thinking, as this was achieved by disabling some game-wide optimisations).

The end goal is to allow seeking in both directions with completely accurate scoring and playback. I actually already achieved this on lazer-transitional in a distant past and am using similar techniques to reimplement this on lazer, so it’s quite familiar (yet still daunting) territory!

Added support for lead-in time

Makes a lot of maps playable that previously weren’t. Haven’t extensively tested this yet, and it will likely receive further revisions over the next few days.

Other things

  • Fix disabling mouse buttons causing auto to stop working #677.
  • osu!taiko difficulty calculations are in! Note that this will only apply to newly imported beatmaps #675.
  • osu!taiko drumroll conversion has received some minor fixes #663.
  • ..as have swells (spinner converts) #676.
  • My changes from yesterday have been merged (improving replay playback accuracy) #672 & #667.

New release available

2017.426.0 is now available from github releases (or via auto-update if you already have lazer installed)! Contains everything above.


2017 04 25

published 25 Apr 2017

Frame-accurate replay playback

I realised while reviewing code today that we were not playing back replays in a frame-accurate manner. I spent most of today fixing that. Frame accurate playback means that the playback will result in the same score no matter how slow/fast it is played back. It means that if there is lag recorded in the replay, it will be reproduced in the replay. Likewise, if there is lag in the client during playback, the replay will be unaffected by this.

Getting this right is a prerequisite to being able to have free reign over replay playback, including adjusting speed and seeking (something I plan on working on over the next couple of days), so it is imperative that we get this right.

Unfortunately I don’t have much to show from this work. I have managed to speed up replay playback to up to 50x with no errors, but as the audio track is not synced, it would not make for a good video. Hopefully things will be ready to share tomorrow!

Other things

  • Menu music and welcome/goodbye voices can now be toggled as expected #634.
  • Configuration settings which were (in osu-stable) 0..100 or -100..100 ranges have been switched to float 0..1 or -1..1 ranges #658.
  • Project READMEs received some minor updates #671

New release available

2017.425.0 is now available from github releases (or via auto-update if you already have lazer installed)! Contains everything from previous days, but not the stuff mentioned above; isn’t reviewed yet.