From c1c001eba8d0fa4ca663298ba6e12695132c2951 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Tue, 17 Jan 2023 17:36:46 +0800 Subject: [PATCH 01/24] refactor: change time unit and API --- packages/core/src/Engine.ts | 6 +- packages/core/src/animation/Animator.ts | 2 +- packages/core/src/base/Time.ts | 77 +++++++++++-------- .../core/src/particle/ParticleRenderer.ts | 14 ++-- 4 files changed, 54 insertions(+), 45 deletions(-) diff --git a/packages/core/src/Engine.ts b/packages/core/src/Engine.ts index ed06e29a4f..148d7d5053 100644 --- a/packages/core/src/Engine.ts +++ b/packages/core/src/Engine.ts @@ -271,7 +271,7 @@ export class Engine extends EventDispatcher { resume(): void { if (!this._isPaused) return; this._isPaused = false; - this.time.reset(); + this.time._reset(); this._requestId = requestAnimationFrame(this._animate); } @@ -280,7 +280,7 @@ export class Engine extends EventDispatcher { */ update(): void { const time = this._time; - time.tick(); + time._tick(); const deltaTime = time.deltaTime; this._frameInProcess = true; @@ -296,7 +296,7 @@ export class Engine extends EventDispatcher { scene._activeCameras.sort((camera1, camera2) => camera1.priority - camera2.priority); componentsManager.callScriptOnStart(); - this.physicsManager._initialized && this.physicsManager._update(deltaTime / 1000.0); + this.physicsManager._initialized && this.physicsManager._update(deltaTime); this.inputManager._update(); componentsManager.callScriptOnUpdate(deltaTime); componentsManager.callAnimationUpdate(deltaTime); diff --git a/packages/core/src/animation/Animator.ts b/packages/core/src/animation/Animator.ts index bcd9d8eba4..023f7e4bf1 100644 --- a/packages/core/src/animation/Animator.ts +++ b/packages/core/src/animation/Animator.ts @@ -176,7 +176,7 @@ export class Animator extends Component { continue; } - this._updateLayer(i, i === 0, deltaTime / 1000, animationUpdate); + this._updateLayer(i, i === 0, deltaTime, animationUpdate); } } diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index f57e0769ea..6b10f6ac20 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -1,15 +1,16 @@ /** - * Tools for calculating the time per frame. + * Tools for get time information. */ export class Time { /** @internal */ _frameCount: number = 0; private _clock: { now: () => number }; + private _time: number; private _timeScale: number; private _deltaTime: number; private _startTime: number; - private _lastTickTime: number; + private _lastSystemTime: number; /* * The total number of frames since the start of the engine. @@ -19,68 +20,76 @@ export class Time { } /** - * Constructor of the Time. + * The interval in seconds from the last frame to the current frame. */ - constructor() { - this._clock = performance ? performance : Date; - - this._timeScale = 1.0; - this._deltaTime = 0.0001; - - const now = this._clock.now(); - this._startTime = now; - this._lastTickTime = now; + get deltaTime(): number { + return this._deltaTime; } - reset() { - this._lastTickTime = this._clock.now(); + /** + * The unscaled interval in seconds from the last frame to the current frame. + */ + get unscaledDeltaTime(): number { + return this._deltaTime / this._timeScale; } /** - * Current Time + * The time in seconds at the beginning of this frame. */ - get nowTime(): number { - return this._clock.now(); + get time(): number { + return this._time; } /** - * Time between two ticks + * The elapsed time in seconds, after the engine is startup. */ - get deltaTime(): number { - return this._deltaTime; + get timeSinceStartup(): number { + return this._time - this._startTime; } /** - * Scaled delta time. + * The scale of time. */ get timeScale(): number { return this._timeScale; } - set timeScale(s) { - this._timeScale = s; + + set timeScale(value) { + this._timeScale = value; } /** - * Unscaled delta time. + * Constructor of the Time. */ - get unscaledDeltaTime(): number { - return this._deltaTime / this._timeScale; + constructor() { + this._clock = performance ? performance : Date; + + this._timeScale = 1.0; + this._deltaTime = 0.0001; + + const now = this._clock.now() / 1000; + this._startTime = now; + this._lastSystemTime = now; } /** - * The elapsed time, after the clock is initialized. + * @internal */ - get timeSinceStartup(): number { - return this.nowTime - this._startTime; + _reset() { + this._lastSystemTime = this._clock.now() / 1000; } /** - * Call every frame, update delta time and other data. + * @internal */ - public tick(): void { - const now = this.nowTime; - this._deltaTime = (now - this._lastTickTime) * this._timeScale; - this._lastTickTime = now; + _tick(): void { + const systemTime = this._clock.now() / 1000; + const deltaTime = (systemTime - this._lastSystemTime) * this._timeScale; + + this._deltaTime = deltaTime; + this._time += deltaTime; this._frameCount++; + + this._lastSystemTime = systemTime; } } diff --git a/packages/core/src/particle/ParticleRenderer.ts b/packages/core/src/particle/ParticleRenderer.ts index 1fa9331dfa..fdf84abf5e 100644 --- a/packages/core/src/particle/ParticleRenderer.ts +++ b/packages/core/src/particle/ParticleRenderer.ts @@ -1,4 +1,6 @@ -import { MathUtil, Vector3, Color } from "@oasis-engine/math"; +import { Color, MathUtil, Vector3 } from "@oasis-engine/math"; +import { GLCapabilityType } from "../base/Constant"; +import { ignoreClone } from "../clone/CloneManager"; import { Buffer } from "../graphic/Buffer"; import { BufferBindFlag } from "../graphic/enums/BufferBindFlag"; import { BufferUsage } from "../graphic/enums/BufferUsage"; @@ -6,14 +8,12 @@ import { IndexFormat } from "../graphic/enums/IndexFormat"; import { VertexElementFormat } from "../graphic/enums/VertexElementFormat"; import { VertexElement } from "../graphic/VertexElement"; import { Material } from "../material/Material"; +import { BufferMesh } from "../mesh/BufferMesh"; +import { MeshRenderer } from "../mesh/MeshRenderer"; +import { CullMode, Shader } from "../shader"; import { BlendFactor } from "../shader/enums/BlendFactor"; import { RenderQueueType } from "../shader/enums/RenderQueueType"; -import { Shader, CullMode } from "../shader"; import { Texture } from "../texture"; -import { MeshRenderer } from "../mesh/MeshRenderer"; -import { GLCapabilityType } from "../base/Constant"; -import { BufferMesh } from "../mesh/BufferMesh"; -import { ignoreClone } from "../clone/CloneManager"; enum DirtyFlagType { Position = 0x1, @@ -560,7 +560,7 @@ export class ParticleRenderer extends MeshRenderer { this._updateDirtyFlag = 0; } - this._time += deltaTime / 1000; + this._time += deltaTime; this.shaderData.setFloat("u_time", this._time); } From a133e1ae7e6d4dabb6d6f47ef529983f3ccaef2b Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Tue, 17 Jan 2023 17:43:19 +0800 Subject: [PATCH 02/24] refactor: opt code --- packages/core/src/base/Time.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 6b10f6ac20..99612756ce 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -9,7 +9,6 @@ export class Time { private _time: number; private _timeScale: number; private _deltaTime: number; - private _startTime: number; private _lastSystemTime: number; /* @@ -40,13 +39,6 @@ export class Time { return this._time; } - /** - * The elapsed time in seconds, after the engine is startup. - */ - get timeSinceStartup(): number { - return this._time - this._startTime; - } - /** * The scale of time. */ @@ -68,7 +60,6 @@ export class Time { this._deltaTime = 0.0001; const now = this._clock.now() / 1000; - this._startTime = now; this._lastSystemTime = now; } From e76dee803af618ede76b5ea9034d60dae52924d4 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Tue, 17 Jan 2023 17:51:41 +0800 Subject: [PATCH 03/24] refactor: opt code --- packages/core/src/base/Time.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 99612756ce..10ec39f950 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -33,12 +33,19 @@ export class Time { } /** - * The time in seconds at the beginning of this frame. + * The time in seconds of this frame. */ get time(): number { return this._time; } + /** + * The unscaled time in seconds of this frame. + */ + get unscaledTime(): number { + return this._time / this._timeScale; + } + /** * The scale of time. */ From 7ec6903def601358d8d07ef83e21340fd74f037a Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Tue, 17 Jan 2023 17:58:10 +0800 Subject: [PATCH 04/24] refactor: opt code --- packages/core/src/base/Time.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 10ec39f950..11f462740d 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -6,9 +6,11 @@ export class Time { _frameCount: number = 0; private _clock: { now: () => number }; - private _time: number; - private _timeScale: number; - private _deltaTime: number; + private _time: number = 0; + private _unscaledTime: number = 0; + private _deltaTime: number = 0; + private _unscaledDeltaTime: number = 0; + private _timeScale: number = 1.0; private _lastSystemTime: number; /* @@ -62,10 +64,6 @@ export class Time { */ constructor() { this._clock = performance ? performance : Date; - - this._timeScale = 1.0; - this._deltaTime = 0.0001; - const now = this._clock.now() / 1000; this._lastSystemTime = now; } From 9577271996e0521eef828179f9bbcc9d38db3a2d Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 11:23:13 +0800 Subject: [PATCH 05/24] refactor: opt code --- packages/core/src/RenderPipeline/BasicRenderPipeline.ts | 2 +- packages/core/src/base/Time.ts | 4 +--- packages/core/src/shadow/ShadowUtils.ts | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/core/src/RenderPipeline/BasicRenderPipeline.ts b/packages/core/src/RenderPipeline/BasicRenderPipeline.ts index c81fc45a21..fa801ac6c8 100644 --- a/packages/core/src/RenderPipeline/BasicRenderPipeline.ts +++ b/packages/core/src/RenderPipeline/BasicRenderPipeline.ts @@ -319,7 +319,7 @@ export class BasicRenderPipeline { continue; } } - renderer._renderFrameCount = engine.time._frameCount; + renderer._renderFrameCount = engine.time.frameCount; renderer._prepareRender(context); } } diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 11f462740d..1e85991490 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -2,9 +2,7 @@ * Tools for get time information. */ export class Time { - /** @internal */ - _frameCount: number = 0; - + private _frameCount: number = 0; private _clock: { now: () => number }; private _time: number = 0; private _unscaledTime: number = 0; diff --git a/packages/core/src/shadow/ShadowUtils.ts b/packages/core/src/shadow/ShadowUtils.ts index 15ed27d7fc..4d5cba711e 100644 --- a/packages/core/src/shadow/ShadowUtils.ts +++ b/packages/core/src/shadow/ShadowUtils.ts @@ -186,7 +186,7 @@ export class ShadowUtils { renderer.castShadows && ShadowUtils.cullingRenderBounds(renderer.bounds, shadowSliceData.cullPlaneCount, shadowSliceData.cullPlanes) ) { - renderer._renderFrameCount = renderer.engine.time._frameCount; + renderer._renderFrameCount = renderer.engine.time.frameCount; renderer._prepareRender(context); } } From 271a85c097c4b18e3f751d322b4118279076488d Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 11:50:40 +0800 Subject: [PATCH 06/24] refactor: opt code --- packages/core/src/base/Time.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 1e85991490..3efda50a13 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -3,11 +3,10 @@ */ export class Time { private _frameCount: number = 0; - private _clock: { now: () => number }; - private _time: number = 0; - private _unscaledTime: number = 0; private _deltaTime: number = 0; private _unscaledDeltaTime: number = 0; + private _time: number = 0; + private _unscaledTime: number = 0; private _timeScale: number = 1.0; private _lastSystemTime: number; @@ -29,7 +28,7 @@ export class Time { * The unscaled interval in seconds from the last frame to the current frame. */ get unscaledDeltaTime(): number { - return this._deltaTime / this._timeScale; + return this._unscaledDeltaTime; } /** @@ -43,7 +42,7 @@ export class Time { * The unscaled time in seconds of this frame. */ get unscaledTime(): number { - return this._time / this._timeScale; + return this._unscaledTime; } /** @@ -61,29 +60,30 @@ export class Time { * Constructor of the Time. */ constructor() { - this._clock = performance ? performance : Date; - const now = this._clock.now() / 1000; - this._lastSystemTime = now; + this._lastSystemTime = performance.now() / 1000; } /** * @internal */ _reset() { - this._lastSystemTime = this._clock.now() / 1000; + this._lastSystemTime = performance.now() / 1000; } /** * @internal */ _tick(): void { - const systemTime = this._clock.now() / 1000; - const deltaTime = (systemTime - this._lastSystemTime) * this._timeScale; + const currentSystemTime = performance.now() / 1000; + const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; + const deltaTime = unscaledDeltaTime * this._timeScale; + this._unscaledDeltaTime = unscaledDeltaTime; + this._unscaledTime += unscaledDeltaTime; this._deltaTime = deltaTime; this._time += deltaTime; this._frameCount++; - this._lastSystemTime = systemTime; + this._lastSystemTime = currentSystemTime; } } From 2df279744b85f8d6f382c9546b2131c3f98e3d08 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 13:13:32 +0800 Subject: [PATCH 07/24] refactor: opt code --- packages/core/src/Engine.ts | 2 +- packages/core/src/base/Time.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Engine.ts b/packages/core/src/Engine.ts index 82cfae07a0..a4f9a6f22d 100644 --- a/packages/core/src/Engine.ts +++ b/packages/core/src/Engine.ts @@ -306,7 +306,7 @@ export class Engine extends EventDispatcher { } const time = this._time; - time._tick(); + time._update(); const deltaTime = time.deltaTime; this._frameInProcess = true; diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 3efda50a13..7e7724a986 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -73,7 +73,7 @@ export class Time { /** * @internal */ - _tick(): void { + _update(): void { const currentSystemTime = performance.now() / 1000; const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; const deltaTime = unscaledDeltaTime * this._timeScale; From 431ea46d638e3ade44f215f8c8ee6f24df7433fe Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 15:31:31 +0800 Subject: [PATCH 08/24] refactor: opt code --- packages/core/src/Scene.ts | 3 +++ packages/core/src/base/Time.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/packages/core/src/Scene.ts b/packages/core/src/Scene.ts index 9df66943f1..477b3357a0 100644 --- a/packages/core/src/Scene.ts +++ b/packages/core/src/Scene.ts @@ -379,8 +379,11 @@ export class Scene extends EngineObject { */ _updateShaderData(): void { const shaderData = this.shaderData; + const time = this._engine.time; const lightManager = this._engine._lightManager; + time._updateSceneShaderData(shaderData); + lightManager._updateShaderData(this.shaderData); const sunLightIndex = lightManager._getSunLightIndex(); if (sunLightIndex !== -1) { diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 7e7724a986..57c346f2aa 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -1,7 +1,14 @@ +import { Vector4 } from "@oasis-engine/math"; +import { ShaderData } from "../shader/ShaderData"; +import { ShaderProperty } from "../shader/ShaderProperty"; + /** * Tools for get time information. */ export class Time { + private static _timeProperty = ShaderProperty.getByName("u_Time"); + private static _deltaTimeProperty = ShaderProperty.getByName("u_DeltaTime"); + private _frameCount: number = 0; private _deltaTime: number = 0; private _unscaledDeltaTime: number = 0; @@ -10,6 +17,9 @@ export class Time { private _timeScale: number = 1.0; private _lastSystemTime: number; + private _timeValue: Vector4 = new Vector4(); + private _deltaTimeValue: Vector4 = new Vector4(); + /* * The total number of frames since the start of the engine. */ @@ -86,4 +96,20 @@ export class Time { this._lastSystemTime = currentSystemTime; } + + /** + * @internal + */ + _updateSceneShaderData(shaderData: ShaderData): void { + const timeValue = this._timeValue; + const deltaTimeValue = this._deltaTimeValue; + + const time = this._time; + timeValue.set(time, Math.sin(time), Math.cos(time), 0); + shaderData.setVector4(Time._timeProperty, timeValue); + + const deltaTime = this._deltaTime; + deltaTimeValue.set(deltaTime, 0, 0, 0); + shaderData.setVector4(Time._deltaTimeProperty, deltaTimeValue); + } } From 545511e2c4f9387260690a758fb48e3211ac2431 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 17:54:57 +0800 Subject: [PATCH 09/24] refactor: opt code --- packages/core/src/base/Time.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 57c346f2aa..b71a7b63cd 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -12,8 +12,8 @@ export class Time { private _frameCount: number = 0; private _deltaTime: number = 0; private _unscaledDeltaTime: number = 0; - private _time: number = 0; - private _unscaledTime: number = 0; + private _elapsedTime: number = 0; + private _unscaledElapsedTime: number = 0; private _timeScale: number = 1.0; private _lastSystemTime: number; @@ -42,17 +42,17 @@ export class Time { } /** - * The time in seconds of this frame. + * The elapsed time in seconds of this frame. */ - get time(): number { - return this._time; + get elapsedTime(): number { + return this._elapsedTime; } /** - * The unscaled time in seconds of this frame. + * The unscaled elapsed time in seconds of this frame. */ - get unscaledTime(): number { - return this._unscaledTime; + get unscaledElapsedTime(): number { + return this._unscaledElapsedTime; } /** @@ -89,9 +89,9 @@ export class Time { const deltaTime = unscaledDeltaTime * this._timeScale; this._unscaledDeltaTime = unscaledDeltaTime; - this._unscaledTime += unscaledDeltaTime; + this._unscaledElapsedTime += unscaledDeltaTime; this._deltaTime = deltaTime; - this._time += deltaTime; + this._elapsedTime += deltaTime; this._frameCount++; this._lastSystemTime = currentSystemTime; @@ -104,7 +104,7 @@ export class Time { const timeValue = this._timeValue; const deltaTimeValue = this._deltaTimeValue; - const time = this._time; + const time = this._elapsedTime; timeValue.set(time, Math.sin(time), Math.cos(time), 0); shaderData.setVector4(Time._timeProperty, timeValue); From fa849dc5795274e04286113dbef071f4575afa8c Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 17:59:24 +0800 Subject: [PATCH 10/24] refactor: opt code --- packages/core/src/Engine.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/Engine.ts b/packages/core/src/Engine.ts index a4f9a6f22d..23f425eedc 100644 --- a/packages/core/src/Engine.ts +++ b/packages/core/src/Engine.ts @@ -68,7 +68,7 @@ export class Engine extends EventDispatcher { /* @internal */ _renderElementPool: ClassPool = new ClassPool(RenderElement); - /* @internal */ + /* @internal */ _meshRenderDataPool: ClassPool = new ClassPool(MeshRenderData); /* @internal */ _spriteRenderDataPool: ClassPool = new ClassPool(SpriteRenderData); @@ -158,21 +158,21 @@ export class Engine extends EventDispatcher { } /** - * Get the resource manager. + * The resource manager. */ get resourceManager(): ResourceManager { return this._resourceManager; } /** - * Get the scene manager. + * The scene manager. */ get sceneManager(): SceneManager { return this._sceneManager; } /** - * Get the Time class. + * The time information of the engine. */ get time(): Time { return this._time; From ae073a631b1c5ff44adb65e21cdb847c4236fb41 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 18:30:56 +0800 Subject: [PATCH 11/24] refactor: opt code --- packages/core/src/base/Time.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index b71a7b63cd..c0e3e59393 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -28,28 +28,28 @@ export class Time { } /** - * The interval in seconds from the last frame to the current frame. + * The delta time in seconds from the last frame to the current frame. */ get deltaTime(): number { return this._deltaTime; } /** - * The unscaled interval in seconds from the last frame to the current frame. + * The unscaled delta time in seconds from the last frame to the current frame. */ get unscaledDeltaTime(): number { return this._unscaledDeltaTime; } /** - * The elapsed time in seconds of this frame. + * The elapsed time in seconds since the start of the engine. */ get elapsedTime(): number { return this._elapsedTime; } /** - * The unscaled elapsed time in seconds of this frame. + * The unscaled elapsed time in seconds since the start of the engine. */ get unscaledElapsedTime(): number { return this._unscaledElapsedTime; From 2109bb3046dee3ac54c1b1d8d8b090b5e6785b13 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Thu, 16 Mar 2023 18:48:29 +0800 Subject: [PATCH 12/24] refactor: opt code --- packages/core/src/Script.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Script.ts b/packages/core/src/Script.ts index 4c03aa12f2..2d6d4c8b36 100644 --- a/packages/core/src/Script.ts +++ b/packages/core/src/Script.ts @@ -51,13 +51,13 @@ export class Script extends Component { /** * The main loop, called frame by frame. - * @param deltaTime - The deltaTime when the script update. + * @param deltaTime - The delta time since last frame in seconds */ onUpdate(deltaTime: number): void {} /** * Called after the onUpdate finished, called frame by frame. - * @param deltaTime - The deltaTime when the script update. + * @param deltaTime - The delta time since last frame in seconds */ onLateUpdate(deltaTime: number): void {} From 91bd941713d59231c608d5a21aff06c093c75db8 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Fri, 17 Mar 2023 11:50:38 +0800 Subject: [PATCH 13/24] refactor: opt code --- packages/core/src/base/Time.ts | 36 ++++++++++----------- packages/core/src/physics/PhysicsManager.ts | 23 +------------ 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index c0e3e59393..093105e2d6 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -3,7 +3,7 @@ import { ShaderData } from "../shader/ShaderData"; import { ShaderProperty } from "../shader/ShaderProperty"; /** - * Tools for get time information. + * Provide time related information. */ export class Time { private static _timeProperty = ShaderProperty.getByName("u_Time"); @@ -14,12 +14,22 @@ export class Time { private _unscaledDeltaTime: number = 0; private _elapsedTime: number = 0; private _unscaledElapsedTime: number = 0; - private _timeScale: number = 1.0; private _lastSystemTime: number; private _timeValue: Vector4 = new Vector4(); private _deltaTimeValue: Vector4 = new Vector4(); + /** + * Maximum delta time allowed per frame in seconds. + * + * @remarks + * When the frame rate is low or stutter occurs, `deltaTime` will not exceed this value. + */ + maximumDeltaTime: number = 0.333333; + + /** The scale of time. */ + timeScale: number = 1.0; + /* * The total number of frames since the start of the engine. */ @@ -42,30 +52,19 @@ export class Time { } /** - * The elapsed time in seconds since the start of the engine. + * The amount of elapsed time in seconds since the start of the engine. */ get elapsedTime(): number { return this._elapsedTime; } /** - * The unscaled elapsed time in seconds since the start of the engine. + * The amount of unscaled elapsed time in seconds since the start of the engine. */ get unscaledElapsedTime(): number { return this._unscaledElapsedTime; } - /** - * The scale of time. - */ - get timeScale(): number { - return this._timeScale; - } - - set timeScale(value) { - this._timeScale = value; - } - /** * Constructor of the Time. */ @@ -85,11 +84,12 @@ export class Time { */ _update(): void { const currentSystemTime = performance.now() / 1000; - const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; - const deltaTime = unscaledDeltaTime * this._timeScale; - + + const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; this._unscaledDeltaTime = unscaledDeltaTime; this._unscaledElapsedTime += unscaledDeltaTime; + + const deltaTime = Math.min(unscaledDeltaTime, this.maximumDeltaTime) * this.timeScale; this._deltaTime = deltaTime; this._elapsedTime += deltaTime; this._frameCount++; diff --git a/packages/core/src/physics/PhysicsManager.ts b/packages/core/src/physics/PhysicsManager.ts index b4e2e2e2d4..93eaaf35d6 100644 --- a/packages/core/src/physics/PhysicsManager.ts +++ b/packages/core/src/physics/PhysicsManager.ts @@ -127,15 +127,6 @@ export class PhysicsManager { /** The fixed time step in seconds at which physics are performed. */ fixedTimeStep: number = 1 / 60; - /** - * The max allowed time step in seconds one frame. - * - * @remarks - * When the frame rate is low or stutter occurs, the maximum execution time of physics will not exceed this value. - * So physics will slow down a bit when performance hitch occurs. - */ - maxAllowedTimeStep: number = 1 / 3; - /** * The gravity of physics scene. */ @@ -150,18 +141,6 @@ export class PhysicsManager { } } - /** - * @deprecated - * Please use `maxAllowedTimeStep` instead. - */ - get maxSumTimeStep(): number { - return this.maxAllowedTimeStep; - } - - set maxSumTimeStep(value: number) { - this.maxAllowedTimeStep = value; - } - constructor(engine: Engine) { this._engine = engine; @@ -302,7 +281,7 @@ export class PhysicsManager { const { fixedTimeStep: fixedTimeStep, _nativePhysicsManager: nativePhysicsManager } = this; const componentsManager = this._engine._componentsManager; - const simulateTime = Math.min(this.maxAllowedTimeStep, this._restTime + deltaTime); + const simulateTime = this._restTime + deltaTime; const step = Math.floor(simulateTime / fixedTimeStep); this._restTime = simulateTime - step * fixedTimeStep; for (let i = 0; i < step; i++) { From b671bb8e688d03bfd4702f2e55f4e669669194ba Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Fri, 17 Mar 2023 12:07:27 +0800 Subject: [PATCH 14/24] refactor: opt code --- packages/core/src/base/Time.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 093105e2d6..25345c2bf4 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -23,7 +23,7 @@ export class Time { * Maximum delta time allowed per frame in seconds. * * @remarks - * When the frame rate is low or stutter occurs, `deltaTime` will not exceed this value. + * When the frame rate is low or stutter occurs, `deltaTime` will not exceed the value of `maximumDeltaTime` * `timeScale`. */ maximumDeltaTime: number = 0.333333; @@ -84,8 +84,8 @@ export class Time { */ _update(): void { const currentSystemTime = performance.now() / 1000; - - const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; + + const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; this._unscaledDeltaTime = unscaledDeltaTime; this._unscaledElapsedTime += unscaledDeltaTime; From 6b9f1c06db7f4f32fb306c933ff000f810db4897 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Fri, 17 Mar 2023 12:54:13 +0800 Subject: [PATCH 15/24] refactor: opt code --- packages/core/src/physics/PhysicsManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/physics/PhysicsManager.ts b/packages/core/src/physics/PhysicsManager.ts index 93eaaf35d6..eae49b5ff4 100644 --- a/packages/core/src/physics/PhysicsManager.ts +++ b/packages/core/src/physics/PhysicsManager.ts @@ -278,7 +278,7 @@ export class PhysicsManager { * @internal */ _update(deltaTime: number): void { - const { fixedTimeStep: fixedTimeStep, _nativePhysicsManager: nativePhysicsManager } = this; + const { fixedTimeStep, _nativePhysicsManager: nativePhysicsManager } = this; const componentsManager = this._engine._componentsManager; const simulateTime = this._restTime + deltaTime; From 200e9522ec8a6a647dfef01e5974a053e4d7e4b5 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Fri, 17 Mar 2023 13:01:26 +0800 Subject: [PATCH 16/24] refactor: opt code --- packages/core/src/base/Time.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 25345c2bf4..4533fd5267 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -6,7 +6,7 @@ import { ShaderProperty } from "../shader/ShaderProperty"; * Provide time related information. */ export class Time { - private static _timeProperty = ShaderProperty.getByName("u_Time"); + private static _elapsedTimeProperty = ShaderProperty.getByName("u_ElapsedTime"); private static _deltaTimeProperty = ShaderProperty.getByName("u_DeltaTime"); private _frameCount: number = 0; @@ -16,7 +16,7 @@ export class Time { private _unscaledElapsedTime: number = 0; private _lastSystemTime: number; - private _timeValue: Vector4 = new Vector4(); + private _elapsedTimeValue: Vector4 = new Vector4(); private _deltaTimeValue: Vector4 = new Vector4(); /** @@ -101,12 +101,12 @@ export class Time { * @internal */ _updateSceneShaderData(shaderData: ShaderData): void { - const timeValue = this._timeValue; + const elapsedTimeValue = this._elapsedTimeValue; const deltaTimeValue = this._deltaTimeValue; const time = this._elapsedTime; - timeValue.set(time, Math.sin(time), Math.cos(time), 0); - shaderData.setVector4(Time._timeProperty, timeValue); + elapsedTimeValue.set(time, Math.sin(time), Math.cos(time), 0); + shaderData.setVector4(Time._elapsedTimeProperty, elapsedTimeValue); const deltaTime = this._deltaTime; deltaTimeValue.set(deltaTime, 0, 0, 0); From de62310af863b24264934b581ba2ca0cedf62f34 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Fri, 17 Mar 2023 15:12:47 +0800 Subject: [PATCH 17/24] feat: rename time property name --- packages/core/src/base/Time.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 4533fd5267..0b998fda1f 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -6,8 +6,8 @@ import { ShaderProperty } from "../shader/ShaderProperty"; * Provide time related information. */ export class Time { - private static _elapsedTimeProperty = ShaderProperty.getByName("u_ElapsedTime"); - private static _deltaTimeProperty = ShaderProperty.getByName("u_DeltaTime"); + private static _elapsedTimeProperty = ShaderProperty.getByName("oasis_ElapsedTime"); + private static _deltaTimeProperty = ShaderProperty.getByName("oasis_DeltaTime"); private _frameCount: number = 0; private _deltaTime: number = 0; From 2d9376d9040c9a44fff6d70ae2c4d16b0de4cec4 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Fri, 17 Mar 2023 16:29:41 +0800 Subject: [PATCH 18/24] test: add Time basic unit test --- tests/src/core/base/Time.test.ts | 25 +++++++++++++++++++ tests/src/core/physics/PhysicsManager.test.ts | 1 - 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 tests/src/core/base/Time.test.ts diff --git a/tests/src/core/base/Time.test.ts b/tests/src/core/base/Time.test.ts new file mode 100644 index 0000000000..26a8b9ffc2 --- /dev/null +++ b/tests/src/core/base/Time.test.ts @@ -0,0 +1,25 @@ +import { WebGLEngine } from "@oasis-engine/rhi-webgl"; +import { expect } from "chai"; + +describe("Time", () => { + it("Time basic", () => { + const engine = new WebGLEngine(document.createElement("canvas")); + + expect(engine.time.frameCount).to.be.equal(0); + expect(engine.time.elapsedTime).to.be.equal(0); + expect(engine.time.deltaTime).to.be.equal(0); + expect(engine.time.unscaledElapsedTime).to.be.equal(0); + expect(engine.time.unscaledDeltaTime).to.be.equal(0); + + expect(engine.time.timeScale).to.be.equal(1); + engine.time.timeScale = 2; + expect(engine.time.timeScale).to.be.equal(2); + + expect(engine.time.maximumDeltaTime).to.be.equal(0.333333); + engine.time.maximumDeltaTime = 0.5; + expect(engine.time.maximumDeltaTime).to.be.equal(0.5); + + engine.update(); + expect(engine.time.frameCount).to.be.equal(1); + }); +}); diff --git a/tests/src/core/physics/PhysicsManager.test.ts b/tests/src/core/physics/PhysicsManager.test.ts index b480646715..2b7aff8ee7 100644 --- a/tests/src/core/physics/PhysicsManager.test.ts +++ b/tests/src/core/physics/PhysicsManager.test.ts @@ -14,7 +14,6 @@ describe("physics manager test", () => { engine.physicsManager.initialize(LitePhysics); expect(engine.physicsManager.gravity.y).to.eq(-9.81); - expect(engine.physicsManager.maxSumTimeStep).to.eq(1 / 3); expect(engine.physicsManager.fixedTimeStep).to.eq(1 / 60); }); From 5ffb026e2ca944dca0d828f44bb96e38673a57b2 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Mon, 20 Mar 2023 11:43:23 +0800 Subject: [PATCH 19/24] refactor: opt code --- packages/core/src/Scene.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/core/src/Scene.ts b/packages/core/src/Scene.ts index 477b3357a0..c188ab9689 100644 --- a/packages/core/src/Scene.ts +++ b/packages/core/src/Scene.ts @@ -379,12 +379,13 @@ export class Scene extends EngineObject { */ _updateShaderData(): void { const shaderData = this.shaderData; - const time = this._engine.time; - const lightManager = this._engine._lightManager; + const engine = this._engine; + const lightManager = engine._lightManager; - time._updateSceneShaderData(shaderData); + engine.time._updateSceneShaderData(shaderData); lightManager._updateShaderData(this.shaderData); + const sunLightIndex = lightManager._getSunLightIndex(); if (sunLightIndex !== -1) { this._sunLight = lightManager._directLights.get(sunLightIndex); From 93a7f0d24c8cbaa2f2f77add8f59a7302eb17e23 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Mon, 20 Mar 2023 12:09:11 +0800 Subject: [PATCH 20/24] refactor: opt code --- packages/core/src/base/Time.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 0b998fda1f..fc8fd7f65b 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -108,8 +108,7 @@ export class Time { elapsedTimeValue.set(time, Math.sin(time), Math.cos(time), 0); shaderData.setVector4(Time._elapsedTimeProperty, elapsedTimeValue); - const deltaTime = this._deltaTime; - deltaTimeValue.set(deltaTime, 0, 0, 0); + deltaTimeValue.set(this._deltaTime, 0, 0, 0); shaderData.setVector4(Time._deltaTimeProperty, deltaTimeValue); } } From b5a740e0deb0c63f704c24a752584f34030cb02b Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Mon, 20 Mar 2023 12:10:25 +0800 Subject: [PATCH 21/24] refactor: opt code --- packages/core/src/base/Time.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index fc8fd7f65b..8046696fbb 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -101,8 +101,7 @@ export class Time { * @internal */ _updateSceneShaderData(shaderData: ShaderData): void { - const elapsedTimeValue = this._elapsedTimeValue; - const deltaTimeValue = this._deltaTimeValue; + const { _elapsedTimeValue: elapsedTimeValue, _deltaTimeValue: deltaTimeValue } = this; const time = this._elapsedTime; elapsedTimeValue.set(time, Math.sin(time), Math.cos(time), 0); From 12a8910667d9af6ef199580474479963a533d172 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Mon, 20 Mar 2023 12:29:16 +0800 Subject: [PATCH 22/24] refactor: opt code --- packages/core/src/base/Time.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 8046696fbb..0c672f6632 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -45,17 +45,17 @@ export class Time { } /** - * The unscaled delta time in seconds from the last frame to the current frame. + * The amount of elapsed time in seconds since the start of the engine. */ - get unscaledDeltaTime(): number { - return this._unscaledDeltaTime; + get elapsedTime(): number { + return this._elapsedTime; } /** - * The amount of elapsed time in seconds since the start of the engine. + * The unscaled delta time in seconds from the last frame to the current frame. */ - get elapsedTime(): number { - return this._elapsedTime; + get unscaledDeltaTime(): number { + return this._unscaledDeltaTime; } /** From fa14bf9d1eb40be112e6a66d00b43b08b4480c70 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Mon, 20 Mar 2023 13:37:45 +0800 Subject: [PATCH 23/24] refactor: Optimization time API --- packages/core/src/base/Time.ts | 35 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/core/src/base/Time.ts b/packages/core/src/base/Time.ts index 0c672f6632..27ab6ed499 100644 --- a/packages/core/src/base/Time.ts +++ b/packages/core/src/base/Time.ts @@ -11,20 +11,15 @@ export class Time { private _frameCount: number = 0; private _deltaTime: number = 0; - private _unscaledDeltaTime: number = 0; + private _actualDeltaTime: number = 0; private _elapsedTime: number = 0; - private _unscaledElapsedTime: number = 0; + private _actualElapsedTime: number = 0; private _lastSystemTime: number; private _elapsedTimeValue: Vector4 = new Vector4(); private _deltaTimeValue: Vector4 = new Vector4(); - /** - * Maximum delta time allowed per frame in seconds. - * - * @remarks - * When the frame rate is low or stutter occurs, `deltaTime` will not exceed the value of `maximumDeltaTime` * `timeScale`. - */ + /** Maximum delta time allowed per frame in seconds. */ maximumDeltaTime: number = 0.333333; /** The scale of time. */ @@ -39,6 +34,8 @@ export class Time { /** * The delta time in seconds from the last frame to the current frame. + * + * @remarks When the frame rate is low or stutter occurs, `deltaTime` will not exceed the value of `maximumDeltaTime` * `timeScale`. */ get deltaTime(): number { return this._deltaTime; @@ -52,17 +49,19 @@ export class Time { } /** - * The unscaled delta time in seconds from the last frame to the current frame. + * The actual delta time in seconds from the last frame to the current frame. + * + * @remarks The actual delta time is not affected by `maximumDeltaTime` and `timeScale`. */ - get unscaledDeltaTime(): number { - return this._unscaledDeltaTime; + get actualDeltaTime(): number { + return this._actualDeltaTime; } /** - * The amount of unscaled elapsed time in seconds since the start of the engine. + * The amount of actual elapsed time in seconds since the start of the engine. */ - get unscaledElapsedTime(): number { - return this._unscaledElapsedTime; + get actualElapsedTime(): number { + return this._actualElapsedTime; } /** @@ -85,11 +84,11 @@ export class Time { _update(): void { const currentSystemTime = performance.now() / 1000; - const unscaledDeltaTime = currentSystemTime - this._lastSystemTime; - this._unscaledDeltaTime = unscaledDeltaTime; - this._unscaledElapsedTime += unscaledDeltaTime; + const actualDeltaTime = currentSystemTime - this._lastSystemTime; + this._actualDeltaTime = actualDeltaTime; + this._actualElapsedTime += actualDeltaTime; - const deltaTime = Math.min(unscaledDeltaTime, this.maximumDeltaTime) * this.timeScale; + const deltaTime = Math.min(actualDeltaTime, this.maximumDeltaTime) * this.timeScale; this._deltaTime = deltaTime; this._elapsedTime += deltaTime; this._frameCount++; From ffb52139615aed8d451a13b6bc4f97822c517e87 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Mon, 20 Mar 2023 13:45:33 +0800 Subject: [PATCH 24/24] refactor: fix unit test --- tests/src/core/base/Time.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/core/base/Time.test.ts b/tests/src/core/base/Time.test.ts index 26a8b9ffc2..1c857e285f 100644 --- a/tests/src/core/base/Time.test.ts +++ b/tests/src/core/base/Time.test.ts @@ -8,8 +8,8 @@ describe("Time", () => { expect(engine.time.frameCount).to.be.equal(0); expect(engine.time.elapsedTime).to.be.equal(0); expect(engine.time.deltaTime).to.be.equal(0); - expect(engine.time.unscaledElapsedTime).to.be.equal(0); - expect(engine.time.unscaledDeltaTime).to.be.equal(0); + expect(engine.time.actualElapsedTime).to.be.equal(0); + expect(engine.time.actualDeltaTime).to.be.equal(0); expect(engine.time.timeScale).to.be.equal(1); engine.time.timeScale = 2;