浏览代码

Merge pull request #6328 from barroij/prevent_allocation_in_frame

prevent allocation each Frame
David Catuhe 6 年之前
父节点
当前提交
e343c795aa
共有 2 个文件被更改,包括 14 次插入8 次删除
  1. 10 5
      src/Meshes/linesMesh.ts
  2. 4 3
      src/Rendering/renderingGroup.ts

+ 10 - 5
src/Meshes/linesMesh.ts

@@ -1,6 +1,6 @@
 import { Nullable } from "../types";
 import { Scene } from "../scene";
-import { Color3 } from "../Maths/math";
+import { Color3, Color4 } from "../Maths/math";
 import { Node } from "../node";
 import { VertexBuffer } from "../Meshes/buffer";
 import { SubMesh } from "../Meshes/subMesh";
@@ -9,10 +9,10 @@ import { InstancedMesh } from "../Meshes/instancedMesh";
 import { Effect } from "../Materials/effect";
 import { Material } from "../Materials/material";
 import { ShaderMaterial } from "../Materials/shaderMaterial";
+import { MaterialHelper } from '../Materials/materialHelper';
 
 import "../Shaders/color.fragment";
 import "../Shaders/color.vertex";
-import { MaterialHelper } from '../Materials/materialHelper';
 
 /**
  * Line mesh
@@ -37,6 +37,8 @@ export class LinesMesh extends Mesh {
 
     private _colorShader: ShaderMaterial;
 
+    private color4 : Color4;
+
     /**
      * Creates a new LinesMesh
      * @param name defines the name
@@ -58,11 +60,11 @@ export class LinesMesh extends Mesh {
         /**
          * If vertex color should be applied to the mesh
          */
-        public useVertexColor?: boolean,
+        public readonly useVertexColor?: boolean,
         /**
          * If vertex alpha should be applied to the mesh
          */
-        public useVertexAlpha?: boolean
+        public readonly useVertexAlpha?: boolean
     ) {
         super(name, scene, parent, source, doNotCloneChildren);
 
@@ -89,6 +91,7 @@ export class LinesMesh extends Mesh {
 
         if (!useVertexColor) {
             options.uniforms.push("color");
+            this.color4 = new Color4();
         }
         else {
             options.defines.push("#define VERTEXCOLOR");
@@ -177,7 +180,9 @@ export class LinesMesh extends Mesh {
 
         // Color
         if (!this.useVertexColor) {
-            this._colorShader.setColor4("color", this.color.toColor4(this.alpha));
+            const { r, g, b } = this.color;
+            this.color4.set(r, g, b, this.alpha);
+            this._colorShader.setColor4("color", this.color4);
         }
 
         // Clip planes

+ 4 - 3
src/Rendering/renderingGroup.ts

@@ -1,7 +1,7 @@
 import { SmartArray } from "../Misc/smartArray";
 import { SubMesh } from "../Meshes/subMesh";
 import { AbstractMesh } from "../Meshes/abstractMesh";
-import { Nullable } from "../types";
+import { Nullable, DeepImmutable } from "../types";
 import { Vector3 } from "../Maths/math";
 import { IParticleSystem } from "../Particles/IParticleSystem";
 import { IEdgesRenderer } from "./edgesRenderer";
@@ -18,6 +18,7 @@ import { Camera } from "../Cameras/camera";
  * @hidden
  */
 export class RenderingGroup {
+    private static _zeroVector : DeepImmutable<Vector3> = Vector3.Zero();
     private _scene: Scene;
     private _opaqueSubMeshes = new SmartArray<SubMesh>(256);
     private _transparentSubMeshes = new SmartArray<SubMesh>(256);
@@ -202,11 +203,11 @@ export class RenderingGroup {
     private static renderSorted(subMeshes: SmartArray<SubMesh>, sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>, camera: Nullable<Camera>, transparent: boolean): void {
         let subIndex = 0;
         let subMesh: SubMesh;
-        let cameraPosition = camera ? camera.globalPosition : Vector3.Zero();
+        let cameraPosition = camera ? camera.globalPosition : RenderingGroup._zeroVector;
         for (; subIndex < subMeshes.length; subIndex++) {
             subMesh = subMeshes.data[subIndex];
             subMesh._alphaIndex = subMesh.getMesh().alphaIndex;
-            subMesh._distanceToCamera = subMesh.getBoundingInfo().boundingSphere.centerWorld.subtract(cameraPosition).length();
+            subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);
         }
 
         let sortedArray = subMeshes.data.slice(0, subMeshes.length);