13

我目前正在开发一些基于游戏的网络脚本(将游戏移植到网络)。脚本从我的网络主机下载数据,因此加载速度很慢(必须下载每个文件:地图、模型、纹理......)。为了纠正这个问题,我添加了一个选项,允许用户在他们的计算机中选择他们的本地游戏数据(使用文件 API - 拖放)以直接从本地解析内容并避免从网络下载多个大型游戏,结果非常快.

这里的问题是:每次他们重新加载浏览器时,他们都必须一次又一次地重新选择他们的文件。这不是用户友好的。

那么,有没有办法从这个游戏存档中保留参考,以避免用户每次都重新进行拖放?我知道安全问题,只是想知道是否有类似持久 URL.createObjectURL() 的东西。

注意:游戏数据大约是~2Go,因此无法将其存储在 FileSystem API 中(我不想复制它,当您可以保留对它的引用时复制数据很浪费空间)。

谢谢 :)

4

2 回答 2

4

你必须有来自用户的输入

未经用户确认,无法访问客户端计算机上的文件。一旦用户选择了一个文件(您可以通过事件收听它change),您就可以使用FileReader API来读取文件。

document.getElementById("input").addEventListener("change", function() {
    const fs = new FileReader();
    fs.readAsText(this.files[0]);
    fs.onloadend = function() {
        document.getElementById("output").innerText = fs.result;
    }
});
<input id="input" type="file" />
<div id="output"></div>

用于localStorage存储一小部分文件

您可以使用localStorage API来存储一些文件,但容量非常有限,尤其是对于像您这样的项目(在当前最流行的浏览器上最大为 5 到 10 MB)。

这将使您的编码变得更加困难,因为您每次都必须检查是否存储了哪些内容,并加载未保存的内容。

缓存

通过使用缓存,您基本上会遇到与使用相同的问题localStorage:每个浏览器都有自己的最大容量。

这种方法的优点是您不必担心已加载或未加载的内容,因为浏览器会自行执行此操作。

使用闪存

现在,如果您真的完全不关心安全性,您可以使用 Flash 插件来存储和加载文件,然后ExternalInterface在 JavaScript 代码中使用它来加载数据。

ExternalInterface.call("loaded", filename, data);

// And then in JavaScript:
// function loaded(filename, data)
// ...

您可以使用它SharedObject来保存和加载您的数据。

我不是 AS3 专家,请原谅任何笨拙。

桌面应用程序?

最后一个选项是将您的游戏转换并捆绑到桌面应用程序中,例如通过电子捆绑它,然后使用例如NeDB,这是目前电子建议的持久存储工具。

于 2016-12-13T05:06:40.073 回答
2

您可能需要考虑使用IndexedDB。最近的浏览器支持它,包括 Chrome、Firefox 和 Safari(macOS 和 iOS)。IndexedDB 允许您将或作为值保存在 IndexedDB 对象存储中BlobFileArrayBuffer

检查这个IndexedDB:将文件存储为 File 或 Blob 或 ArrayBuffer。什么是最好的选择?.

于 2016-12-13T05:21:31.230 回答