2017 05 08

published 08 May 2017

Been quite a bit going on, even though I missed a post on Friday. Let’s catch up!

Mod overlay

Building on some work by Evast, we now have an in-game overlay showing currently enabled mods. Here’s an example of how it looks:

With this came some further refactoring to the way mod icons are displayed to make it easier to reuse them in the future.

Other things

  • The osu! window now defaults to a higher frame rate when inactive (30 -> 60). This should provide a smoother feeling experience even when the window isn’t focused #694.
  • Fix mod selection accepting escape when it shouldn’t (after entering play mode with it still open) #723.
  • The cursor trail should now look smoother than ever before, thanks to WebFreak001’s work #717.

New release available

2017.508.0 is now available from github releases (or via auto-update if you already have lazer installed)! Contains everything from the last couple of days.

p.s. there should be a pretty big announcement tomorrow, so keep an eye on the osu! news feeds.


2017 05 04

published 04 May 2017

Further performance optimisations

Falling down the rabbit hole of optimising, I found and fixed a few hot paths in the code (involving texture lookups and loading) to improve overall performance and reduce potential stuttering. Got a few more areas that I have identified as issues, but solutions will take a bit longer to implement. More on that in coming posts.

Options refactor

Until now, there has been no central display container for UI controls within the options menu. Each different control type (checkbox, sliderbar, dropdown etc.) had their own implementation. While this looked fine from the outside, it meant that we couldn’t easily implement, for instance, the yellow revert-to-defaults glow that you are likely familiar with on osu-stable.

So I spent some time today getting everything in shape, to give options even more power and pave the way for adding searchability and more extensive tooltips to them.

No release today!

Waiting on further review and merging before I push another build out.


2017 05 03

published 03 May 2017

Latency testing

I took a step back today after implementing frame limiter options to test the current render pipeline, ensuring we weren’t making any mistakes which could lead to unnecessary input-output latency.

The results were actually quite pleasantly surprising. With a simple tweak to vsync (forcing a gl pipeline flush after swapbuffer), we are actually in a very very good position! Not only can the framework push 5-10k frames per second, it looks like it is performing very well at lower frame limits too.

White cursor is native windows, black cursor is osu!. We are running full screen (exclusive) of course.

A few things to note and explore:

We are exactly one frame behind the windows cursor with vsync turned on. This is to be expected, as we are double-buffering at this point. It is also the absolute best result with vsync turned on. For most users this will be an excellent option which avoid visual tearing that can break mania and taiko badly.

Furthermore, in both of the non-vsync scenarios, the osu! cursor is actually updated at a higher rate than the windows cursor! You can clearly see that the osu! cursor is always in front in both of these tests. Not only that, but it looks like increasing the limiters beyond the (currently) lowest available setting has no noticeable effect. This is due to input also being threaded and polled separately to both the draw and update loops.

Comparing to the current stable osu!, this means huge improvements in every way. Needless to say, I’m very happy with these results. We will of course be supporting newer vsync technologies before release (gsync/freesync).

Other things

  • A option to show FPS is now available. This currently just reveals the framework-level fps counter (which could previously be toggled using Ctrl+F11), but will be replaced in the future with a skinned/simplified version.
  • Work has started on the osu!mania ruleset in lazer. Expect to see some progress on that very soon.
  • The spring fanart contest winners’ backgrounds are now on stable! Go check them out, they look amazing. Keep in mind that if you’re a supporter you will need to disable any custom background you have set in order to see them.
  • osu!catch world cup registrations are open! Go check out the rules and register if that’s something that interests you :).

New release available

2017.503.0 is now available from github releases (or via auto-update if you already have lazer installed)! Contains everything from the last couple of days.


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.