Skip to content

Commit 638d58e

Browse files
ngokevindmarcos
authored andcommitted
remove some memory allocations from material code (#3789)
1 parent 31a7bd3 commit 638d58e

File tree

3 files changed

+67
-51
lines changed

3 files changed

+67
-51
lines changed

src/components/material.js

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,28 +70,35 @@ module.exports.Component = registerComponent('material', {
7070
},
7171

7272
updateBehavior: function () {
73+
var key;
74+
var sceneEl = this.el.sceneEl;
7375
var schema = this.schema;
7476
var self = this;
75-
var sceneEl = this.el.sceneEl;
76-
var tickProperties = {};
77-
var tick = function (time, delta) {
78-
Object.keys(tickProperties).forEach(function update (key) {
77+
var tickProperties;
78+
79+
function tickTime (time, delta) {
80+
var key;
81+
for (key in tickProperties) {
7982
tickProperties[key] = time;
80-
});
83+
}
8184
self.shader.update(tickProperties);
82-
};
85+
}
86+
8387
this.tick = undefined;
84-
Object.keys(schema).forEach(function (key) {
88+
89+
tickProperties = {};
90+
for (key in schema) {
8591
if (schema[key].type === 'time') {
86-
self.tick = tick;
92+
this.tick = tickTime;
8793
tickProperties[key] = true;
8894
}
89-
});
95+
}
96+
9097
if (!sceneEl) { return; }
91-
if (!this.tick) {
92-
sceneEl.removeBehavior(this);
93-
} else {
98+
if (this.tick) {
9499
sceneEl.addBehavior(this);
100+
} else {
101+
sceneEl.removeBehavior(this);
95102
}
96103
},
97104

@@ -117,6 +124,7 @@ module.exports.Component = registerComponent('material', {
117124
updateMaterial: function (oldData) {
118125
var data = this.data;
119126
var material = this.material;
127+
var oldDataHasKeys;
120128

121129
// Base material properties.
122130
material.alphaTest = data.alphaTest;
@@ -131,7 +139,8 @@ module.exports.Component = registerComponent('material', {
131139
material.blending = parseBlending(data.blending);
132140

133141
// Check if material needs update.
134-
if (Object.keys(oldData).length &&
142+
for (oldDataHasKeys in oldData) { break; }
143+
if (oldDataHasKeys &&
135144
(oldData.alphaTest !== data.alphaTest ||
136145
oldData.side !== data.side ||
137146
oldData.vertexColors !== data.vertexColors)) {

src/shaders/flat.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ module.exports.Shader = registerShader('flat', {
2323
* Adds a reference from the scene to this entity as the camera.
2424
*/
2525
init: function (data) {
26+
this.materialData = {color: new THREE.Color()};
2627
this.textureSrc = null;
27-
this.material = new THREE.MeshBasicMaterial(getMaterialData(data));
28+
getMaterialData(data, this.materialData);
29+
this.material = new THREE.MeshBasicMaterial(this.materialData);
2830
utils.material.updateMap(this, data);
2931
},
3032

@@ -39,25 +41,25 @@ module.exports.Shader = registerShader('flat', {
3941
* @param {object} data - Material component data.
4042
*/
4143
updateMaterial: function (data) {
42-
var material = this.material;
43-
data = getMaterialData(data);
44-
Object.keys(data).forEach(function (key) {
45-
material[key] = data[key];
46-
});
44+
var key;
45+
getMaterialData(data, this.materialData);
46+
for (key in this.materialData) {
47+
this.material[key] = this.materialData[key];
48+
}
4749
}
4850
});
4951

5052
/**
5153
* Builds and normalize material data, normalizing stuff along the way.
5254
*
5355
* @param {object} data - Material data.
54-
* @returns {object} data - Processed material data.
56+
* @param {object} materialData - Object to reuse.
57+
* @returns {object} Updated material data.
5558
*/
56-
function getMaterialData (data) {
57-
return {
58-
fog: data.fog,
59-
color: new THREE.Color(data.color),
60-
wireframe: data.wireframe,
61-
wireframeLinewidth: data.wireframeLinewidth
62-
};
59+
function getMaterialData (data, materialData) {
60+
materialData.color.set(data.color);
61+
materialData.fog = data.fog;
62+
materialData.wireframe = data.wireframe;
63+
materialData.wireframeLinewidth = data.wireframeLinewidth;
64+
return materialData;
6365
}

src/shaders/standard.js

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ module.exports.Shader = registerShader('standard', {
5959
* Adds a reference from the scene to this entity as the camera.
6060
*/
6161
init: function (data) {
62-
this.material = new THREE.MeshStandardMaterial(getMaterialData(data));
62+
this.materialData = {color: new THREE.Color(), emissive: new THREE.Color()};
63+
getMaterialData(data, this.materialData);
64+
this.material = new THREE.MeshStandardMaterial(this.materialData);
65+
6366
utils.material.updateMap(this, data);
6467
if (data.normalMap) { utils.material.updateDistortionMap('normal', this, data); }
6568
if (data.displacementMap) { utils.material.updateDistortionMap('displacement', this, data); }
@@ -87,11 +90,12 @@ module.exports.Shader = registerShader('standard', {
8790
* @returns {object} Material.
8891
*/
8992
updateMaterial: function (data) {
93+
var key;
9094
var material = this.material;
91-
data = getMaterialData(data);
92-
Object.keys(data).forEach(function (key) {
93-
material[key] = data[key];
94-
});
95+
getMaterialData(data, this.materialData);
96+
for (key in this.materialData) {
97+
material[key] = this.materialData[key];
98+
}
9599
},
96100

97101
/**
@@ -153,28 +157,29 @@ module.exports.Shader = registerShader('standard', {
153157
* Builds and normalize material data, normalizing stuff along the way.
154158
*
155159
* @param {object} data - Material data.
156-
* @returns {object} data - Processed material data.
160+
* @param {object} materialData - Object to use.
161+
* @returns {object} Updated materialData.
157162
*/
158-
function getMaterialData (data) {
159-
var newData = {
160-
color: new THREE.Color(data.color),
161-
emissive: new THREE.Color(data.emissive),
162-
emissiveIntensity: data.emissiveIntensity,
163-
fog: data.fog,
164-
metalness: data.metalness,
165-
roughness: data.roughness,
166-
wireframe: data.wireframe,
167-
wireframeLinewidth: data.wireframeLinewidth
168-
};
169-
170-
if (data.normalMap) { newData.normalScale = data.normalScale; }
171-
172-
if (data.ambientOcclusionMap) { newData.aoMapIntensity = data.ambientOcclusionMapIntensity; }
163+
function getMaterialData (data, materialData) {
164+
materialData.color.set(data.color);
165+
materialData.emissive.set(data.emissive);
166+
materialData.emissiveIntensity = data.emissiveIntensity;
167+
materialData.fog = data.fog;
168+
materialData.metalness = data.metalness;
169+
materialData.roughness = data.roughness;
170+
materialData.wireframe = data.wireframe;
171+
materialData.wireframeLinewidth = data.wireframeLinewidth;
172+
173+
if (data.normalMap) { materialData.normalScale = data.normalScale; }
174+
175+
if (data.ambientOcclusionMap) {
176+
materialData.aoMapIntensity = data.ambientOcclusionMapIntensity;
177+
}
173178

174179
if (data.displacementMap) {
175-
newData.displacementScale = data.displacementScale;
176-
newData.displacementBias = data.displacementBias;
180+
materialData.displacementScale = data.displacementScale;
181+
materialData.displacementBias = data.displacementBias;
177182
}
178183

179-
return newData;
184+
return materialData;
180185
}

0 commit comments

Comments
 (0)