小编Dan*_*lig的帖子

为什么putImageData这么慢?

我正在使用一个相对较大的Canvas,其中绘制了各种(复杂)的东西.然后我想保存Canvas的状态,所以我可以快速将其重置为现在的状态.我为此使用getImageData并将数据存储在变量中.然后我将更多东西绘制到画布上,稍后将使用putImageData将Canvas重置为保存状态时的状态.

但事实证明,putImageData非常慢.事实上,它比简单地从头开始重绘整个Canvas要慢,这涉及覆盖大部分表面的几个drawImage,以及超过40.000行的操作,然后是笔画和填充.

从头开始重绘大约2000 x 5000像素的画布需要大约170毫秒,使用putImageData虽然需要高达240毫秒.与重绘画布相比,为什么putImageData这么慢,尽管重绘画布包括用drawImage填充几乎整个画布,然后使用lineTo,stroke和fill再次填充大约50%的画布和多边形.所以基本上每个像素在重绘时至少触摸一次.

因为drawImage似乎比putImageData快得多(毕竟,重绘画布的drawImage部分需要不到30毫秒).我决定尝试不使用getImageData来保存画布的状态,而是使用canvas.toDataURL,然后从数据URL创建一个Image,我将坚持使用drawImage将其绘制到画布.事实证明,整个过程要快得多,只需要大约35毫秒即可完成.

那么为什么putImageData比替代方案慢得多(使用getDataURL或只是重绘)?我怎么能进一步加快速度呢?有没有,如果,通常什么是存储画布状态的最佳方式?

(所有数字都是使用Firefox中的Firebug测量的)

performance html5 canvas

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

创建2d上下文*,不带*canvas

我目前正在寻找一种方法来创建一个画布2d渲染上下文,而不实际在页面上有一个canvas元素.我可以动态创建一个canvas元素并隐藏它,但是我再次不想直接向用户显示图像,所以在页面中实际上没有画布元素.所以我基本上在寻找类似的东西

var image = new Image( );
Run Code Online (Sandbox Code Playgroud)

但仅适用于canvas 2d渲染上下文(伪代码)

var context = new 2dContext( );
Run Code Online (Sandbox Code Playgroud)

有这样的功能吗?我无法找到类似的东西.调用

var context = new CanvasRenderingContext2D( );
Run Code Online (Sandbox Code Playgroud)

这是HTML5规范的渲染上下文界面的名称只是让我在Firefox中出现了尴尬的错误:

uncaught exception: [Exception... "Cannot convert WrappedNative to function" nsresult: "0x8057000d (NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN)" location: "JS frame :: http://localhost/ :: <TOP_LEVEL> :: line 25" data: no]
Run Code Online (Sandbox Code Playgroud)

javascript html5 canvas

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

在MongoDB中存储和检索JavaScript对象

我目前正在使用node-mongo-native驱动程序来使用node.js和MongoDB.

我使用Mongo控制台存储和检索JS对象进行了一些测试.我想,如果我存储一个包含函数/方法的对象,方法和函数也将存储在集合中.这很有趣,因为我认为函数无法存储在MongoDB中(除了system.js集合,如Mongo文档所建议的那样).
此外,它不仅会存储方法,还会存储对象整个原型链的每个方法和成员.除此之外,我不喜欢这种行为,并认为它不直观,我不能拥有它.

我打算在Mongo系列中管理用户.为此,我有一个User对象,其中包含用作每个用户实例的原型的所有用户方法.用户对象本身只包含用户属性.

如果我将用户存储在Mongo集合中,我只想存储用户对象的自己的属性.没有原型成员,特别是没有原型方法.目前我还没有看到如何干净利落地做到这一点.我认为可能有用的选项是:

  1. 使用foreach和hasOwnProperty创建浅拷贝并将此副本存储在集合中.
  2. 向每个包含所有对象属性的用户添加数据属性,并将其存储在集合中.
  3. 这只是我想到写这个:我还可以将所有原型属性设置为不可枚举,这应该阻止它们存储在集合中.

但是,我确实遇到了相同的问题:从集合中加载用户时.AFAIK创建后无法在JavaScript中更改对象原型.当Mongo实例化从集合中检索的对象时,也无法指定要使用的原型.所以基本上我总是得到使用Mongo从Object继承的对象.据我所知,我有2个选项可以从这一点恢复可用的用户对象:

  1. 创建一个从User继承的新对象,并将结果对象上的每个属性复制到新创建的对象.(兼容存储机制1和3)
  2. 创建一个从User继承的新对象,并将结果对象作为数据属性存储在新创建的对象上.(兼容存储机构2)

我的假设,尤其是关于为查询结果指定原型的可能性,是否正确?什么是正确的方法,为什么?我肯定不是第一个使用node.js在MongoDB中存储和复制对象的人.

目前我会采用方法2/2.我真的不喜欢它,但它是最有效的,也是唯一一个与API完全协同工作的人.但是,我更倾向于听说实际上API没有任何错误,但我不知道如何正确使用它.所以,请赐教:)

prototype object mongodb node.js

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

多态/可插入的PHP类

我有一个问题,更多的是一个设计问题.我有一个定义了一堆函数的类.但是,我希望某些函数的行为在运行时可以更改 - 或者至少在设计时像插件接口一样工作.例如:

class MyClass {  
  public function doSomething();
}

$obj = new MyClass();
// PSEUDO CODE
$obj->doSomething = doSomethingElse;
$obj->doSomething(); // does something else
Run Code Online (Sandbox Code Playgroud)

我有各种各样的想法如何在"真实"代码中实现这样的东西.但是,我不太确定,这是正确的方法.我首先想到我可以为此目的使用接口.

interface IDoSomethingInterface {  
  public function doSomething();
}

class DoSomethingClass implements IDoSomethingInterface
{
  public function doSomething()
  {
    // I do something!
  }
}

class DoSomethingElseClass implements IDoSomethingInterface
{
  public function doSomething()
  {
    // I actually do something else!
  }
}

class MyClass {
  public doSomething(IDoSomething $doSomethingProvider)
  {
    $doSomethingProvider->doSomething();
  }
}

$obj = new MyClass();
$doSomethingProvider …
Run Code Online (Sandbox Code Playgroud)

php oop polymorphism plugins

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

正则表达式匹配m组中的至少n个

我打算写一个正则表达式,只有当一个字符串包含至少n个不同类别的字符时才会匹配.我打算用它强制我的用户创建强密码,并想检查密码是否包含至少3个以下内容:

  • 人物
  • 资本特征
  • 数字
  • 特殊字符

如果所有这些类都存在,则编写匹配的正则表达式使用前瞻是微不足道的.但是,我无法绕过"至少3"部分.这甚至是可能的(在一个漂亮,紧凑的表达式中)还是我必须创建一个怪物表达式?

javascript regex passwords

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

在OutOfMemory异常上有PHP转储堆

我目前正在调试一个不断遇到OutOfMemory异常的脚本.它作为cronjob运行并且通常运行良好,但是当cronjob运行一段时间(无论出于何种原因)时,脚本必须处理排队的许多元素并将遇到OutOfMemory异常.

从检查代码我无法发现问题.我相信其中一个迭代函数调用可能会泄漏内存,但我不确定哪一个和哪里.发生OutOfMemory异常时,是否有选项可以让PHP转储堆?我或许可以从那里发现问题(最有可能).

php debugging heap dump out-of-memory

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

检索包含指定点的矩形集

我无法弄清楚如何以表演方式实现这一点,所以我决定问你们.

我有一个矩形列表 - 实际上atm只有正方形,但我可能不得不稍后迁移到矩形,所以让我们坚持它们并保持它更一般 - 在二维空间中.每个矩形由两个点指定,矩形可以重叠,我不太关心设置时间,因为矩形基本上是静态的,并且有一些预先计算任何设置内容的空间(如构建树,排序,预先计算其他向量,等等).哦,如果有任何问题,我正在开发JavaScript.

对于我的实际问题:给出一个观点,我如何得到一组包含该点的所有矩形?

线性方法表现不佳.所以我寻找比O(n)更好的东西.我读了一些东西,比如在Bounding Volume Hierarchies和类似的东西上,但无论我尝试了矩形可以重叠的事实(我实际上想要得到所有这些,如果点在多个矩形内)似乎总是进入我的方式.

有什么建议吗?我错过了一些明显的事吗?BVH是否适用于可能重叠的边界?如果是这样,我如何构建这样一个可能重叠的树?如果没有,我还能用什么?如果边界在内部,外部或未确定,我不关心.

如果有人能想出任何有用的东西,比如链接或咆哮我是多么愚蠢的使用BVH而不是Some_Super_Cool_Structure_Perfectly_Suited_For_My_Problem我真的很感激!

编辑:好的,我和R-Trees玩了一下,这正是我想要的.事实上,我正在使用endy_c 建议的RTree实现http://stackulator.com/rtree/.它表现得非常好,完全满足了我的要求.非常感谢您的支持!

algorithm search geometry point-in-polygon

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