HTML5:带有onmousemove的getImageData使我在Firefox中的应用程序变慢
HTML5 : getImageData with onmousemove make slow my application in Firefox
我用画布创建了一个小的html5游戏。
在画布中,有许多显示的精灵,其中一个会自动从左向右移动。其他是静态的。
当我将鼠标移动到画布上时,我会在临时画布上绘制所有精灵,并使用 getImageData 查找鼠标所在的精灵。
但是getImageData使Firefox中的移动精灵变得缓慢。
那么避免这种减速的解决方案是什么?
这是我的代码:
function getSelectedObject(array_objects)
{
//Clear the temporary canvas :
tmpcx.clearRect(0, 0, tmpc.width, tmpc.height);
/*Search the right sprite object :*/
for(var i = array_objects.length-1; i >= 0; i--)
{
array_objects[i].draw(tmpcx);
imageData = tmpcx.getImageData(mouse_x, mouse_y, 1, 1);
component = imageData.data;
if(component[3] > 0)
{
//Return the sprite object found :
return array_objects[i];
}
else
{
tmpcx.clearRect(0, 0, tmpc.width, tmpc.height);
}
}
return false;
}
canvas.onmousemove = function(event)
{
selectedObject = getSelectedObject(array_objects);
}
不确定你会得到多少性能提升 - 无需清除精灵之间的临时画布....像素是透明的,直到在其上绘制精灵!
我引用了一个名为 checkBoundingBoxisOver
的函数 - 不确定你是否可以编写这个函数,但我现在不能 - 此外,我什至不知道你的array_objects
是什么!!
我认为这很简单,只需要精灵的 x、y、宽度、高度来初步检查精灵是否可能在鼠标下方,然后再进行昂贵的绘制
function getSelectedObject(array_objects) {
//Clear the temporary canvas :
tmpcx.clearRect(0, 0, tmpc.width, tmpc.height);
var sprite;
/*Search the right sprite object :*/
for (var i = array_objects.length - 1; i >= 0; i--) {
sprite = array_objects[i];
if (checkBoundingBoxisOver(sprite, mouse_x, mouse_y)) {
sprite.draw(tmpcx);
imageData = tmpcx.getImageData(mouse_x, mouse_y, 1, 1);
component = imageData.data;
if (component[3] > 0) {
return sprite;
}
}
}
return false;
}
我遇到了类似的问题,从动画的每一帧的大位图中读取像素。就我而言,它是一张黑白图像,显示了世界是水或陆地的位置。
getImageData在Firefox上非常慢,即使只读取一个像素也是如此。
我的解决方案是只调用getImageData一次,并将结果存储在imageData变量中。
var imageData = self.context.getImageData(0,0,image.width, image.height);
然后,您可以对图像数据进行重复调用,并拉出所需的图像部分。就我而言,我只需要一个像素或一种颜色,看起来像这样
var pixelRed = this.imageData.data[(y* imageWidth * 4) + (x * 4)] == 0;
x 和 y 是不言自明的,由于像素是 4 字节值(红色、绿色、蓝色、阿尔法),我需要将数组索引乘以 4。事实证明,这对我来说非常快。
使用此代码直接从数组中获取任何部分非常容易,只要它不是太大。
相关文章:
- firefox插件:退出不工作的应用程序观察器
- 如何在服务器中为我的Firefox OS应用程序加载远程内容-在Web和FxOS设备中
- 带有RequireJS的AngularJS应用程序在Safari和Firefox中给出了“使用严格”错误
- 无法'共享'Firefox操作系统上Facebook和Twitter本地应用程序上的URL
- Node.js/Socket.io适用于除Firefox之外的所有应用程序,这可能是缓存问题
- 为什么在Firefox更新之后JQuery不能在我的MVC 4应用程序中工作
- 右键点击带有firefox的mac上的flash应用程序会触发鼠标按下
- 在Firefox OS应用程序中滚动时出现渲染问题
- 点击通知后启动Firefox OS应用程序
- HTML5:带有onmousemove的getImageData使我在Firefox中的应用程序变慢
- 应用程序缓存清单在Firefox中未加载,在Chrome和Safari中正常
- 从servlet向js应用程序发送HTML会破坏Firefox中的数据
- StarDict支持JavaScript和Firefox操作系统应用程序
- 阻止firefox应用程序的多个实例
- 如何在Firefox OS上创建一个能够从外部网页获取数据的打包应用程序
- Firefox OS应用程序中的动态内容
- 当应用程序在firefox操作系统手机中从后台启动/打开时,javascript/window事件被称为什么
- 在Firefox上卸载网络应用程序
- ExtJS MVC应用程序未在firefox上加载
- Firefox's在其他浏览器中的应用程序对象设备