Skip to content

Commit f928eef

Browse files
authored
Optimized updateShaders in forward-renderer (playcanvas#2638)
* optimized updateShaders in forward-renderer * let -> var fix * handle es5 compatibiity * updates based on comments
1 parent a246431 commit f928eef

File tree

2 files changed

+35
-41
lines changed

2 files changed

+35
-41
lines changed

src/scene/forward-renderer.js

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ var skipRenderAfter = 0;
119119

120120
var _skinUpdateIndex = 0;
121121

122+
var _tempMaterialSet = new Set();
123+
124+
122125
// The 8 points of the camera frustum transformed to light space
123126
var frustumPoints = [];
124127
for (var fp = 0; fp < 8; fp++) {
@@ -2291,58 +2294,49 @@ Object.assign(ForwardRenderer.prototype, {
22912294
},
22922295

22932296
updateShaders: function (drawCalls) {
2294-
// #ifdef PROFILER
2295-
var time = now();
2296-
// #endif
2297-
2298-
var i;
2299-
// Collect materials
2300-
var materials = [];
2301-
for (i = 0; i < drawCalls.length; i++) {
2302-
var drawCall = drawCalls[i];
2303-
if (drawCall.material !== undefined) {
2304-
if (materials.indexOf(drawCall.material) === -1) {
2305-
materials.push(drawCall.material);
2297+
var mat, count = drawCalls.length;
2298+
for (var i = 0; i < count; i++) {
2299+
mat = drawCalls[i].material;
2300+
if (mat) {
2301+
// material not processed yet
2302+
if (!_tempMaterialSet.has(mat)) {
2303+
_tempMaterialSet.add(mat);
2304+
2305+
if (mat.updateShader !== Material.prototype.updateShader) {
2306+
mat.clearVariants();
2307+
mat.shader = null;
2308+
}
23062309
}
23072310
}
23082311
}
2309-
// Clear material shaders
2310-
for (i = 0; i < materials.length; i++) {
2311-
var mat = materials[i];
2312-
if (mat.updateShader !== Material.prototype.updateShader) {
2313-
mat.clearVariants();
2314-
mat.shader = null;
2315-
}
2316-
}
23172312

2318-
// #ifdef PROFILER
2319-
this.scene._stats.updateShadersTime += now() - time;
2320-
// #endif
2313+
// keep temp set empty
2314+
_tempMaterialSet.clear();
23212315
},
23222316

23232317
updateLitShaders: function (drawCalls) {
2324-
// #ifdef PROFILER
2325-
var time = now();
2326-
// #endif
2327-
2328-
for (var i = 0; i < drawCalls.length; i++) {
2329-
var drawCall = drawCalls[i];
2330-
if (drawCall.material !== undefined) {
2331-
var mat = drawCall.material;
2332-
if (mat.updateShader !== Material.prototype.updateShader) {
2333-
if (mat.useLighting === false || (mat.emitter && !mat.emitter.lighting)) {
2334-
// skip unlit standard and particles materials
2335-
continue;
2318+
var mat, count = drawCalls.length;
2319+
for (var i = 0; i < count; i++) {
2320+
mat = drawCalls[i].material;
2321+
if (mat) {
2322+
// material not processed yet
2323+
if (!_tempMaterialSet.has(mat)) {
2324+
_tempMaterialSet.add(mat);
2325+
2326+
if (mat.updateShader !== Material.prototype.updateShader) {
2327+
2328+
// only process lit materials
2329+
if (mat.useLighting && (!mat.emitter || mat.emitter.lighting)) {
2330+
mat.clearVariants();
2331+
mat.shader = null;
2332+
}
23362333
}
2337-
mat.clearVariants();
2338-
mat.shader = null;
23392334
}
23402335
}
23412336
}
23422337

2343-
// #ifdef PROFILER
2344-
this.scene._stats.updateShadersTime += now() - time;
2345-
// #endif
2338+
// keep temp set empty
2339+
_tempMaterialSet.clear();
23462340
},
23472341

23482342
beginFrame: function (comp) {

src/scene/scene.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ function Scene() {
140140
lastStaticPrepareWriteTime: 0,
141141
lastStaticPrepareTriAabbTime: 0,
142142
lastStaticPrepareCombineTime: 0,
143-
updateShadersTime: 0
143+
updateShadersTime: 0 // deprecated
144144
};
145145

146146
this.updateShaders = true;

0 commit comments

Comments
 (0)