小编dan*_*man的帖子

为什么浏览器不能在内部使用虚拟dom作为优化?

互联网上有很多SO问题和博客试图解释虚拟dom是什么,但这个问题是为什么这种优化必须在JavaScript /作为框架的一部分而不是由浏览器本身实现.

据我所知,虚拟DOM是一个由Javascript对象组成的树,父母/子女等,但没有真正DOM的大部分"重"特征.框架(例如React/Vue)通过从头开始创建虚拟DOM来响应模型状态的变化,然后在其虚拟DOM的最后一个版本上执行差异以找出要更改的真实DOM.

我读过的许多内容都声称虚拟DOM更快,因为真正的DOM每次发生变化时都必须重新布局(甚至重新绘制),但事实并非如此 - 只有当需要重新布局时才需要重新布局某些JS代码明确要求某些样式/文本流相关值(例如高度/宽度等).并且可能大多数使用虚拟DOM的框架在这​​方面做得不够好 - 除了确保开发人员不会意外地做到这一点.

此外,最近在某些时候浏览器正在考虑为DOM变异提供事件挂钩,但是这个想法已被放弃,这意味着不应该在DOM被突变的点上触发任何事件.

所以我的问题是,这会带来什么好处呢?JS框架有哪些额外的信息或额外的自由,使其具有执行虚拟DOM优化的"逻辑"能力?

webkit blink reactjs vue.js virtual-dom

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

WebGL是否可以模拟对gl.finish()的异步调用

WebGL很好并且异步,因为您可以发送一长串渲染命令而无需等待它们完成.但是,如果由于某种原因您确实需要等待渲染完成,则必须与其同步执行gl.finish().如果gl.finish接受回调并立即返回会更好吗?

问题:有没有办法可靠地模拟这个?

用法案例:我将大量顶点渲染到大型离屏画布,然后使用drawImage将此大画布的部分复制到页面上的小画布.我实际上并没有使用,gl.finish()drawImage()似乎有相同的效果.在我的应用程序中,仅在用户执行操作(例如,单击按钮)时才会触发重新渲染,并且可能需要几百毫秒.如果在渲染期间浏览器仍然响应允许滚动等,那将是很好的.我特别关注Chrome解决方案,尽管在Firefox和Safari中也可以使用.

可能(坏)答案:您可以尝试估计渲染的时间长度,然后设置以调用开始的超时gl.finish().但是,对所有大小的顶点缓冲区和所有用户可靠地进行此估计将非常棘手且不准确.

可能的(非)答案: requestAnimationFrame做我正在寻找的......但它没有,是吗?

2018年可能的答案:也许ImageBitmapAPI解决了这个问题 - 请参阅MDN文档.

webgl

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

2d数组中8个邻居的总和

我需要找到一个单元格中所有相邻元素的总和,比如说getsumofneighbors(matrix, i, j):

'M*N matrix'
[[0 1 0]
 [2 0 1]
 [0 4 0]
 [0 0 0]]
Run Code Online (Sandbox Code Playgroud)

最近元素的总和[0][0]是3

[1][0]5点

[1][1]8点

是否有一个python库来查找给定单元格旁边所有元素的总和?

python numpy matrix

8
推荐指数
3
解决办法
3487
查看次数

与astype(int)相比,numpy// rint变慢

所以,如果我有类似的东西x=np.random.rand(60000)*400-200.iPython %timeit说:

  • x.astype(int) 需要0.14ms
  • np.rint(x)np.around(x)采取1.01ms

需要注意的是,在rintaround情况下,你仍然需要花费额外的0.14ms做最后的astype(int)(假设这是你最终想要的东西).

问题:我认为大多数现代硬件都能够在同等时间内完成两项操作.如果是这样的话,为什么numpy需要花费8倍的时间来进行舍入?

碰巧我对算术的准确性并不十分挑剔,但我看不出如何利用numpy的优势(我正在做杂乱的生物学而不是粒子物理学).

c python assembly sse numpy

6
推荐指数
2
解决办法
4803
查看次数

c ++ 11将std :: tuple解压缩为虚拟成员函数

全文:

我正在尝试构建一个看起来有点像这样的框架:

#include <tuple>
#include <memory>
using namespace std;

// this class allows user to call "run" without any args 
class simulation_base{
public:
    int run(){ execute_simulation_wrapped(); }; 
protected:
    virtual int execute_simulation_wrapped(); {return 0;};
}

// this class funnels some stored inputs into a soon-to-be-overridden method
template <typename Ts...>
class simulation_wrapper : public simulation_base {
    tuple<shared_ptr<Ts>... > stored_inputs;

    public:
    int execute_simulation_wrapped() {/* how do you call simulation method? */};

    protected:
    virtual int simulation(const Ts&...){return 0};
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用框架来定义一些可以模拟的外观简单的类.

class jones_household : public …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

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

在Windows上使用clang 3.8进行构建

从一些谷歌搜索来看,似乎clang对Windows的支持最近有所改善,而且对clang的支持也可能有所改善.但我对所有这些繁重的编译器配置内容都很陌生,并且是新增功能,因此我不确定目前的状态是什么.

我正在尝试运行命令:

 b2 --build-dir=build toolset=clang --build-type=complete stage
Run Code Online (Sandbox Code Playgroud)

www.boost.org/.../getting_started/windows中的5.2.4节所述.

这确实在某种程度上有效,但是看着打印到屏幕上的日志我看到了一些令人担忧的事情:

  • clang-linux.compile.c++....即使我在Windows上,语句也会开始.
  • 12 warnings generated.(或类似的)或许总是这些-Wunused-local-typedef,但我不确定.
  • 2 warnings and 8 errors generated(或者类似)肯定是否有错误构建失败了?我怎么知道哪个组件的boost没有正确构建,我该怎么做才能解决这个问题?

我不清楚我是否需​​要MSVC编译器,Visual Stufio IDE和/或MinGW以及我是否需要手动设置标志以传递给编译器?也许clang + boost还没准备好用于Windows吗?

最终我想使用boost.python,以后可能会boost.coroutine.

据推测,如果我想为自己的项目使用clang,我还需要使用clang编译boost吗?

boost clang++

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

矢量化的基数排序与numpy - 它可以击败np.sort?

NumPy的没有尚未有一个基数排序,所以我想知道是否有可能使用一个预先存在numpy的功能来写.到目前为止,我有以下,它确实有效,但比numpy的快速排序慢约10倍.

line profiler输出

测试和基准测试:

a = np.random.randint(0, 1e8, 1e6)
assert(np.all(radix_sort(a) == np.sort(a))) 
%timeit np.sort(a)
%timeit radix_sort(a)
Run Code Online (Sandbox Code Playgroud)

mask_b循环可以至少部分地被矢量化,从掩码中广播&cumsumaxisarg一起使用,但是这最终是一种悲观,可能是由于增加的存储器占用.

如果有人能够看到一种方法来改进我所拥有的东西,我会有兴趣听到,即使它仍然比np.sort... 慢......这更像是一种对知识的好奇心和对numpy技巧的兴趣.

请注意,您可以轻松地实现快速计数排序,但这仅与小整数数据相关.

编辑1:np.arange(n)圈外的帮助一点,但不是很exiciting.

编辑2:cumsum实际上是多余的(哎呀!),但这个简单的版本仅具有性能稍微帮助..

def radix_sort(a):
    bit_len = np.max(a).bit_length()
    n = len(a)
    cached_arange = arange(n)
    idx = np.empty(n, dtype=int) # fully overwritten each iteration
    for mask_b in xrange(bit_len):
        is_one = (a & 2**mask_b).astype(bool)
        n_ones = np.sum(is_one)      
        n_zeros = n-n_ones
        idx[~is_one] = cached_arange[:n_zeros] …
Run Code Online (Sandbox Code Playgroud)

python sorting performance numpy vectorization

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

为什么 WebGL 渲染速度如此不一致?

在我的应用程序中,我使用 LINE_STRIP 标志对 WebGL 的绘图数组进行一次调用,绘制了大约 800 万个顶点。我实际上并不想要一根长线,我想要大约 200k 条短线,所以我用额外的顶点覆盖所有短线,并告诉顶点着色器将线帽“推”到负 z 以创建隐形桥。渲染是准静态的(用户可以单击触发重新渲染的各种内容),因此它不必非常快,但我真的希望在现代计算机上花费的时间少于 200 毫秒。

在我的笔记本电脑上 [更新:运行 Win7,使用一些 Intel i7 作为 CPU,并使用集成 HD Graphics 4000 作为 GPU] 我在 Chrome 中得到了大约 100 毫秒,这很好。但奇怪的是,Firefox 大约需要 1-2 秒。在我的三星 Chromebook 550 上,我得到的时间从 600 毫秒到 2 秒不等,通常启动很快,然后后续渲染速度变慢,但也可以变得更快。

问题:

  • 是什么导致我的 Chromebook 上的渲染速度发生变化?
  • 为什么我的笔记本电脑上的 Firefox 比 Chrome 慢很多?
  • 是否值得花费大量时间试图让它运行得更快(即我可以期待很大的改进)吗?有小费吗?

笔记:

  • 对于 Chromebook 重复渲染测试,渲染之间发生的唯一事情是更改统一以在调色板之间切换(实现为纹理)。Chrome开发工具似乎并不认为测试期间页面的内存使用情况有任何重大变化。

  • 我使用 gl.finish 和 console.time 来查看渲染需要多长时间。

  • 除了在调试期间之外,我都会渲染到一个孤立的画布,然后将结果的各个部分复制到页面UPDATE:使用drawImage(将 webgl 画布作为第一个参数)上的各个小画布。这可能确实需要一些时间,但是无论是否进行复制操作,以及是否将 webgl 画布附加到页面主体(并​​且可见),上面报告的数字似乎都没有太大变化。

  • 更新:我的笔记本电脑一次性渲染的顶点数量是有限制的,但该限制似乎随时都会波动,如果超过限制,它就不会渲染任何东西。这个数字大约在 800 万大关左右,但有时超过 1100 万也令人高兴。我现在将其设置为一次批量 200 万个。有趣的是,这似乎让我的 Chromebook 运行得更快,但我不能确定,因为它非常不一致。

  • 更新:我已经禁用了 …

firefox google-chrome webgl opengl-es-2.0

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

chrome使用dragstart event.dataTransfer拖出多个文件

我目前有一个应用程序,它在javascript中生成一些内容,将其转换为blob,然后允许用户将其拖到桌面上以将其保存为文件.关键线看起来像这样:

 event.dataTransfer.setData("DownloadURL",
                  'application/octet-stream:' + desiredFilename + ':' + blobURL);
Run Code Online (Sandbox Code Playgroud)

这在Chrome中运行良好,但理想情况下我希望用户能够同时拖出多个文件.

  • 我看到Firefox有一个mozSetDataAt方法,我想这是他们暴露这个功能的方式,但我在Chrome中找不到任何相同的东西.
  • 我试过玩dataTransfer.items.add它似乎对dataTransfer对象做了什么但它不会产生工作拖动,即使用于单个文件.
  • 我已经尝试提供一个数组作为setData上面的第二个参数,它适用于一个项目,但不是更多.
  • 我试过多次调用setData,看看每个调用是否添加了额外的数据,但遗憾的是它只是覆盖了原始数据.
  • 我想知道是否有某种方法可以指定具有某种多部分类型的单个downloadurl,这将允许我指定多个blob及其所需的文件名.看到这个无法回答的SO问题或多或少地提出了这个问题.
  • 我还想知道是否有某种方法可以创建一个FileList或者DataTransferItemList以某种方式将它们分配给事件,但似乎没有任何方法可以从头开始创建这些类的实例.

真的我只关心Chrome,虽然FF和IE可能很感兴趣.

谢谢!

javascript html5 drag-and-drop google-chrome blob

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

使 webpack DefinePlugin 条目/块/文件特定

在我的 webpack 配置中,我希望能够执行以下操作:

module.exports = {
entry: {'main_public': [...], 'main_private': [...] },
...
plugins: [
   new CustomDefinePlugin({
      test: /_public$/,
      definitions: {PRIVATE_APP: false}
    }),
    new CustomDefinePlugin({
      test: /_private$/,
      definitions: {PRIVATE_APP: true}
    }),
   new webpack.optimize.UglifyJsPlugin({compress: {dead_code: true}})
],
...}
Run Code Online (Sandbox Code Playgroud)

也就是说,我希望能够针对不同的入口点进行全局定义。

我尝试破解现有的DefinePluginwebpack 附带的内容,但似乎它parser._plugins在内部使用该系统。我还尝试test在传递给UglifyJsPlugin(并global_defs在那里使用)的选项中设置一个字段,但test似乎被忽略了。

以及关于如何在不分叉整个 webpack 的情况下轻松完成这项工作的想法……尽管我认为这是一个选择。

webpack webpack-dev-server

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

如何修复geojson以满足mongodb 2dsphere索引的需求

我在mongo集合中有~400K文档,所有文档都具有几何type:Polygon.2dsphere由于几何体显然具有自交叉,因此无法像当前所示那样为数据添加索引.

在过去,我们有一个hacky解决方法,即在mongoose保存钩子上计算几何的边界框,然后索引而不是几何体本身,但我们想简化事情并只使用实际几何.

到目前为止,我尝试使用草皮如下(这是一个函数的主体fix):

let geom = turf.polygon(geometry.coordinates);
geom = turf.simplify(geom, { tolerance: 1e-7 }); 
geom = turf.cleanCoords(geom); 
geom = turf.unkinkPolygon(geom);
geom = turf.combine(geom);
return geom.features[0].geometry;
Run Code Online (Sandbox Code Playgroud)

最重要的功能是unkinkPolygons我希望它能完全符合我的要求,即使几何体足够好以便进行索引.这simplify可能没什么用,但我把它添加进去了.那clean是因为unkink抱怨它的输入,并且combine是将Polygons 数组转换成单个数组MultiPolygon.实际上,unkink仍然不满意它的输入,所以我不得不编写一个hacky函数,如下所示,抖动重复的顶点,这会修改geom之前传递给unkink:

function jitterDups(geom) {
  let coords = geom.geometry.coordinates;
  let points = new Set();
  for (let ii = 0; ii < coords.length; ii++) {
    // last coords is …
Run Code Online (Sandbox Code Playgroud)

postgis mongodb geojson turfjs mapshaper

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