小编use*_*048的帖子

JavaScript:避免使用String.split的空字符串和正则表达式优先级

我正在创建一个语法高亮显示器,我使用String.split从输入字符串创建令牌.第一个问题是String.split创建了大量的空字符串,这导致一切都比它原本要慢得多.

例如,"***".split(/(\*)/)- > ["", "*", "", "*", "", "*", ""].有办法避免这种情况吗?

另一个问题是正则表达式本身的表达式优先级.假设我正在尝试解析C风格的多行注释.就是这样/* comment */.现在让我们假设输入字符串是"/****/".如果我使用下面的正则表达式,它会起作用,但产生许多额外的标记(以及所有那些空字符串!).

/(\/\*|\*\/|\*)/
Run Code Online (Sandbox Code Playgroud)

更好的方法是读取/*'s,*/然后*在一个标记中读取所有其余的.也就是说,上述字符串的更好结果是["/*", "**", "*/"].但是,当使用应该执行此操作的正则表达式时,我会得到错误的结果.正则表达式如下:/(\/\*|\*\/|\*+)/.

然而,这个表达式的结果如下:["/*", "***", "/"].我猜这是因为最后一部分是贪婪的,所以它从其他部分窃取了比赛.

我找到的唯一解决方案是制作一个否定的前瞻表达式,如下所示:

/(\/\*|\*\/|\*+(?!\/)/
Run Code Online (Sandbox Code Playgroud)

这给出了预期的结果,但与其他结果相比它非常慢,这对大字符串有影响.

是否有解决这些问题的方法?

javascript regex split tokenize

11
推荐指数
1
解决办法
4666
查看次数

HTML - 在不同的 <select> 之间共享 <option> 值

有什么办法可以<option>在不同标签之间共享标签吗<select>

我有很多选择,而且它们都有完全相同的选项。由于我不想用太多重复项填充 DOM,因此我更改为使用具有单个数据列表的输入来共享选项,但这两者都存在事件问题(仅在未聚焦时触发更改事件,或者客户端按下输入),并且还允许客户写任何他想要的内容,这确实不适合我的情况。

html

5
推荐指数
1
解决办法
1811
查看次数

JavaScript 函数内联

我有以下函数,它将 3 个元素从一个类似数组的对象复制到另一个:

function copy(a, b) { 
    a[0] = b[0];
    a[1] = b[1];
    a[2] = b[2];
    return a;
}
Run Code Online (Sandbox Code Playgroud)

该函数每帧被调用数万次。

几乎所有对它的调用都来自我的代码中的一个位置。

如果我在该单个位置手动内联它,以便直接在调用者中完成这些集合,我的代码会变得明显更快,这意味着引擎不会内联它。

有什么方法可以确保 JS 引擎内联它吗?这显然是一个热门函数。是否有任何奇怪的注释,或者反之亦然的某些代码模式不允许引擎内联函数?

我有许多类似的函数来处理向量和矩阵,因此在整个地方开始手动内联将非常麻烦且难看。

javascript performance inlining

5
推荐指数
0
解决办法
1027
查看次数

BigInteger 到 Uint8Array 字节

我需要在 JavaScript 中获取大整数的字节。

我尝试过几个大整数库,但实际提供此功能的库无法工作。

我不太确定如何自己实现这个,给定一个包含大量数字的字符串,这通常是库允许访问的。

是否有一个库可以运行并允许执行此操作?或者实际上并不难,而我只是错过了一些东西?

javascript arrays biginteger

5
推荐指数
1
解决办法
5457
查看次数

在 JavaScript 中使用 Atomics 和 Float32Array

Atomics.store/load 方法(和其他方法?没看)不支持 Float32Array。我读到这是为了与以下事实相一致:出于兼容性原因,它也不支持 Float64Array(某些计算机不支持它)。

除了我认为这很愚蠢之外,这是否也意味着我必须将要使用的每个浮点数转换为无符号整数?

这不仅会导致代码丑陋,而且还会使其速度变慢。

例如:

let a = new Float32Array(1); // Want the result here

Atomics.store(a, 0, 0.5); // Oops, can't use Float32Array

let b = new Float32Array(1); // Want the result here

let uint = new Uint32Array(1);
let float = new Float32Array(uint.buffer);

float[0] = 0.5;

Atomics.store(b, 0, uint[0]);
Run Code Online (Sandbox Code Playgroud)

javascript atomic typed-arrays

3
推荐指数
1
解决办法
762
查看次数

WebGL绘制调用真的非常慢吗?

我有一段时间没有使用桌面OpenGL,但WebGL似乎很慢.只需几百个相对简单的绘制调用,FPS就会进入转储阶段.

我认为我的代码非常优化.它渲染模型,其中每个模型由网格+材质的批次组成,每个批次都使用实例渲染进行渲染,以便渲染模型的所有实例,每个实例都有自己的每个实例数据,如转换等.

有什么我想念的吗?

作为旁注,正常渲染比实例渲染更慢,正如预期的那样,但是几百个调用仍然会破坏帧速率.

optimization webgl

2
推荐指数
1
解决办法
3968
查看次数

Canvas/WebGL 2D tilemap 网格工件

我正在创建一个简单的 2D 网络游戏,它可以与您的典型瓷砖地图和精灵一起使用。

扭曲是我想要平滑的相机控制,包括平移和缩放(缩放)。

我尝试使用 Canvas 2D API 和 WebGL,在两者中我都无法避免流血的网格线伪影,同时还支持正确缩放。

如果重要的话,我所有的图块的大小都是 1,并缩放到所需的任何大小,它们的所有坐标都是整数,我使用的是纹理图集。

这是使用我的 WebGL 代码的示例图片,其中不需要细的红/白线。 在此处输入图片说明

我记得几年前用桌面 GL 编写精灵图块地图,具有讽刺意味的是使用类似的代码(或多或少相当于我可以用 WebGL 2 做的事情),而且它从来没有出现过任何这些问题。

我正在考虑接下来尝试基于 DOM 的元素,但我担心它不会感觉或看起来不流畅。

2d webgl html5-canvas

2
推荐指数
1
解决办法
1205
查看次数

JavaScript - 从二进制JPG数据创建图像

由于浏览器知道如何处理JPG文件,有没有办法动态地为它们提供JPG文件的实际二进制数据并允许它们对其进行解码?

我无法将文件作为普通的image.src ="path.jpg"提供,因为数据最初是另一个在JS中解析的文件的一部分.

另外,我有奇怪的JPG文件存储alpha,因此像https://github.com/notmasteryet/jpgjs这样的库无法处理它们.

javascript jpeg html5-canvas

1
推荐指数
1
解决办法
6738
查看次数