【发布时间】:2015-02-14 05:18:58
【问题描述】:
我正在创建一个基于 Node.js/WebGL/Canvas/PIXI.js 的视频游戏。
在这个游戏中,方块有一个通用的尺寸:它们可以是圆形、多边形或任何东西。所以,我的物理引擎需要知道东西到底在哪里,哪些像素是墙,哪些像素不是。因为我认为 PIXI 不允许这样做,所以我创建了一个不可见的画布,在其中放置了所有墙上的地图图像。然后,我使用函数 getImageData 在 (x, y) 处创建函数“isWall”:
function isWall(x, y):
return canvas.getImageData(x, y, 1, 1).data[3] != 0;
但是,这非常慢(根据 Chrome 分析,它占用了游戏 CPU 时间的 70%)。另外,由于我引入了这个功能,我有时会在没有任何额外建议的情况下收到错误“糟糕,WebGL 崩溃”。
有没有更好的方法来访问像素的值?我考虑将所有内容存储在静态位数组中(墙有固定大小),1 对应于墙,0 对应于非墙。内存中包含 1000 万个单元的数组是否合理?
【问题讨论】:
-
现在对像素进行碰撞几乎是一种反模式。为了在现代 GPU 上读取像素,整个 GPU 管道必须停止(就像猛踩汽车刹车一样),这样 CPU 才能读取像素。 GPU 然后缩小以做更多的事情。想象一辆赛车,每次你想看它时,它都必须在休息时猛烈撞击并完全停下来。这就是现代 GPU 读取像素的作用。关键是,还有其他方法可以进行碰撞吗?多边形? AABB?原语?或者,在 CPU 上渲染您自己的碰撞像素?
-
第二个想法不需要调用GPU,因为墙壁是静态的,可以存储在与GPU无关的数组中。然而,有趣的是,您说这是如今的反模式。但是当人们想要进行像素级碰撞时,他们会怎么做呢?我的游戏会有很多复杂的表格,我不想手动为每个表格创建一个看起来像表格的多边形,因为这会花费我很多时间。
标签: javascript canvas webgl pixi.js