3

WebGL を使用して Web ベースの 3D アプリケーションを開発しています。サーバー側では、AJAX を使用してクライアントによってダウンロードされるバイナリ 3D モデルが生成されます。モデルは非常に大きくなる可能性があるため (> 200K)、テキスト形式で送信することは避けたいと考えています。現在、これを実現するために次のコードを使用しています。

stream = http.responseText; // results of ajax request
..... 
var len = stream.length;
var header_size = 4 + 4 + 4*2; 
var buf_sz = len + 16;
var buf = new ArrayBuffer(buf_sz);
var bytes = new Uint8Array(buf, 0, buf_sz);

for(i = 0; i < len; i++) {
    bytes[i] = stream.charCodeAt(i) & 0xff;
}
....    
// use these to initialize WebGL buffers
var verts = new Float32Array(buf, bytes_skip, n_verts*3);
var normals = new Float32Array(buf, bytes_skip + n_verts*12, n_verts*3);
var indices = new Uint16Array(buf, bytes_skip + n_verts*24, n_indices);
... 

一方、サーバー側では、「charset = x-user-defined」でデータを送信します

つまり、基本的に「ストリーム」から文字ごとにデータをコピーして、配列バッファを初期化する必要がありました。これを行うためのより良い(より直接的な)方法があるのだろうか?おそらく、ストリームから直接配列バッファをインスタンス化しますか?..

ps。jDataView ライブラリもあることは知っていますが、基本的には同じことを行います

4

1 に答える 1

2

データをバイナリ配列として取得するには、以下のコード スニペットのようなことを行います ( https://developer.mozilla.org/en/DOM/XMLHttpRequest/Using_XMLHttpRequestのコード例)。

var xhr = new XMLHttpRequest();  
xhr.open("GET", url, true);  
xhr.responseType = "arraybuffer";   
xhr.onload = function(e) {  
  var arraybuffer = xhr.response; // not responseText  
  /* ... */  
}  
xhr.send();
于 2012-08-01T07:26:41.083 に答える