From 318d4963ecb71bc6cee5456f5ddcfef9899f5b20 Mon Sep 17 00:00:00 2001 From: "shensi.zxd" Date: Fri, 10 Sep 2021 15:27:10 +0800 Subject: [PATCH 1/2] perf: release viewport gpu command --- packages/rhi-webgl/src/WebGLRenderer.ts | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/rhi-webgl/src/WebGLRenderer.ts b/packages/rhi-webgl/src/WebGLRenderer.ts index fb05cd1ec1..0d8fce3a2d 100644 --- a/packages/rhi-webgl/src/WebGLRenderer.ts +++ b/packages/rhi-webgl/src/WebGLRenderer.ts @@ -21,7 +21,7 @@ import { } from "@oasis-engine/core"; import { CameraClearFlags } from "@oasis-engine/core"; import { IPlatformPrimitive } from "@oasis-engine/design"; -import { Color } from "@oasis-engine/math"; +import { Color, Vector4 } from "@oasis-engine/math"; import { GLCapability } from "./GLCapability"; import { GLExtensions } from "./GLExtensions"; import { GLPrimitive } from "./GLPrimitive"; @@ -70,6 +70,7 @@ export class WebGLRenderer implements IHardwareRenderer { private _activeTextureID: number = WebGLRenderingContext.TEXTURE0; private _activeTextures: GLTexture[] = new Array(32); + private _lastViewport: Vector4 = new Vector4(NaN, NaN, NaN, NaN); get isWebGL2() { return this._isWebGL2; @@ -181,11 +182,16 @@ export class WebGLRenderer implements IHardwareRenderer { return this.capability.canIUseCompressedTextureInternalFormat(type); } - viewport(x, y, width, height) { + viewport(x: number, y: number, width: number, height: number): void { // gl.enable(gl.SCISSOR_TEST); // gl.scissor(x, transformY, width, height); const gl = this._gl; - gl.viewport(x, gl.drawingBufferHeight - y - height, width, height); + const lv = this._lastViewport; + + if (x !== lv.x || y !== lv.y || width !== lv.z || height !== lv.w) { + gl.viewport(x, y, width, height); + lv.setValue(x, y, width, height); + } } colorMask(r, g, b, a) { @@ -245,13 +251,16 @@ export class WebGLRenderer implements IHardwareRenderer { /** @ts-ignore */ (renderTarget._platformRenderTarget as GLRenderTarget)?._activeRenderTarget(); const { width, height } = renderTarget; - gl.viewport(0.0, 0.0, width, height); + this.viewport(0, 0, width, height); } else { gl.bindFramebuffer(gl.FRAMEBUFFER, null); const viewport = camera.viewport; - const width = gl.drawingBufferWidth; - const height = gl.drawingBufferHeight; - this.viewport(viewport.x * width, viewport.y * height, viewport.z * width, viewport.w * height); + const { drawingBufferWidth, drawingBufferHeight } = gl; + const width = drawingBufferWidth * viewport.z; + const height = drawingBufferHeight * viewport.w; + const x = viewport.x * drawingBufferWidth; + const y = drawingBufferHeight - viewport.y * drawingBufferHeight - height; + this.viewport(x, y, width, height); } } From e6f525de45a054960572798763b6483f2d240b4c Mon Sep 17 00:00:00 2001 From: "shensi.zxd" Date: Fri, 10 Sep 2021 17:22:53 +0800 Subject: [PATCH 2/2] perf: release clearColor gpu command --- packages/rhi-webgl/src/WebGLRenderer.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/rhi-webgl/src/WebGLRenderer.ts b/packages/rhi-webgl/src/WebGLRenderer.ts index 0d8fce3a2d..03c4f21ea0 100644 --- a/packages/rhi-webgl/src/WebGLRenderer.ts +++ b/packages/rhi-webgl/src/WebGLRenderer.ts @@ -70,7 +70,10 @@ export class WebGLRenderer implements IHardwareRenderer { private _activeTextureID: number = WebGLRenderingContext.TEXTURE0; private _activeTextures: GLTexture[] = new Array(32); - private _lastViewport: Vector4 = new Vector4(NaN, NaN, NaN, NaN); + + // cache value + private _lastViewport: Vector4 = new Vector4(undefined, undefined, undefined, undefined); + private _lastClearColor: Color = new Color(undefined, undefined, undefined, undefined); get isWebGL2() { return this._isWebGL2; @@ -211,11 +214,18 @@ export class WebGLRenderer implements IHardwareRenderer { } = engine._lastRenderState; let clearFlag = gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT; + if (clearFlags === CameraClearFlags.DepthColor) { - clearFlag = clearFlag | gl.COLOR_BUFFER_BIT; - if (clearColor) { - gl.clearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a); + clearFlag |= gl.COLOR_BUFFER_BIT; + + const lc = this._lastClearColor; + const { r, g, b, a } = clearColor; + + if (clearColor && (r !== lc.r || g !== lc.g || b !== lc.b || a !== lc.a)) { + gl.clearColor(r, g, b, a); + lc.setValue(r, g, b, a); } + if (targetBlendState.colorWriteMask !== ColorWriteMask.All) { gl.colorMask(true, true, true, true); targetBlendState.colorWriteMask = ColorWriteMask.All;