LSL HttpServer - 在 Secondlife 上提供来自 Prim Inventory 的大型 Notecards

LSL HttpServer - Serving large Notecards from Prim Inventory on Secondlife

我正在编写一个 Media-HUD,它完全在存储在 prim 库存中的本地记事卡文件上运行,记事卡命名为 index.html、style.css、icon.svg 等。

我希望使用 LSL HttpServer 函数和脚本 URL 创建一个完全独立的基于媒体的 HUD,它像编辑任何网页一样易于编辑。

这本身是完全可能的,但是有一个限制,页面必须适合分配给 LSL 脚本的内存。在单声道下,这只有 64kb。

我想以某种方式消除此限制,也许是从 javascript 开始,在用户浏览器中逐行读取记事卡中的每个 'file'(因此,绕过了内存限制通过一次只将一个记事卡行放入内存)。

有办法吗?通过逐行加载组成文件的字符串,以程序方式在 javascript 中生成整个文件,然后将其作为整个文件提供?我不确定这有多可行。

任何想法's/guidance非常感谢!

您可以通过 Javascript 使用 XMLHttpRequest. jQuery's wrapper for this is called Ajax 来完成此操作。您可以单独请求每一行,这会稍微慢一些,或者在脚本空闲时一次读取多行。 http_request 未被限制,因此两者都有效。请注意,加载程序必须在单个响应中发送,因为 LSL 服务器无法像实际服务器那样推送数据 "piecemeal"。

备注:

  • llGetNotecardLine 仅 returns 每行的前 255 个字节。
  • llHTTPResponse 必须在请求后约 20 秒内调用,因此您一次无法从记事卡中读取超过 20 行。
  • 我不确定这对非 DOM 文件类型有何影响。所有文件都需要使用 Javascript DOM 嵌入到 HTML 中。据我所知,Javascript 不能任意创建外部文件并将其提供给自己。显然它不适用于非文本文件类型,但您当然可以加载 HTML、CSS 和 HTML5 SVG 的其余部分。基本上,如果它可以放在一个 HTML 文件中,您可以通过 Javascript.
  • 加载它

我没有使用 React 的经验,但它提供了一个很好的例子,说明在 UI 方面可以完全通过 Javascript.

加载内容

所以每个脚本最多在内存中少于 64,000 个字符。我会给你一些建议,可能会使你的任务可行:

外部资源

通过从网络 Bootstrap, React 等中获取流行的库,最大限度地减少记事卡中必须包含的代码量。 您将不得不依赖他们镜像的可用性思想。但它会大大减少提供漂亮和功能页面所需的内存量。

精简代码

使用 Uglify or Closure Compiler 等工具让您的 javascript 更轻便。尽管您必须小心,因为这些工具默认情况下会将您的所有代码放入一个长行,并且您不能使用 LSL 读取超过 255 个字符的行。幸运的是,您可以在这些工具中自定义选项以限制每行的字符数。

分而治之

由于单个脚本无法处理太多内存,请制作专用脚本。一个可以提供资源(充当文件服务器,提供您的 html 和 js),而另一个将接收 API 请求调用,以处理应用程序的逻辑。