Performance Away3D 4.1性能问题-如何优化具有多个相同网格的场景?
我已经使用Away3D 4.1(2500个立方体)创建了一个简单的测试,但是性能比我预期的要低很多-只有10 FPS 我假设我犯了一个noob错误(作为一个noob和所有的错误),所以下面是相关的代码片段: 照明:Performance Away3D 4.1性能问题-如何优化具有多个相同网格的场景?,performance,actionscript-3,flash,stage3d,away3d,Performance,Actionscript 3,Flash,Stage3d,Away3d,我已经使用Away3D 4.1(2500个立方体)创建了一个简单的测试,但是性能比我预期的要低很多-只有10 FPS 我假设我犯了一个noob错误(作为一个noob和所有的错误),所以下面是相关的代码片段: 照明: var light1:DirectionalLight = new DirectionalLight(); light1.position = new Vector3D(400, 300, -200); light1.lookAt(new Vector3D()); light1.co
var light1:DirectionalLight = new DirectionalLight();
light1.position = new Vector3D(400, 300, -200);
light1.lookAt(new Vector3D());
light1.color = 0xFFFFFF;
light1.ambient = 0.25;
lightPicker = new StaticLightPicker([light1]);
创建多维数据集:
var material:ColorMaterial = new ColorMaterial(0x999999);
material.lightPicker = lightPicker;
material.specular = 0;
var mesh:Mesh = new Mesh(new CubeGeometry(50, 50, 50), material);
for (var i:uint = 0; i < 50; i++)
{
for (var j:uint = 0; j < 50; j++)
{
var cube:Mesh = Mesh(mesh.clone());
cube.x = 100*(i-25);
cube.y = 25;
cube.z = 100*(j-25);
scene.addChild(cube);
}
}
Scout中的Stage3D输出显示,每个drawTriangle调用之间有许多调用,我的基本理解告诉我drawTriangle调用应该是“批处理的”
我知道其他一些框架有批处理方法,但我还没有找到任何与Away3D相关的方法
提前感谢您的帮助。是的,您应该批量处理抽奖电话。我对Away3D没有太多经验,但在快速浏览了他们的API参考之后,它似乎可以帮助您将所有这些立方体合并到一个大批量网格中 在调试播放器或发布版本中,您是获得10 fps的速度 我运行了你的代码,在调试播放器中获得了20 fps,但在发布版本中获得了50+fps 我尝试合并,但没有看到任何改进。另外,如果您想访问单个多维数据集,合并将使其变得非常复杂:)在以前的版本中,合并(感谢Varnius的发现)似乎是推荐的方法,但在4.1中不起作用(请参阅) 然而,用户kurono在论坛上发布了一个有效的解决方案(至少在我的场景中),因此我在这里复制了它,以防其他人也有同样的问题:
var material:ColorMaterial = new ColorMaterial(0x999999);
material.lightPicker = lightPicker;
material.specular = 0;
var mesh:Mesh = new Mesh(new CubeGeometry(50, 50, 50));
var meshes:Vector.<Mesh> = new Vector.<Mesh>();
for (var i:uint = 0; i < 50; i++)
{
for (var j:uint = 0; j < 50; j++)
{
var cube:Mesh = Mesh(mesh.clone());
cube.x = 100*(i-25);
cube.y = 25;
cube.z = 100*(j-25);
meshes.push(cube);
}
}
var bigMesh:Mesh = doMerge(meshes, material);
scene.add(bigMesh);
var-material:ColorMaterial=新的ColorMaterial(0x99999);
material.lightPicker=lightPicker;
material.specular=0;
var网格:网格=新网格(新立方计量法(50,50,50));
变量网格:向量新向量();
对于(变量i:uint=0;i<50;i++)
{
对于(变量j:uint=0;j<50;j++)
{
var cube:Mesh=Mesh(Mesh.clone());
立方体x=100*(i-25);
立方y=25;
立方体z=100*(j-25);
推(立方体);
}
}
var bigMesh:Mesh=doMerge(网格、材质);
场景。添加(bigMesh);
神奇之处在于doMerge()方法:
函数doMerge(网格:矢量,材质:材质基):网格
{
var-isub:ISubGeometry;
var rawVertsAll:向量。=新向量。();
var rawIndicesAll:向量。=新向量。();
var rawUVsAll:Vector.=新向量。();
var RAWNORMASLL:向量。=新向量。();
var RAWSALL:向量。=新向量。();
var偏移量:uint=0;
向量向量。;
var法线:向量。;
变量切线:向量。;
向量。;
var指数:向量。;
变量i:uint;
var j:uint;
变量k:uint;
对于(k=0;k
瞧!10fps变为60fpsJerome这一点很好-我想如果不使用调试器,我会获得更好的性能(可能是20fps,而不是10),但实际上它会上升到40fps-比我预期的效果要好得多。但我仍然希望像这样一个简单的世界能够不费吹灰之力地管理60fps。谢谢瓦纽斯,我会调查的
var material:ColorMaterial = new ColorMaterial(0x999999);
material.lightPicker = lightPicker;
material.specular = 0;
var mesh:Mesh = new Mesh(new CubeGeometry(50, 50, 50));
var meshes:Vector.<Mesh> = new Vector.<Mesh>();
for (var i:uint = 0; i < 50; i++)
{
for (var j:uint = 0; j < 50; j++)
{
var cube:Mesh = Mesh(mesh.clone());
cube.x = 100*(i-25);
cube.y = 25;
cube.z = 100*(j-25);
meshes.push(cube);
}
}
var bigMesh:Mesh = doMerge(meshes, material);
scene.add(bigMesh);
function doMerge(meshes:Vector.<Mesh>, material:MaterialBase):Mesh
{
var isub:ISubGeometry;
var rawVertsAll:Vector.<Number> = new Vector.<Number>();
var rawIndicesAll:Vector.<uint> = new Vector.<uint>();
var rawUVsAll:Vector.<Number> = new Vector.<Number>();
var rawNormalsAll:Vector.<Number> = new Vector.<Number>();
var rawTangentsAll:Vector.<Number> = new Vector.<Number>();
var offset:uint = 0;
var verts:Vector.<Number>;
var normals:Vector.<Number>;
var tangents:Vector.<Number>;
var uvs:Vector.<Number>;
var indices:Vector.<uint>;
var i:uint;
var j:uint;
var k:uint;
for (k = 0; k < meshes.length; k++)
{
var m:Mesh = meshes[k];
isub = m.geometry.subGeometries[0].cloneWithSeperateBuffers();
isub.applyTransformation(m.transform.clone());
verts = new Vector.<Number>();
normals = new Vector.<Number>();
tangents = new Vector.<Number>();
uvs = new Vector.<Number>();
indices = isub.indexData;
for (i = 0; i < isub.numVertices; i++)
{
verts.push(isub.vertexData[i * isub.vertexStride + isub.vertexOffset]);
verts.push(isub.vertexData[i * isub.vertexStride + isub.vertexOffset + 1]);
verts.push(isub.vertexData[i * isub.vertexStride + isub.vertexOffset + 2]);
normals.push(isub.vertexNormalData[i * isub.vertexNormalStride + isub.vertexNormalOffset]);
normals.push(isub.vertexNormalData[i * isub.vertexNormalStride + isub.vertexNormalOffset + 1]);
normals.push(isub.vertexNormalData[i * isub.vertexNormalStride + isub.vertexNormalOffset + 2]);
tangents.push(isub.vertexTangentData[i * isub.vertexTangentStride + isub.vertexTangentOffset]);
tangents.push(isub.vertexTangentData[i * isub.vertexTangentStride + isub.vertexTangentOffset + 1]);
tangents.push(isub.vertexTangentData[i * isub.vertexTangentStride + isub.vertexTangentOffset + 2]);
uvs.push(isub.UVData[i * isub.UVStride + isub.UVOffset]);
uvs.push(isub.UVData[i * isub.UVStride + isub.UVOffset + 1]);
}
for (j = 0; j < indices.length; j++)
{
indices[j] += offset;
}
offset += isub.numVertices;
rawVertsAll = rawVertsAll.concat(verts);
rawNormalsAll = rawNormalsAll.concat(normals);
rawTangentsAll = rawTangentsAll.concat(tangents);
rawUVsAll = rawUVsAll.concat(uvs);
rawIndicesAll = rawIndicesAll.concat(indices);
}
var geometry:Geometry = new Geometry();
var subGeometry:SubGeometry = new SubGeometry();
subGeometry.updateVertexData(rawVertsAll);
subGeometry.updateIndexData(rawIndicesAll);
subGeometry.updateUVData(rawUVsAll);
subGeometry.updateVertexNormalData(rawNormalsAll);
subGeometry.updateVertexTangentData(rawTangentsAll);
geometry.subGeometries.push(subGeometry);
return new Mesh(geometry, material);
}