Skip to content

RenderTexture can crash if games are created and destroyed in quick succession. #729

@timiyay

Description

@timiyay

This Issue is about

function newGame() {
  return new Phaser.Game({
    state: {
      create() {
        this.game.make.renderTexture()
      }
    }
  })
}

let game = newGame()
game.destroy()
game = newGame()
  • What should happen: the 2nd instantiation of the game should not crash, and should be able to create a RenderTexture
  • What happens instead: the code crashes
  • If there's an error:
    • What's the error message? Uncaught TypeError: Cannot read properties of null (reading 'type')
    • What's the error trace (expand the error message)?
      crash

Crash occurs at https://github.com/photonstorm/phaser-ce/blob/1af938320a72ebc0cfbd9cc9101fcf1bf17d9808/src/gameobjects/RenderTexture.js#L86

Background

We're using a NextJS/React client to run some Phaser games. We're using React's effects inside functional components, since the rendering of a Phaser game is considered a side effect outside of React's control. In development, React has a Strict Mode that will cause these effects to double-render these functional components, in order to help devs identify unintentional side effects in their code

This means our Phaser games are being created, very quickly destroyed, then created again. Some of our games use RenderTexture, which isn't resilient to these quick create/destroy/create cycles.

The issue appears to stem from RenderTexture's reliance on global state; specifically, PIXI.defaultRenderer.

https://github.com/photonstorm/phaser-ce/blob/1af938320a72ebc0cfbd9cc9101fcf1bf17d9808/src/core/Game.js#L1279

I think what's happening is Phaser.Game#destroy will set PIXI.defaultRenderer to null, which causes a race condition where the 2nd game's renderer may or may not be null.

I am happy to contribute a PR, once folks have a chance to triage and comment on the issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions