GameMaker: Studio doesn't actually render most things to the screen directly, but instead it renders them to the application surface. This is essentially a surface, just like any that you can make yourself using the surface functions, and as such can be manipulated with the surface functions, drawn to, sent to shaders and anything else that you would normally do with surface are also applicable to this.
NOTE: The only thing you cannot do with the application surface is free it. It always exists, although the index value to access it may change.
When you run your game, this surface is created the first time that the draw event is called in each new room that you enter, which means that nothing is drawn until that point. However, you can still get the application surface position and resize it in the CreateEvent or any other event without getting any errors and the values used will be relevant to the surface when it is created. The actual sequence of events is as follows:
- Pre-draw event
- --- > application surface created and render target set
- For each visible view, or, if no views are active, once
Draw begin event
Draw end event
- --- > the application surface target is reset here
- Post draw event
- --- > the application surface is now drawn to the back buffer by default (although you can switch this off)
- Draw GUI begin event
- Draw GUI event
- Draw GUI end event
The use of this surface means that you can easily create
incredible transitions using shaders, or take the screen and wrap
it around a 3D form, or simply scale a low-res game up to any
resolution screen... The possibilities are endless!
To access this surface, you need to use the built-in global variable application_surface which is explained on the following page:
You also have a couple of specialist functions that are designed only for use with the application surface: