通过ajax加载二进制WebGL模型的最佳方法?

时间:2012-08-01 04:13:17

标签: ajax webgl

我一直在使用WebGL开发基于Web的3D应用程序。 在服务器端,生成二进制3D模型,由客户端使用AJAX下载。模型可以非常大(> 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'发送数据

换句话说,我基本上必须从'stream'char-by-char复制数据以初始化arraybuffer。我想知道是否有更好(更直接)的方法来做到这一点?也许直接从stream实例化arraybuffer?..

PS。我知道还有jDataView库,但它基本上做同样的

1 个答案:

答案 0 :(得分: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();