Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
timiyay opened this issue Sep 23, 2022 · 6 comments

Comments

@timiyay
Copy link

timiyay commented Sep 23, 2022

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.

@samme
Copy link
Collaborator

samme commented Sep 23, 2022

I think I have a branch for this.

samme added a commit that referenced this issue Sep 23, 2022
@samme
Copy link
Collaborator

samme commented Sep 23, 2022

Fixed in dde4ef2

@samme samme closed this as completed Sep 23, 2022
@timiyay
Copy link
Author

timiyay commented Sep 26, 2022

Thanks! 🙇

@timiyay
Copy link
Author

timiyay commented Dec 6, 2022

Hi @samme thanks again for the fix for this issue.

Do you have any plans to release it in the near future? It's still affecting us so we may need to consider a fork, or depending directly on this Github repo, in the meantime.

@samme
Copy link
Collaborator

samme commented Dec 6, 2022

I'll make a release soon.

@timiyay
Copy link
Author

timiyay commented Dec 6, 2022

Thanks @samme 🙇

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants