Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果要使用arrayBuffer,请使用二进制文件或JSON文件_Javascript_Json_Webgl_Arraybuffer - Fatal编程技术网

Javascript 如果要使用arrayBuffer,请使用二进制文件或JSON文件

Javascript 如果要使用arrayBuffer,请使用二进制文件或JSON文件,javascript,json,webgl,arraybuffer,Javascript,Json,Webgl,Arraybuffer,我想为我的webgl应用程序获取一些数据。我需要将这些数据与着色器一起使用,所以我必须将它们放入ArrayBuffer。现在我这里有两个非常相似的代码片段。 首先,应使用二进制文件: function readBinaryFile(file) { var request = new XMLHttpRequest(); request.open('GET', file, true); request.responseType = "arraybuffer"; req

我想为我的webgl应用程序获取一些数据。我需要将这些数据与着色器一起使用,所以我必须将它们放入ArrayBuffer。现在我这里有两个非常相似的代码片段。 首先,应使用二进制文件:

function readBinaryFile(file) {
    var request = new XMLHttpRequest();
    request.open('GET', file, true);
    request.responseType = "arraybuffer";
    request.onload = function (e) {
        if (request.readyState === 4) {
            if (request.status === 200) {
                var buffer = request.response;
                // here I already have a Buffer, 
                // so Im just constructing TypedArray 
                var result = new Float32Array(buffer, 64, 4*3*250 );
            } else {
                console.error(request.statusText);
            }
        }
    };
    request.send(null);
};

readBinaryFile('data/file.bin'));
第二个应该使用json文件:

function readJSONFile(file) {
    var request = new XMLHttpRequest();
    request.open('GET', file, true);
    request.responseType = "arraybuffer";
    request.onload = function (e) {
        if (request.readyState === 4) {
            if (request.status === 200) {
                var jsonData = JSON.parse(request.responseText);
                // here I dont have a buffer, so 
                // it will create both Buffer and TypedArray
                var result = new Float32Array(jsonData.vertexPositions);
            } else {
                console.error(request.statusText);
            }
        }
    };
    request.send(null);
};

readJSONFile('data/file.json'));
我喜欢json文件的结构,我看到很多人都在使用它。但我觉得这有点脏,因为我做了一些我不必做的事情,比如解析大型json或请求responseText而不是二进制数据。我宁愿使用json的方式,但我的应用程序应该是非常好和快速的,所以可能它不值得

所以我的问题是,是否有人也考虑过它,并用它做了一些测试。多谢各位


PS:想想已经在浏览器数据存储中的100MB数据,或者在运行时加载一些数据

一般来说,如果您正在运行自己的服务器,您可以gzip压缩数据,并告诉服务器告诉浏览器数据已gzip,下载后它将在后台取消gzip

在这种情况下,您可能会发现发送文本比发送二进制文件小,因为文本更容易压缩

另一件要考虑的事情是格式化数据和/或使用有损格式来使数据非常小。作为一个简单的例子,如果您正在存储法线,您可能只会为每个X、Y、Z发送8位,然后在加载它们时将它们转换回浮点数,或者告诉GL为您执行此操作。另一个例子是量化你的位置。网格通常使用32位浮点存储。您可以计算网格的范围,然后将每个值转换为16位来存储数据,如中所示

  smallX = Math.floor((x - minX) * 65535 / (maxX - minX));
加载后,您可以使用

  originalX = smallX * (maxX - minX) / 65535 + minX;

您需要注意的唯一问题是发送二进制数据不是跨平台的。如果您的原始平台是little endian,而用户的浏览器是big endian,那么它将无法工作。像上面这样的库可能会处理这个问题。另一方面,目前还没有支持WebGL浏览器的通用big-endian平台,因此您可以忽略这个问题。但谁知道未来会怎样