From c06518cfe3f76539720065032a008081ca311b3a Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Thu, 5 Apr 2018 19:58:37 -0500 Subject: [PATCH] [#949] Fix offscreen culling in hidpi mode (#952) --- CHANGELOG.md | 3 +++ src/engine/Engine.ts | 6 ++++++ src/engine/Traits/OffscreenCulling.ts | 8 ++++---- src/spec/EngineSpec.ts | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67660b7a8..6d3a02fb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,9 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## Fixed - Added missing lifecycle event handlers on Actors, Triggers, Scenes, Engine, and Camera ([#582](https://github.com/excaliburjs/Excalibur/issues/582)) +- Offscreen culling in HiDPI mode ([#949](https://github.com/excaliburjs/Excalibur/issues/949)) + - Correct bounds check to check drawWidth/drawHeight for HiDPI + - suppressHiDPIScaling now also suppresses pixel ratio based scaling diff --git a/src/engine/Engine.ts b/src/engine/Engine.ts index c70dbd2eb..ade5084b5 100644 --- a/src/engine/Engine.ts +++ b/src/engine/Engine.ts @@ -302,11 +302,16 @@ export class Engine extends Class implements ICanInitialize, ICanUpdate, ICanDra */ public displayMode: DisplayMode = DisplayMode.FullScreen; + + private _suppressHiDPIScaling: boolean = false; /** * Returns the calculated pixel ration for use in rendering */ public get pixelRatio(): number { + if (this._suppressHiDPIScaling) { + return 1; + } let devicePixelRatio = window.devicePixelRatio || 1; let pixelRatio = devicePixelRatio; @@ -965,6 +970,7 @@ O|===|* >________________>\n\ this.ctx = this.canvas.getContext('2d'); + this._suppressHiDPIScaling = !!options.suppressHiDPIScaling; if (!options.suppressHiDPIScaling) { this._initializeHiDpi(); } diff --git a/src/engine/Traits/OffscreenCulling.ts b/src/engine/Traits/OffscreenCulling.ts index e7839e88d..73adcbd55 100644 --- a/src/engine/Traits/OffscreenCulling.ts +++ b/src/engine/Traits/OffscreenCulling.ts @@ -32,8 +32,8 @@ export class OffscreenCulling implements IActorTrait { if (!actor.isOffScreen) { if ((actorScreenCoords.x + width * zoom < 0 || actorScreenCoords.y + height * zoom < 0 || - actorScreenCoords.x > engine.canvasWidth || - actorScreenCoords.y > engine.canvasHeight) && + actorScreenCoords.x > engine.drawWidth || + actorScreenCoords.y > engine.drawHeight) && isSpriteOffScreen ) { eventDispatcher.emit('exitviewport', new ExitViewPortEvent(actor)); @@ -42,8 +42,8 @@ export class OffscreenCulling implements IActorTrait { } else { if ((actorScreenCoords.x + width * zoom > 0 && actorScreenCoords.y + height * zoom > 0 && - actorScreenCoords.x < engine.canvasWidth && - actorScreenCoords.y < engine.canvasHeight) || + actorScreenCoords.x < engine.drawWidth && + actorScreenCoords.y < engine.drawHeight) || !isSpriteOffScreen) { eventDispatcher.emit('enterviewport', new EnterViewPortEvent(actor)); diff --git a/src/spec/EngineSpec.ts b/src/spec/EngineSpec.ts index bfe0db5f4..d7ea62d1d 100644 --- a/src/spec/EngineSpec.ts +++ b/src/spec/EngineSpec.ts @@ -230,7 +230,7 @@ describe('The engine', () => { engine.start().then(() => { // Assert - expect(engine.isHiDpi).toBe(true); + expect(engine.isHiDpi).toBe(false); expect((engine)._initializeHiDpi).not.toHaveBeenCalled(); (window).devicePixelRatio = 1; done();