浏览代码

Merge pull request #18418 from aardgoose/dev

WebGLAttributes: Reduce heap allocations when using WebGL2 and partial buffer updates.
Michael Herzog 5 年之前
父节点
当前提交
d78d60d626
共有 3 个文件被更改,包括 15 次插入5 次删除
  1. 1 1
      src/renderers/WebGLRenderer.js
  2. 2 1
      src/renderers/webgl/WebGLAttributes.d.ts
  3. 12 3
      src/renderers/webgl/WebGLAttributes.js

+ 1 - 1
src/renderers/WebGLRenderer.js

@@ -278,7 +278,7 @@ function WebGLRenderer( parameters ) {
 		info = new WebGLInfo( _gl );
 		properties = new WebGLProperties();
 		textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
-		attributes = new WebGLAttributes( _gl );
+		attributes = new WebGLAttributes( _gl, capabilities );
 		geometries = new WebGLGeometries( _gl, attributes, info );
 		objects = new WebGLObjects( _gl, geometries, attributes, info );
 		morphtargets = new WebGLMorphtargets( _gl );

+ 2 - 1
src/renderers/webgl/WebGLAttributes.d.ts

@@ -1,9 +1,10 @@
+import { WebGLCapabilities } from "./WebGLCapabilities";
 import { BufferAttribute } from "../../core/BufferAttribute";
 import { InterleavedBufferAttribute } from "../../core/InterleavedBufferAttribute";
 
 export class WebGLAttributes {
 
-	constructor( gl: WebGLRenderingContext | WebGL2RenderingContext );
+	constructor( gl: WebGLRenderingContext | WebGL2RenderingContext, capabilities: WebGLCapabilities );
 
 	get( attribute: BufferAttribute | InterleavedBufferAttribute ): {
 		buffer: WebGLBuffer,

+ 12 - 3
src/renderers/webgl/WebGLAttributes.js

@@ -2,7 +2,7 @@
  * @author mrdoob / http://mrdoob.com/
  */
 
-function WebGLAttributes( gl ) {
+function WebGLAttributes( gl, capabilities ) {
 
 	var buffers = new WeakMap();
 
@@ -78,8 +78,17 @@ function WebGLAttributes( gl ) {
 
 		} else {
 
-			gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
-				array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );
+			if ( capabilities.isWebGL2 ) {
+
+				gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
+					array, updateRange.offset, updateRange.count );
+
+			} else {
+
+				gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
+					array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );
+
+			}
 
 			updateRange.count = - 1; // reset range