【问题标题】:best way to load binary WebGL model through ajax?通过 ajax 加载二进制 WebGL 模型的最佳方法?
【发布时间】:2012-08-01 15:26:41
【问题描述】:

我一直在使用 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' 发送数据

换句话说,我基本上必须逐个字符地从“流”中复制数据来初始化数组缓冲区。我想知道是否有更好(更直接)的方法来做到这一点?也许直接从流中实例化arraybuffer ?..

ps。我知道还有 jDataView 库,但它基本上是一样的

【问题讨论】:

  • 首先,我在这里学到了一些检查位的知识。
  • 首先,我在这里学到了一些检查位明智的东西。从 PHP 我可以告诉你任何时候你都可以更好地使用自然函数“方法/函数”。我写了一个基准,比较了 php array_filter 和传统的 for 循环,array_filter 方法的资源和时间使用率提高了大约 2 倍。从臀部尝试.... bytes = stream.map(function(where){charCodeAt(where) & 0xff};);我知道这不会改变你算法的基本方法。但这可能会使它或多或少地提高 2 倍。
  • 嗯,有趣的想法.. 作为 C++ 程序员,老实说,我在 javascript 方面不是很先进。我会试试这个。
  • 我建议简要了解一下方案,其中 javascript 借鉴了很多想法。不过,在进一步的检查中,完全有可能 javascript 没有完全正确地 .map ,我不知道。无论如何,“尾调用递归”是一个非常棒的想法,忽略它是愚蠢的。我可以告诉你,你是 C++ 学校的,那些人很聪明。

标签: ajax webgl


【解决方案1】:

执行类似于下面的代码 sn-p 的操作以将数据作为二进制数组获取(来自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();

【讨论】:

  • 您也可以使用 DataView 类处理“arraybuffer”...另外,从服务器端尝试使用 Content-type: application/octet-stream 并直接使用二进制数据传输,不需要进行逐个字符的表示。
  • 谢谢,非常有趣。我不知道 AJAX 有一个特定的选项。我想知道它是否也适用于其他浏览器(例如 Chrome)?
  • @Chiguireitor:在服务器端我执行以下操作: fprintf(cgiOut, "Content-type: text/plain; charset=x-user-defined\r\n\r\n") ;数据的编码方式有什么不同吗?
  • 是的,它有很大的不同,对于初学者来说,一些浏览器为“text/*”内容类型实现了不同的语义。您应该使用“application/octet-stream”,这样浏览器就不会将您的数据解释为文本。这种方式在我的二进制加载器中对我有用。此外,这一切都适用于 Chrome 和 Firefox。
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2020-09-13
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多