From bc19cbd52507b68baf6e260cb911a129dafe9dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=A9grier?= Date: Wed, 26 May 2021 11:57:57 +0200 Subject: [PATCH] Moving Physics optim to DirtyScene The Physics engine is now disabled only if no sprites are moving (if they have no velocity). Also, if a sprite is moving (if it has a velocity), the dirty state is set. --- front/src/Phaser/Game/DirtyScene.ts | 22 ++++++++++++++++++++++ front/src/Phaser/Game/GameScene.ts | 16 ---------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/front/src/Phaser/Game/DirtyScene.ts b/front/src/Phaser/Game/DirtyScene.ts index e44ce07b..2e94aa66 100644 --- a/front/src/Phaser/Game/DirtyScene.ts +++ b/front/src/Phaser/Game/DirtyScene.ts @@ -12,6 +12,7 @@ export abstract class DirtyScene extends ResizableScene { private isAlreadyTracking: boolean = false; protected dirty:boolean = true; private objectListChanged:boolean = true; + private physicsEnabled: boolean = false; /** * Track all objects added to the scene and adds a callback each time an animation is added. @@ -37,6 +38,27 @@ export abstract class DirtyScene extends ResizableScene { this.events.on(Events.RENDER, () => { this.objectListChanged = false; }); + + this.physics.disableUpdate(); + this.events.on(Events.POST_UPDATE, () => { + let objectMoving = false; + for (const body of this.physics.world.bodies.entries) { + if (body.velocity.x !== 0 || body.velocity.y !== 0) { + this.objectListChanged = true; + objectMoving = true; + if (!this.physicsEnabled) { + this.physics.enableUpdate(); + this.physicsEnabled = true; + } + break; + } + } + if (!objectMoving && this.physicsEnabled) { + this.physics.disableUpdate(); + this.physicsEnabled = false; + } + }); + } private trackAnimation(): void { diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 748897c5..cf882afd 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -186,7 +186,6 @@ export class GameScene extends DirtyScene implements CenterListener { private popUpElements : Map = new Map(); private originalMapUrl: string|undefined; private pinchManager: PinchManager|undefined; - private physicsEnabled: boolean = true; private mapTransitioning: boolean = false; //used to prevent transitions happenning at the same time. private onVisibilityChangeCallback: () => void; @@ -1088,8 +1087,6 @@ ${escapedMessage} } createCollisionWithPlayer() { - this.physics.disableUpdate(); - this.physicsEnabled = false; //add collision layer this.Layers.forEach((Layer: Phaser.Tilemaps.TilemapLayer) => { this.physics.add.collider(this.CurrentPlayer, Layer, (object1: GameObject, object2: GameObject) => { @@ -1223,20 +1220,7 @@ ${escapedMessage} this.dirty = false; mediaManager.updateScene(); this.currentTick = time; - if (this.CurrentPlayer.isMoving()) { - this.dirty = true; - } this.CurrentPlayer.moveUser(delta); - if (this.CurrentPlayer.isMoving()) { - this.dirty = true; - if (!this.physicsEnabled) { - this.physics.enableUpdate(); - this.physicsEnabled = true; - } - } else if (this.physicsEnabled) { - this.physics.disableUpdate(); - this.physicsEnabled = false; - } // Let's handle all events while (this.pendingEvents.length !== 0) {