2

Away3D 4.1 (2500 キューブ) を使用して簡単なテストを作成しましたが、パフォーマンスは予想よりもはるかに低く、わずか 10 FPS です。

私は初心者の間違いを犯していると思います(初心者であり、すべてです)ので、関連するコードは次のとおりです。

点灯:

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);
    }
}

そしてカメラ:

camera = new Camera3D();
camera.position = new Vector3D(0, 1000, -5000);
camera.lookAt(new Vector3D(0, 0, 0));
camera.lens.far = 10000;

Scout の Stage3D 出力は、各 drawTriangles 呼び出しの間に多くの呼び出しがあることを示しており、私の基本的な理解では、drawTriangle 呼び出しは「バッチ処理」する必要があることがわかります。

他のいくつかのフレームワークにはバッチ メソッドがあることは知っていますが、Away3D に関連するものを見つけることができませんでした。

助けてくれてありがとう。

4

3 に答える 3

3

以前のバージョンでは Merge (見つけてくれた Varnius に感謝) が推奨される方法のようですが、4.1 では機能しません ( away3d フォーラムのスレッドを参照)。

ただし、ユーザー 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);

魔法は doMerge() メソッドにあります。

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);
}

そして出来上がり!10fpsが60fpsになる

于 2013-05-01T05:51:46.157 に答える
2

デバッグ プレーヤーまたはリリース バージョンで 10 fps を取得していますか?

私はあなたのコードを実行し、デバッグ プレーヤーで 20 fps を取得しましたが、リリース バージョンでは 50+ fps を取得しました。

マージを試みましたが、改善は見られませんでした。さらに、個々のキューブにアクセスしたい場合、マージすると非常に複雑になります:)ここに画像の説明を入力

于 2013-04-30T13:42:37.683 に答える
2

ええ、ドローコールをバッチ処理する必要があります。私は Away3D の経験があまりありませんが、API リファレンスをざっと見てみると、away3d.tools.commands.Mergeは、これらすべてのキューブを 1 つの大きなバッチ メッシュにマージするのに役立つようです。

于 2013-04-30T09:07:09.500 に答える