From 842c60fbd30029e87e263e2b99042fe787ba54aa Mon Sep 17 00:00:00 2001 From: Richard Davey Date: Wed, 12 Apr 2023 18:50:20 +0100 Subject: [PATCH] Updated change log --- changelog/3.60/Animation.md | 2 +- changelog/3.60/ArcadePhysics.md | 2 + changelog/3.60/BitmapTextGameObject.md | 2 + changelog/3.60/Build.md | 2 + changelog/3.60/CHANGELOG-v3.60.md | 25 ++++++------ changelog/3.60/Camera.md | 2 + changelog/3.60/CanvasRenderer.md | 4 +- changelog/3.60/Colors.md | 2 + changelog/3.60/CompressedTextures.md | 2 + changelog/3.60/Container.md | 5 +-- changelog/3.60/DynamicTextures.md | 2 + changelog/3.60/ESMSupport.md | 2 + changelog/3.60/FX.md | 30 ++++++++------- changelog/3.60/Game.md | 2 + changelog/3.60/GameObject.md | 2 + changelog/3.60/Geometry.md | 2 + changelog/3.60/GraphicsGameObject.md | 7 +--- changelog/3.60/Input.md | 2 + changelog/3.60/Loader.md | 2 + changelog/3.60/Masks.md | 2 + changelog/3.60/MatterPhysics.md | 2 + changelog/3.60/Mesh.md | 5 +-- changelog/3.60/MobilePerformance.md | 51 +++++++++++++++++++++++++ changelog/3.60/NineSliceGameObject.md | 2 + changelog/3.60/ParticleEmitter.md | 2 + changelog/3.60/PlaneGameObject.md | 2 + changelog/3.60/ScaleManager.md | 3 +- changelog/3.60/Scene.md | 2 + changelog/3.60/Sound.md | 2 + changelog/3.60/SpatialSound.md | 2 + changelog/3.60/Spector.md | 2 + changelog/3.60/Spine3.md | 2 + changelog/3.60/Spine4.md | 2 + changelog/3.60/TextGameObject.md | 2 + changelog/3.60/TextureManager.md | 2 + changelog/3.60/Tilemap.md | 2 + changelog/3.60/Timeline.md | 2 + changelog/3.60/Timestep.md | 2 + changelog/3.60/TweenManager.md | 2 + changelog/3.60/Utils.md | 2 + changelog/3.60/VideoGameObject.md | 12 +++--- changelog/3.60/WebGLRenderer.md | 6 +-- changelog/3.60/images/perf1.png | Bin 0 -> 37029 bytes changelog/3.60/images/perf2.png | Bin 0 -> 48164 bytes 44 files changed, 162 insertions(+), 50 deletions(-) create mode 100644 changelog/3.60/MobilePerformance.md create mode 100644 changelog/3.60/images/perf1.png create mode 100644 changelog/3.60/images/perf2.png diff --git a/changelog/3.60/Animation.md b/changelog/3.60/Animation.md index 1590a739d1..23d021661e 100644 --- a/changelog/3.60/Animation.md +++ b/changelog/3.60/Animation.md @@ -24,4 +24,4 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). Return to the [Change Log index](CHANGELOG-v3.60.md). -📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser). +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/ArcadePhysics.md b/changelog/3.60/ArcadePhysics.md index 65834e2a02..ea5ec0098c 100644 --- a/changelog/3.60/ArcadePhysics.md +++ b/changelog/3.60/ArcadePhysics.md @@ -24,3 +24,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/BitmapTextGameObject.md b/changelog/3.60/BitmapTextGameObject.md index adac58d253..c0d5e2fafb 100644 --- a/changelog/3.60/BitmapTextGameObject.md +++ b/changelog/3.60/BitmapTextGameObject.md @@ -20,3 +20,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Build.md b/changelog/3.60/Build.md index e76c3e7a9b..595d82feae 100644 --- a/changelog/3.60/Build.md +++ b/changelog/3.60/Build.md @@ -22,3 +22,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/CHANGELOG-v3.60.md b/changelog/3.60/CHANGELOG-v3.60.md index 795c836a91..069d2f0232 100644 --- a/changelog/3.60/CHANGELOG-v3.60.md +++ b/changelog/3.60/CHANGELOG-v3.60.md @@ -6,24 +6,24 @@ This should make it easier for you to browse the changes and find the informatio ## New Features -These are the headliner new features in this release: +These are the headliner features in this release: -* [Built-in Spector JS](Spector.md) for WebGL debugging on desktop and mobile -* New and improved [Video Game Object](VideoGameObject.md) -* New [Timeline Sequencer](Timeline.md) -* [ESM Module Support](ESMSupport.md) -* Built-in [Special FX](FX.md) including Bloom, Blur, Distort and more -* Support for [Spatial Audio](SpatialSound.md) -* New [Spine 4 Plugin](Spine4.md) +* 14 bundled [Special FX](FX.md) including Bloom, Blur, Distort and more +* Vastly improved [Mobile Rendering Performance](MobilePerformance.md) - our fastest release ever +* New [Timeline Sequencer](Timeline.md) for creating complex flows of events * New [Plane Game Object](PlaneGameObject.md) for perspective distortions * New [Nine Slice Game Object](NineSliceGameObject.md) for perfect UI scaling -* Support for [Compressed Textures](CompressedTextures.md) -* Brand new [Particle Emitter](ParticleEmitter.md) system with loads of new features +* [Built-in Spector JS](Spector.md) for WebGL debugging on desktop and mobile +* Brand new [Video Game Object](VideoGameObject.md) for videos and media streams +* Brand new [Particle Emitter](ParticleEmitter.md) with stacks of new features +* Support for [Spatial Audio](SpatialSound.md) and distance based volume +* New [Spine 4 Plugin](Spine4.md) * Upgraded to [Matter Physics v0.19](MatterPhysics.md) * New [Tween Manager](TweenManager.md) for better performance and memory management * New [Dynamic Textures](DynamicTextures.md) for rendering to textures at runtime -* Vastly improved [WebGL Renderer](WebGLRenderer.md) mobile performance and other updates and pipeline changes * New [TimeStep features and Timer Event Updates](Timestep.md) for enforcing fps rates and more +* Support for [Compressed Textures](CompressedTextures.md) +* [ESM Module Support](ESMSupport.md) ## System and Plugins @@ -34,6 +34,7 @@ Pick any of the following sections to see the breaking changes, new features, up * [Bitmap and Geometry Masks](Masks.md) * [Camera System](Camera.md) * [Canvas Renderer](CanvasRenderer.md) +* [WebGL Renderer](WebGLRenderer.md) * [Colors and Display](Colors.md) * [Game, Device and Game Config](Game.md) * [Geometry, Paths and Curves](Geometry.md) @@ -80,3 +81,5 @@ My thanks to the following for helping with the Phaser 3 Examples, Beta Testing, | @VanaMartin | @vforsh | @Vidminas | @x-wk | | @xmahle | @xuxucode | @YeloPartyHat | @ZekeLu | | FromChris | Golen | OmniOwl | and you ... | + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Camera.md b/changelog/3.60/Camera.md index 9b52fdbc83..a01cd75a32 100644 --- a/changelog/3.60/Camera.md +++ b/changelog/3.60/Camera.md @@ -25,3 +25,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/CanvasRenderer.md b/changelog/3.60/CanvasRenderer.md index 0a58ff7af1..2b6363d603 100644 --- a/changelog/3.60/CanvasRenderer.md +++ b/changelog/3.60/CanvasRenderer.md @@ -2,8 +2,6 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). -## Canvas Renderer New Features - ## Canvas Renderer Updates * `BlitterCanvasRenderer` will now skip the `drawImage` call in canvas if the frame width or height are zero. @@ -20,3 +18,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Colors.md b/changelog/3.60/Colors.md index d9a4b99582..67d095c53c 100644 --- a/changelog/3.60/Colors.md +++ b/changelog/3.60/Colors.md @@ -26,3 +26,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/CompressedTextures.md b/changelog/3.60/CompressedTextures.md index bec414e1f3..ca7e7247b7 100644 --- a/changelog/3.60/CompressedTextures.md +++ b/changelog/3.60/CompressedTextures.md @@ -21,3 +21,5 @@ Compressed Textures are loaded using the new `this.load.texture` method, which t --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Container.md b/changelog/3.60/Container.md index 6e893461a4..07db6ec0b6 100644 --- a/changelog/3.60/Container.md +++ b/changelog/3.60/Container.md @@ -2,9 +2,6 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). -## Container New Features - - ## Container Updates * `Container.addHandler` will now call `GameObject.addedToScene`. @@ -22,3 +19,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/DynamicTextures.md b/changelog/3.60/DynamicTextures.md index 45753d6cb1..5d8d43279e 100644 --- a/changelog/3.60/DynamicTextures.md +++ b/changelog/3.60/DynamicTextures.md @@ -76,3 +76,5 @@ You should use a Render Texture if you need to display the texture in-game on a --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/ESMSupport.md b/changelog/3.60/ESMSupport.md index f765695d19..708ae5bc75 100644 --- a/changelog/3.60/ESMSupport.md +++ b/changelog/3.60/ESMSupport.md @@ -44,3 +44,5 @@ Because the Webpack feature is experimental we won't make the ESM version the de --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/FX.md b/changelog/3.60/FX.md index e08b89ac68..ce52793c6e 100644 --- a/changelog/3.60/FX.md +++ b/changelog/3.60/FX.md @@ -8,20 +8,20 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). We have decided to bundle a selection of highly flexible special effect shaders in to Phaser 3.60 and provide access to them via an easy to use set of API calls. The FX included are: -* Barrel - A nice pinch / bulge distortion effect. -* Bloom - Add bloom to any Game Object, with custom offset, blur strength, steps and color. -* Blur - 3 different levels of gaussian blur (low, medium and high) and custom distance and color. -* Bokeh / TiltShift - A bokeh and tiltshift effect, with intensity, contrast and distance settings. -* Circle - Add a circular ring around any Game Object, useful for masking / avatar frames, with custom color, width and background color. -* ColorMatrix - Add a ColorMatrix to any Game Object with access to all of its methods, such as `sepia`, `greyscale`, `lsd` and lots more. -* Displacement - Use a displacement texture, such as a noise texture, to drastically (or subtly!) alter the appearance of a Game Object. -* Glow - Add a smooth inner or outer glow, with custom distance, strength and color. -* Gradient - Draw a gradient between two colors across any Game Object, with optional 'chunky' mode for classic retro style games. -* Pixelate - Make any Game Object appear pixelated, to a varying degree. -* Shadow - Add a drop shadow behind a Game Object, with custom depth and color. -* Shine - Run a 'shine' effect across a Game Object, either additively or as part of a reveal. -* Vignette - Apply a vignette around a Game Object, with custom offset position, radius and color. -* Wipe - Set a Game Object to 'wipe' or 'reveal' with custom line width, direction and axis of the effect. +* **Barrel** - A nice pinch / bulge distortion effect. +* **Bloom** - Add bloom to any Game Object, with custom offset, blur strength, steps and color. +* **Blur** - 3 different levels of gaussian blur (low, medium and high) and custom distance and color. +* **Bokeh** / TiltShift - A bokeh and tiltshift effect, with intensity, contrast and distance settings. +* **Circle** - Add a circular ring around any Game Object, useful for masking / avatar frames, with custom color, width and background color. +* **ColorMatrix** - Add a ColorMatrix to any Game Object with access to all of its methods, such as `sepia`, `greyscale`, `lsd` and lots more. +* **Displacement** - Use a displacement texture, such as a noise texture, to drastically (or subtly!) alter the appearance of a Game Object. +* **Glow** - Add a smooth inner or outer glow, with custom distance, strength and color. +* **Gradient** - Draw a gradient between two colors across any Game Object, with optional 'chunky' mode for classic retro style games. +* **Pixelate** - Make any Game Object appear pixelated, to a varying degree. +* **Shadow** - Add a drop shadow behind a Game Object, with custom depth and color. +* **Shine** - Run a 'shine' effect across a Game Object, either additively or as part of a reveal. +* **Vignette** - Apply a vignette around a Game Object, with custom offset position, radius and color. +* **Wipe** - Set a Game Object to 'wipe' or 'reveal' with custom line width, direction and axis of the effect. What's more, the FX can be stacked up. You could add, for example, a `Barrel` followed by a `Blur` and then topped-off with a `Circle` effect. Just by adjusting the ordering you can achieve some incredible and unique effects, very quickly. @@ -128,3 +128,5 @@ Available to all Game Objects: --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Game.md b/changelog/3.60/Game.md index 2c23167733..9ff249c77b 100644 --- a/changelog/3.60/Game.md +++ b/changelog/3.60/Game.md @@ -29,3 +29,5 @@ ArtemSiz) --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/GameObject.md b/changelog/3.60/GameObject.md index 1b4ccbcd49..b65ff81eb1 100644 --- a/changelog/3.60/GameObject.md +++ b/changelog/3.60/GameObject.md @@ -58,3 +58,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Geometry.md b/changelog/3.60/Geometry.md index a93b945f64..369b522f15 100644 --- a/changelog/3.60/Geometry.md +++ b/changelog/3.60/Geometry.md @@ -30,3 +30,5 @@ The following are API-breaking, in that a new optional parameter has been insert --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/GraphicsGameObject.md b/changelog/3.60/GraphicsGameObject.md index 393a70caa6..a20f0b7912 100644 --- a/changelog/3.60/GraphicsGameObject.md +++ b/changelog/3.60/GraphicsGameObject.md @@ -7,11 +7,6 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). * The `Graphics.strokeRoundedRect` and `fillRoundedRect` methods can now accept negative values for the corner radius settings, in which case a concave corner is drawn instead (thanks @rexrainbow) * Earcut has been updated to version 2.2.4. This release improves performance by 10-15% and fixes 2 rare race conditions that could leave to infinite loops. Earcut is used internally by Graphics and Shape game objects when triangulating polygons for complex shapes. - -## Graphics Game Object Updates - - - ## Graphics Game Object Bug Fixes * `Graphics.strokeRoundedRect` would incorrectly draw the rectangle if you passed in a radius greater than half of the smaller side. This is now clamped internally (thanks @temajm) @@ -19,3 +14,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Input.md b/changelog/3.60/Input.md index fdd1b58983..5b771f71f3 100644 --- a/changelog/3.60/Input.md +++ b/changelog/3.60/Input.md @@ -40,3 +40,5 @@ There are breaking changes from previous versions of Phaser. --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Loader.md b/changelog/3.60/Loader.md index 87fc9d646b..f4157f86f0 100644 --- a/changelog/3.60/Loader.md +++ b/changelog/3.60/Loader.md @@ -27,3 +27,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Masks.md b/changelog/3.60/Masks.md index 6d82b80013..9c79b25d94 100644 --- a/changelog/3.60/Masks.md +++ b/changelog/3.60/Masks.md @@ -33,3 +33,5 @@ There are breaking changes from previous versions of Phaser. --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/MatterPhysics.md b/changelog/3.60/MatterPhysics.md index 37c6c5b043..ccf62b3927 100644 --- a/changelog/3.60/MatterPhysics.md +++ b/changelog/3.60/MatterPhysics.md @@ -75,3 +75,5 @@ Because of the changes above, the following new methods are available to any Pha --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Mesh.md b/changelog/3.60/Mesh.md index 3ea9ac46d9..32034fa95c 100644 --- a/changelog/3.60/Mesh.md +++ b/changelog/3.60/Mesh.md @@ -18,9 +18,8 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). * `Mesh.addVertices` will now throw a console warning if invalid vertices data is given to the method (thanks @omniowl) * `Mesh.addVerticesFromObj` will now throw a console warning if invalid vertices data is given to the method (thanks @omniowl) -## Mesh, Vertex and Face Bug Fixes - - --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/MobilePerformance.md b/changelog/3.60/MobilePerformance.md new file mode 100644 index 0000000000..4545d39914 --- /dev/null +++ b/changelog/3.60/MobilePerformance.md @@ -0,0 +1,51 @@ +# Phaser 3.60.0 Change Log + +Return to the [Change Log index](CHANGELOG-v3.60.md). + +## New Feature - Vastly Improved Mobile WebGL Performance + +We went right back to the drawing board with regard to the performance of Phaser 3.60 on mobile devices. After weeks of debugging and testing across a variety of hardware it led us to the conclusion that the renderer was being tripped up by the GPU blocking process that is `bufferSubData`. This, combined with the cost of the multi-texture shader we had, was utterly tanking mobile performance. + +So we changed the approach the WebGL Pipelines took with regard to handling textures and moved to a hybrid batch system, similar to the way it worked in 3.22 but with all of the improvements we had made since then. And lo and behold, things got real, real fast! + +The new v3.60 approach uses one single-bound texture and the new Mobile Pipeline and also does away with the enforced 16-texture limit. As a result, this stopped all of the sub-data buffering, removing the blocking process from the rendering step and also allowing for any number of textures internally. We got rid of lots of texture assignment and comparison code from the game step and the results speak for themselves: + +![Mobile Performance](images/perf1.png) + +In the chart above we tested a batching demo across multiple hardware devices and 3 different versions of Phaser. We kept adding to the test until it could no longer maintain 60fps in the browser. This gave us the maximum quantity of texture binds the device could handle for that version. + +As you can imagine, the higher the number, the better. + +For iOS hardware, the chart above speaks volumes. On an iPhone SE, for example, Phaser v3.24 could handle 5,248 texture binds at 60 fps. This dropped dramatically to just 192 texture binds under v3.50. But the 3.60 version? 15,104 texture binds at a rock solid 60 fps. + +**We saw a 187% increase from v3.24 and a 7,766% increase over v3.55.** That's a dramatic improvement, and I'm sure you can agree. + +It's important to understand what is being shown here. This isn't a test to see how many sprites we can draw. It's a test to see how many _texture binds_ and draw calls WebGL can handle under the new pipelines. The higher the number, the better. + +For example, in an actual game, you may have a sprite sheet for your player in one PNG and then another for some enemies in a different PNG. Those are 2 unique texture binds. They may contain hundreds of frames in total, but as far as WebGL is concerned, it's all part of the same underlying texture. As the renderer flows through the display list, it can see that a different texture is being used, so it binds and activates the new one, allowing the shader to draw the vertices using the correct texture. This is why using texture atlases is so important. The more on-screen objects that share an atlas, the less texture binds and draws that take place. + +With Phaser v3.50 we introduced multi-texture batching. This allowed us to batch together typically 16 unique textures and then draw them all in a single draw call. The total depends on the GPU and device, but the WebGL spec guarantees at least 8 unique textures and most GPUs allow for 16 or 32. The problem was that when we introduced this feature, it caused a lot of data buffering to take place, which on some GPUs, is a blocking process. You could see this most clearly on iOS, where the frame rate would tank with just a few textures being used. + +Previously, Phaser v3.24 (and earlier) took a different approach. Here, it would only ever bind 1 single texture (texture unit zero), and it would also batch together all of the vertex data. Using a series of internal arrays and objects allowed it to flow through bunches of 16 textures, activating them and drawing as required. This resulted in lots of draw calls but minimal data buffering. As it turns out, mobile GPUs really like this approach, whereas desktop does not. + +The new Multi Pipeline is faster on desktop as well, too: + +![Desktop Performance](images/perf2.png) + +Here we can see the same test on an M1 iMac and a Windows 11 PC running an NVIDIA RTX 3080 Ti, both powerful bits of kit but by no means 'cutting edge' any longer. On Chrome on the PC, you can see that v3.24 managed 14,336 textures at 60 fps. This improved to 32,000 under v3.55 but on v3.60 we get 35,072. The story is similar, although a lot slower (as always) in Firefox, which suffers from a less optimized WebGL implementation than Chrome. + +On the iMac, Phaser v3.24 rocked along nicely at 15,872 textures at 60 fps. Dropping to a paltry 2,560 under v3.55 and increasing to an astonishing 42,240 texture binds under v3.60. If you don't need to maintain 60 fps (i.e., for a much more static puzzle game), then you can push this even higher. M1s really are a beast. + +Desktop GPUs, in most cases, had a real improvement from v3.24 to v3.55. But the improvements in v3.60 push it even further, while also improving mobile speed no-end. That's a win-win for everyone. + +Will you ever actually need 42,240 unique texture swaps per frame for your game? Well, it's doubtful. You should really be using texture atlases and minimizing the amount of swapping going on. Yet it's nice to know that this power is there, under the hood, should you require it. + +Phaser will check to see if the device is iOS or Android and invoke the new Mobile Pipeline automatically. You can control this by using the game config. You can now also set the default WebGL Pipeline which all Game Objects will be assigned via the new config flag. If this value is set, it overrides the automatic mobile detection, allowing you to have much more fine-grained control over which devices are considered mobile or not. + +So, if you want thousands of sprites blasting around you game - go for it! + +--------------------------------------- + +Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/NineSliceGameObject.md b/changelog/3.60/NineSliceGameObject.md index c7b4f3eddf..4b57082444 100644 --- a/changelog/3.60/NineSliceGameObject.md +++ b/changelog/3.60/NineSliceGameObject.md @@ -63,3 +63,5 @@ As of Phaser 3.60 this Game Object is WebGL only. Please see the new examples an --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/ParticleEmitter.md b/changelog/3.60/ParticleEmitter.md index 50fdb1adb0..16c773a6f3 100644 --- a/changelog/3.60/ParticleEmitter.md +++ b/changelog/3.60/ParticleEmitter.md @@ -457,3 +457,5 @@ Another potentially breaking change is the removal of two internal private count --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/PlaneGameObject.md b/changelog/3.60/PlaneGameObject.md index 12b7c27c70..68827b3c01 100644 --- a/changelog/3.60/PlaneGameObject.md +++ b/changelog/3.60/PlaneGameObject.md @@ -21,3 +21,5 @@ As of Phaser 3.60 this Game Object is WebGL only. Please see the new examples an --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/ScaleManager.md b/changelog/3.60/ScaleManager.md index 4d25374d7e..5fd74d88d5 100644 --- a/changelog/3.60/ScaleManager.md +++ b/changelog/3.60/ScaleManager.md @@ -10,7 +10,6 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). * `ScaleManager.listeners` has been renamed to `domlisteners` to avoid conflicting with the EventEmitter listeners object. Fix #6260 (thanks @x-wk) - ## Scale Manager Bug Fixes * `ScaleManager.getParentBounds` will now also check to see if the canvas bounds have changed x or y position, and if so return `true`, causing the Scale Manager to refresh all of its internal cached values. This fixes an issue where the canvas may have changed position on the page, but not its width or height, so a refresh wasn't triggered. Fix #5884 (thanks @jameswilddev) @@ -19,3 +18,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Scene.md b/changelog/3.60/Scene.md index e6239f2e1e..5ba4adb894 100644 --- a/changelog/3.60/Scene.md +++ b/changelog/3.60/Scene.md @@ -30,3 +30,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Sound.md b/changelog/3.60/Sound.md index b2f54517e7..619ec9358d 100644 --- a/changelog/3.60/Sound.md +++ b/changelog/3.60/Sound.md @@ -26,3 +26,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/SpatialSound.md b/changelog/3.60/SpatialSound.md index d97b22ab5f..111af77cc8 100644 --- a/changelog/3.60/SpatialSound.md +++ b/changelog/3.60/SpatialSound.md @@ -50,3 +50,5 @@ This allows you to create a 3D sound environment in your game. The following new --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Spector.md b/changelog/3.60/Spector.md index d5346973dd..337ca95fac 100644 --- a/changelog/3.60/Spector.md +++ b/changelog/3.60/Spector.md @@ -24,3 +24,5 @@ You can call the following functions from your game code to control Spector: --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Spine3.md b/changelog/3.60/Spine3.md index ab595f36f9..5f955349a3 100644 --- a/changelog/3.60/Spine3.md +++ b/changelog/3.60/Spine3.md @@ -14,3 +14,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Spine4.md b/changelog/3.60/Spine4.md index c0940e2d05..c03f321cd8 100644 --- a/changelog/3.60/Spine4.md +++ b/changelog/3.60/Spine4.md @@ -22,3 +22,5 @@ We will maintain both the Spine 3 and 4 plugins for the forseeable future. --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/TextGameObject.md b/changelog/3.60/TextGameObject.md index e79c16a80a..158b5c64c7 100644 --- a/changelog/3.60/TextGameObject.md +++ b/changelog/3.60/TextGameObject.md @@ -19,3 +19,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/TextureManager.md b/changelog/3.60/TextureManager.md index 7d5e2bc661..5e66683859 100644 --- a/changelog/3.60/TextureManager.md +++ b/changelog/3.60/TextureManager.md @@ -34,3 +34,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Tilemap.md b/changelog/3.60/Tilemap.md index 1ac7fc6a13..35788c865d 100644 --- a/changelog/3.60/Tilemap.md +++ b/changelog/3.60/Tilemap.md @@ -49,3 +49,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Timeline.md b/changelog/3.60/Timeline.md index cc606c6ac5..e55e3d3849 100644 --- a/changelog/3.60/Timeline.md +++ b/changelog/3.60/Timeline.md @@ -71,3 +71,5 @@ There are lots of options available to you via the configuration object. See the --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Timestep.md b/changelog/3.60/Timestep.md index 78fff3f69b..4ac5690504 100644 --- a/changelog/3.60/Timestep.md +++ b/changelog/3.60/Timestep.md @@ -41,3 +41,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/TweenManager.md b/changelog/3.60/TweenManager.md index db5a886661..871afa3605 100644 --- a/changelog/3.60/TweenManager.md +++ b/changelog/3.60/TweenManager.md @@ -67,3 +67,5 @@ The following are further updates within the Tween system: --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/Utils.md b/changelog/3.60/Utils.md index 9e3d563ab4..d65fe7a28c 100644 --- a/changelog/3.60/Utils.md +++ b/changelog/3.60/Utils.md @@ -34,3 +34,5 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/VideoGameObject.md b/changelog/3.60/VideoGameObject.md index 055d5faecd..e2f0a1b3ea 100644 --- a/changelog/3.60/VideoGameObject.md +++ b/changelog/3.60/VideoGameObject.md @@ -8,8 +8,6 @@ The Video Game Object has been fully recoded in v3.60. Previously, it had issues ![Video Game Object](images/videogameobject.png) -### New Features: - * The Video Game Object now has a much better method of handling user-interaction unlocking. We can detect for input locking by seeing if the Play Promise fails. If it does, we use the `retryInterval` and then try to play the video again. This continues until input is unlocked. This can happen via a tap, click or key press. The Video Game Object itself never needs to listen for this, it just needs to wait for a success Play Promise resolution. * Use the new `VIDEO_LOCKED` event to know if the video is playback locked due to needing input. * Previously, the Video Game Object would use the `preUpdate` method to check how far along the video was and then update the source texture. This is now all handled by the Request Video Frame callback, which is only invoked when a video frame is ready. This makes the Video Game Object much more efficient as it will only ever update the source texture when a new frame is decoded by the browser. @@ -22,7 +20,7 @@ The Video Game Object has been fully recoded in v3.60. Previously, it had issues * `Video.loadURL` has a new optional parameter `crossOrigin`. This allows you to specify a cross origin request type when loading the video cross-domain (thanks @rmartell) * The `Video` config will now detect for `x-m4v` playback support for video formats and store it in the `Video.m4v` property. This is used automatically by the `VideoFile` file loader. Fix #5719 (thanks @patrickkeenan) -### Breaking Changes: +## Video Game Object Breaking Changes * There `loadEvent` parameter when loading a video has been removed. * There 'asBlob' parameter when loading a video has been removed. @@ -56,7 +54,7 @@ this.load.video('wormhole', 'wormhole.mp4', true); * The `VIDEO_TIMEOUT` event has been removed. * The `Video.removeVideoElementOnDestroy` property has been removed. The Video Element is now always removed when the Video Game Object is destroyed. -### New Methods: +### Video Game Object New Methods * `Video.load` is a new method that loads a video from the Video Cache, ready for playback with the `Video.play` method. * `Video.addLoadEventHandlers` is a new method that adds the loader specific event handlers to the video element. @@ -68,7 +66,7 @@ this.load.video('wormhole', 'wormhole.mp4', true); * `Video.playError` is a new internal method that is called automatically if the playback Promise errors. * `Video.stalledHandler` is a new method that is called if a video stalls, for whatever reason. -### New Properties: +### Video Game Object New Properties * `Video.frameReady` is a new property that lets you know if the texture has been created and populated with the first frame of the video, or not. * `Video.isStalled` is a new read-only property that lets you know if the video is currently stalled or not. This is useful for detecting if the video is buffering or not. @@ -77,7 +75,7 @@ this.load.video('wormhole', 'wormhole.mp4', true); * `Video.cacheKey` is a new property that contains the key of the curreng video if it came from the Video Cache, otherwise it's empty. * `Video.isSeeking` is a new read-only property that lets you know if the video is currently seeking or not. -### Fixed Bugs: +## Video Game Object Bug Fixes * Video RTC was not reliably working. Fix #6130 (thanks @mshopf) * If you switched tabs, then return to your game, a completed video would start playing again. It now remains stopped. Fix #5873 (thanks @marcusx2) @@ -90,3 +88,5 @@ this.load.video('wormhole', 'wormhole.mp4', true); --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/WebGLRenderer.md b/changelog/3.60/WebGLRenderer.md index 609885600b..0bfc92d9f1 100644 --- a/changelog/3.60/WebGLRenderer.md +++ b/changelog/3.60/WebGLRenderer.md @@ -2,10 +2,6 @@ Return to the [Change Log index](CHANGELOG-v3.60.md). -## New Feature - Vastly Improved Mobile Performance and WebGL Pipeline Changes - -TODO - ## WebGL Renderer Updates Due to all of the changes with how WebGL texture batching works a lot of mostly internal methods and properties have been removed. This is the complete list: @@ -113,3 +109,5 @@ In order to add clarity in the codebase we have created a new `PostPipeline` Com --------------------------------------- Return to the [Change Log index](CHANGELOG-v3.60.md). + +📖 Read the [Phaser 3 API Docs](https://newdocs.phaser.io/) 💻 Browse 2000+ [Code Examples](https://labs.phaser.io) 🤝 Join the awesome [Phaser Discord](https://discord.gg/phaser) diff --git a/changelog/3.60/images/perf1.png b/changelog/3.60/images/perf1.png new file mode 100644 index 0000000000000000000000000000000000000000..6cea3abb365100c34634a08a67aec95b5b6a5c6e GIT binary patch literal 37029 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 PhfMyM%F$F=lPmuNGvS3O literal 0 HcmV?d00001 diff --git a/changelog/3.60/images/perf2.png b/changelog/3.60/images/perf2.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5452f13e2174a3d5636767ac1e922566db5c8d GIT binary patch literal 48164 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