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

通过ajax加载二进制WebGL模型的最佳方法?,ajax,webgl,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 +

我一直在使用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);
... 
stream=http.responseText;//ajax请求的结果
..... 
var len=流长度;
变量头大小=4+4+4*2;
var buf_sz=len+16;
var buf=新阵列缓冲器(buf_sz);
var bytes=新的Uint8Array(buf,0,buf_sz);
对于(i=0;i
而在服务器端,我使用“charset=x-user-defined”发送数据

换句话说,我基本上必须逐字符从“stream”复制数据来初始化arraybuffer。我想知道是否有更好(更直接)的方法来做到这一点?可能直接从流?实例化arraybuffer


另外,我知道还有jDataView库,但它基本上也有相同的功能,如下面的代码片段,以二进制数组的形式获取数据(代码示例来自:


首先,我在这里学到了检查位的方法。首先,我在这里学到了检查位的方法。从PHP我可以告诉你,任何时候你都可以更好地使用自然函数“方法/函数”。我编写了一个基准点,将php数组_过滤器与传统的for循环进行比较,对于数组_过滤器方法,资源和时间的使用率提高了大约2倍。从臀部试试。。。。bytes=stream.map(函数(where){charCodeAt(where)&0xff};);我知道这不会改变你的基本算法。但这可能会使它变得更好,大约是2倍。嗯,这是个有趣的想法。。作为C++程序员,我在JavaScript中不是很先进。我将尝试一下,我建议对scheme做一个简单的研究,javascript借鉴了大量的思想。不过,在进一步的检查中,完全有可能javascript没有完全正确地获取.map,我不知道。无论如何,“尾部调用递归”是一个非常棒的想法,忽略它是愚蠢的。我可以告诉你,C++学校的那些人很聪明,你也可以用DATAView类来处理“AdayFuffic”…另外,从服务器端尝试使用内容类型:应用程序/八位字节流,直接使用二进制数据传输,无需逐字符表示。谢谢,非常有趣。。我不知道AJAX对此有一个特定的选项。我想知道它在其他浏览器(如Chrome)中也能工作吗?@Chiguireitor:在服务器端,我执行以下操作:fprintf(cgiOut,“内容类型:text/plain;charset=x-user-defined\r\n\r\n”);数据的编码方式是否不同?是的,差异很大,对于初学者来说,一些浏览器对“text/*”内容类型实现了不同的语义。您应该使用“应用程序/八位字节流”,这样浏览器就不会将您的数据解释为文本。在我的二进制加载器中,这种方式对我很有效。而且,所有这些都适用于Chrome和Firefox。
var xhr = new XMLHttpRequest();  
xhr.open("GET", url, true);  
xhr.responseType = "arraybuffer";   
xhr.onload = function(e) {  
  var arraybuffer = xhr.response; // not responseText  
  /* ... */  
}  
xhr.send();