Not by my testing, at least.
My original example is a simple one to explain what the procedure is. Here’s a
more complex example, from my code, from my mesh classes. This function
updates the vertices in the mesh based on the position of the bones of a
skeleton, it gets called every frame for every model mesh that can be seen in
the scene:
updateVertexesToPoseAndPosition(view,skeleton,angle,position)
{
var n,v;
var bone,parentBone;
// move all the vertexes
var vIdx=0;
var nIdx=0;
for (n=0;n!==this.vertexCount;n++) {
v=this.vertexList[n];
// bone movement
bone=skeleton.bones[v.boneIdx];
this.rotVector.setFromPoint(v.vectorFromBone);
this.rotVector.rotate(bone.curPoseAngle);
this.rotVector.x=bone.curPosePosition.x+this.rotVector.x;
this.rotVector.y=bone.curPosePosition.y+this.rotVector.y;
this.rotVector.z=bone.curPosePosition.z+this.rotVector.z;
this.rotNormal.setFromPoint(v.normal);
this.rotNormal.rotate(bone.curPoseAngle);
// average in any parent movement
if (v.parentBoneIdx!==-1) {
parentBone=skeleton.bones[v.parentBoneIdx];
this.parentRotVector.setFromPoint(v.vectorFromParentBone);
this.parentRotVector.rotate(parentBone.curPoseAngle);
this.parentRotVector.x=parentBone.curPosePosition.x+this.parentRotVector.x;
this.parentRotVector.y=parentBone.curPosePosition.y+this.parentRotVector.y;
this.parentRotVector.z=parentBone.curPosePosition.z+this.parentRotVector.z;
this.parentRotNormal.setFromPoint(v.normal);
this.parentRotNormal.rotate(parentBone.curPoseAngle);
this.rotVector.average(this.parentRotVector);
this.rotNormal.average(this.parentRotNormal);
}
// whole model movement
this.rotVector.rotate(angle);
this.drawVertices[vIdx++]=this.rotVector.x+position.x;
this.drawVertices[vIdx++]=this.rotVector.y+position.y;
this.drawVertices[vIdx++]=this.rotVector.z+position.z;
this.rotNormal.rotate(angle);
this.drawNormals[nIdx++]=this.rotNormal.x;
this.drawNormals[nIdx++]=this.rotNormal.y;
this.drawNormals[nIdx++]=this.rotNormal.z;
}
// set the buffers
var gl=view.gl;
gl.bindBuffer(gl.ARRAY_BUFFER,this.vertexPosBuffer);
gl.bufferData(gl.ARRAY_BUFFER,this.drawVertices,gl.DYNAMIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER,this.vertexNormalBuffer);
gl.bufferData(gl.ARRAY_BUFFER,this.drawNormals,gl.STATIC_DRAW);
}
Notice that rotVector, rotNormal, parentRotVector, and parentRotNormal, are all
“this”, i.e., globals. They are *only* used in this function, no where else in
the class. If I put them as local variables, I get enormous GC pauses. If I
don’t, I get none (granted, I have to do this everywhere, so it’s just not this
function.)
The example I gave existed only to show how it would work; not a real example.
Here’s a real example, that shows obvious problems with local variables. Yes,
these are objects.
Not that moving the objects would ONLY be something that happened at compile
time and would be a hint; they wouldn’t be effected in the warm up runs. You’d
almost have to say that same hint would force a compile (which has it’s own
problems.)
[>] Brian
> On May 12, 2016, at 1:33 PM, Allen Wirfs-Brock <[email protected]> wrote:
>
>
>> On May 12, 2016, at 9:39 AM, Brian Barnes <[email protected]> wrote:
>>
>> ...
>> If I call doSomething a lot of times, I get a lot of objects to be tracked
>> and GC’d. Yes, I can rewrite that code to obviously eliminate them, but
>> pretend there is actually something interesting happening here that requires
>> those variables. And engines can be smart enough to mark them and deal with
>> them with the function ends (I don’t know if this is done.)
>>
>> What I’m thinking is some kind of class based hint that would “super” hoist
>> all local function variables. It would be sugar but it would transform it
>> into:
>>
>
>
>
> Local variables like a,b,c in your example are probably the least expensive
> construct in JS. In your example, there are no objects created by
> doSomething, not state that persists after doSomething returns, and no GC
> pressure. Anything you do WRT moving such local state into object properties
> is going to be more expensive.
>
> Allen
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss