Geometry 합치기

다수의 Mesh를 scene에서 사용할 때  performance를 향상시키기 위한 방법 중의 하나가 Geometry merge이다. 같은 material를 사용할 때 가능한 방법으로 다수의 mesh를 사용하는 것이 아니라 다수의 geometry를 생성하여 하나로 병합한 후에 mesh 하나만을 사용하는 것이다.

기존의 방법

var scene = new THREE.Scene();

var cubeGeo = new THREE.BoxGeometry( 10, 10, 10 );
var material = new THREE.MeshNormalMaterial();

for ( var i = 0; i < 10000; i++ ) {
    var mesh = new THREE.Mesh( cubeGeo, material );
    mesh.position.x = -200 + Math.round((Math.random() * 400));
    mesh.position.y = -200 + Math.round((Math.random() * 400));
    mesh.position.z = -200 + Math.round((Math.random() * 400));
    scene.add( mesh );
}

Geometry의 merge

var scene = new THREE.Scene();

var mergedGeo = new THREE.Geometry(); // 하나로 병합할 geometry생성
var cubeGeo = new THREE.BoxGeometry( 10, 10, 10 );
var material = new THREE.MeshNormalMaterial();

for ( var i = 0; i < 10000; i++ ) {

    var mesh = new THREE.Mesh( cubeGeo, material );
    mesh.position.x = -200 + Math.round((Math.random() * 400));
    mesh.position.y = -200 + Math.round((Math.random() * 400));
    mesh.position.z = -200 + Math.round((Math.random() * 400));


    // THREE.GeometryUtils.merge(mergedGeo, mesh); // 구 버전에서는 Geometry를 합치려면 이 메서드를 사용해야 한다.
    mesh.updateMatrix(); // 반드시 matrix을 업데이트 한다.
    mergedGeo.merge( mesh.geometry, mesh.matrix ); // geometry의 메서드인 merge를 사용하여 mergedGeo에 병합한다. 

}
var mergedMesh = new THREE.Mesh( mergedGeo, material ); // mergedGeo를 사용하여 mesh를 생성한다.
scene.add( mergedMesh );

( Three.js v79 사용 )