1

Chrome 22 (9 月 25 日の安定版リリース)のアップグレード以降、プログラムに理解できない新しいバグを発見しました。

私のjavascriptプログラムは次のことを行います:

  1. arraybufferasynchrone を使用して、バイナリ ファイル (STL メッシュ) を取得しますXMLHttpRequest
  2. ファイルが読み込まれると、 を使用して解析し、やDataViewなどの読み取りメソッドを呼び出します。解析データは、ファイルの読み込みと解析に使用されたオブジェクトの配列に格納されます。data.getFloat32(offset, isLittleEndian)data.getUint32(offset, isLittleEndian)
  3. 続行する前にすべてのファイルがロードされるのを確実に待つバリアを実装しました
  4. すべてのファイルがロードされたら、各ローダーを調べて、以下に示すように、解析されて配列に格納されたデータを使用して for ループでオブジェクトを作成します。

    var geom = new THREE.Geometry();
    for(var v = 0; v < this.result[0].length; v++) {
        geom.vertices.push(new THREE.Vertex(new THREE.Vector3(this.result[0][v][0],
                                                              this.result[0][v][1],
                                                              this.result[0][v][2])));
    }
    
    for(var f = 0; f < this.result[1].length; f++) {
        geom.faces.push(new THREE.Face3(this.result[1][f][0],
                                        this.result[1][f][1],
                                        this.result[1][f][2]));
    }
    
  5. 問題は、これらのループの後、配列geom.facesundefined

このコンポートメントを修正する方法を見つけましたが、なぜそれが何かを変更するのか理解できませんでした: ここに示すように、配列の長さを変数に格納します:

var geom = new THREE.Geometry();
var vl = this.result[0].length; // <===  | these are the added variables
var fl = this.result[1].length; // <===  | that fix the bug
for(var v = 0; v < vl; v++) {
    geom.vertices.push(new THREE.Vertex(new THREE.Vector3(this.result[0][v][0],
                                                          this.result[0][v][1],
                                                          this.result[0][v][2])));
}

for(var f = 0; f < fl; f++) {
    geom.faces.push(new THREE.Face3(this.result[1][f][0],
                                    this.result[1][f][1],
                                    this.result[1][f][2]));
}

コードの最初のバージョンで何が起こるのか、なぜ配列が失われるのかを誰かが説明してくれれば、非常にありがたいです。

4

0 に答える 0