首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JS画布经常获得像素值

JS画布经常获得像素值
EN

Stack Overflow用户
提问于 2015-02-11 18:23:28
回答 2查看 725关注 0票数 0

我正在创建一个基于Node.js/WebGL/画布/PIXI.js的电子游戏。

在这个游戏中,块有一个通用的大小:它们可以是圆圈、多边形或任何东西。所以,我的物理引擎需要知道物体的确切位置,墙壁是什么像素,什么像素不是。因为我认为PIXI不允许这样做,所以我创造了一个看不见的画布,在那里我把墙上的地图图像都放进去了。然后,我使用函数getImageData在(x,y)处创建一个函数"isWall“:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isWall(x, y):
    return canvas.getImageData(x, y, 1, 1).data[3] != 0;

然而,这是非常缓慢的(根据Chrome分析,它占用了游戏CPU时间的70% )。而且,由于我引入了这个函数,我有时会在没有任何其他建议的情况下得到错误"Oops,WebGL崩溃“。

是否有更好的方法来访问像素的值?我想把所有的东西都存储在一个静态的位数组中(墙有固定的大小),其中一个对应于一个墙,一个对应于一个非墙。在内存中有一个1000万个单元的数组合理吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-11 19:34:23

我使用位数组来存储0 \x\ 1信息,它工作得很好。

信息存储紧凑,获取/集非常快。

下面是我使用的位库:

https://github.com/drslump/Bits-js/blob/master/lib/Bits.js

我没有尝试使用10m位,所以您必须在您自己的数据集上尝试它。

您提出的解决方案非常“平坦”,这意味着每个像素必须有相应的位。这导致需要大量的内存--即使信息是以位的形式存储的。

是一种替代测试数据范围,而不是测试每个像素:

如果墙壁像素的数量相对于像素的总数很小,您可以尝试将每个墙存储为一系列的“运行”。例如,墙壁运行可能存储在这样的对象中(警告:未经测试的代码!):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// an object containing all horizontal wall runs
var xRuns={}

// an object containing all vertical wall runs
var yRuns={}

// define a wall that runs on y=50 from x=100 to x=185
// and then runs on x=185 from y=50 to y=225
var y=50;
var x=185;

if(!xRuns[y]){ xRuns[y]=[]; }

xRuns[y].push({start:100,end:185});

if(!yRuns[x]){ yRuns[x]=[]; }

yRuns[x].push({start:50,end:225});

然后,您可以像这样快速测试x,y的运行情况(警告未经测试的代码!):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isWall(x,y){

    if(xRuns[y]){
        var a=xRuns[y];
        var i=a.length;
        do while(i--){
            var run=a[i];
            if(x>=run.start && x<=run.end){return(true);}
        }
    }

    if(yRuns[x]){
        var a=yRuns[x];
        var i=a.length;
        do while(i--){
            var run=a[i];
            if(y>=run.start && y<=run.end){return(true);}
        }
    }

    return(false);

}

这需要很少的测试,因为x&y准确地指定了需要测试的xRuns和yRuns数组。

它可能(或不可能)比测试“平面”模型更快,因为访问平面模型的指定元素需要开销。你必须使用这两种方法进行测试。

墙壁运行的方法可能需要更少的内存。

希望这个helps...Keep在我的脑海中--墙壁运行的替代方案--刚刚结束,可能需要调整一下;-)

票数 1
EN

Stack Overflow用户

发布于 2015-02-13 13:18:58

一些想法:

  • 首先检查:对所有对象使用碰撞区域。这些区域甚至可以根据形状为每一方定义。复杂的形状)。只检查相交区域内的碰撞。
  • 使用一半分辨率的命中测试位图(甚至25%,如果你的方案允许)。当物体移动时,我们的大脑无法检测像素精确的碰撞,所以这是可以利用的。
  • 对于复杂的形状,预存储整个位图(基于其区域),但将其转换为具有高值和低值的单一值类型数组,如Uint8Array (重复使用此方法,而不是通过上下文获取一个像素)。减去对象的位置,并将结果用作形状区域的增量,然后点击-测试“位图”。如果形状旋转,则相应地转换传入的检查点(这里可能有一个更新位图比转换一组点更快的地方。您需要测试您的场景)。
  • 对于接近正方形的物体,做折中操作,并使用简单的矩形检查。
  • 对于圆和椭圆,使用不平方值来检查半径的距离。
  • 在某些情况下,您也许可以使用在游戏开始之前计算的碰撞预测,以及当知道所有物体的位置、方向和速度时(计算完整的运动路径,找到这些路径的交叉点,计算到这些交叉口的时间/距离)。如果您的对象由于其他事件而改变方向等,这当然不会很好地工作(或者尝试重新计算是否有益)。

我知道为什么你需要10百万存储在内存中,虽然这是可行的,但你需要使用类似四叉树的东西,然后把数组分开,这样才能有效地查找像素状态。IMO您只需要存储复杂形状的“位”,并且可以通过定义每个形状的多个区域来进一步限制它。对于简单的形状,只需使用向量(矩形、半径/距离)。经常进行性能测试以找到正确的平衡。

在任何情况下-这类事情必须手工优化的非常场景,所以这只是一个一般性的看法。其他因素会影响该方法,如高速、旋转、反射等,并且很快就会变得非常广泛。希望这能提供一些投入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28468202

复制
相关文章
绕过SSH服务器的端口转发限制
在某些场景下SSH服务器会禁用掉端口转发的能力,以降低安全风险。这会导致很多依赖SSH端口转发的工具无法正常工作。
drunkdream
2023/10/17
4440
windows端口转发工具_android 端口转发
比如我们在 host2 机器上面部署了很多服务,但是由于某种原因导致我们无法直接 ssh 访问该服务器已经其上服务的对应端口,但是 host3 服务器,既能够访问 host2 服务器,又可以访问我们的 host1 服务器。这时,我们就可以通过设置 ssh 来进行服务的访问。但是还有两个问题:你需要保持终端开启防止 SSH 进程被关闭;由于网络故障/波动导致 SSH 终断时无法自动重连。
全栈程序员站长
2022/11/15
5.8K0
腾讯云“对等连接”应用
本文章提供视频讲解与演示,详细见B站地址:https://www.bilibili.com/video/BV1bv41167XT
研究僧
2020/06/12
11K0
udp端口转发 Linux,Linux iptables 端口转发[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说udp端口转发 Linux,Linux iptables 端口转发[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/08/09
13.4K0
Nginx请求转发&端口转发
nginx反向代理 官网介绍:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
mingjie
2022/05/12
3.9K0
SSH端口转发
今天碰到一个需求,在用户环境中,如果要访问机房里某个机器上,必须通过一个机器中转才可以,如果仅仅是SSH登录一下,我也就忍了,毕竟跳跳更健康嘛。但是今天要访问里面机器上的Web服务,我可以纠结了一会,后来想到了可以使用SSH的端口转发来实现。下面就看看怎么实现吧。
kongxx
2019/03/11
2.2K0
Frp端口转发
简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。
执笔
2023/03/15
2.2K0
# 如何在Ubuntu 16.04上配置绑定为缓存或转发DNS服务器 ###
在学习如何配置网站和服务器时,DNS或域名系统通常是一个难以实现的组件。虽然大多数人可能会选择使用其托管公司或其域名注册商提供的DNS服务器,但创建自己的DNS服务器有一些优势。
尘埃
2018/09/21
2.8K0
通过JSP端口转发拿下服务器权限
这篇文章是@欧根亲王号师傅19年投稿发在星球的,经他同意转发至公众号,内容比较基础。
潇湘信安
2022/09/22
2.2K0
通过JSP端口转发拿下服务器权限
[Linux]iptables 端口转发
Windows的端口转发,我们可以 点击这里 直达。但是我们今天的需求是用我们的linux转发来加速我们在美国的windows。所以我们设定的案例如下
用户2353021
2020/05/12
3.5K0
nginx 端口转发
这两天在写 go 项目, 一个 HTTP 服务器. 之前写的是 php 项目, nginx 监听80端口, 根据域名将请求分配给不同项目. 现在换了 go, 自然也想延续这个操作, 毕竟都是跑在同一台服务器上. 那么问题来了, 我的nginx 监听80端口的同时, go 服务器是无法同样监听80端口的. 这该如何是好啊, 给我整的一脸懵逼.
烟草的香味
2020/08/19
2.6K0
SSH端口转发
ssh 会自动加密和解密所有的ssh客户端与服务端之间的网络数据。但是ssh 还提供了一个端口转发的功能。转发是一种与其他网络应用程序交互的方式,它能将其他TCP端口的网络数据通过SSH链接来转发,并且自动提供了相应的加密以及解密服务。这一过程有时也被叫做隧道
smallwormer
2019/05/01
3.7K0
Windows系统服务器开启端口转发功能
端口转发,这个功能在平时的开发中用到的还是比较多的,记录下 Windows 如何使用自带的软件实现端口转发。
用户9104802
2021/11/22
12K0
IPTABLES端口转发
iptables是unix/linux系统自带的优秀且完全免费的基于包过滤的防火墙工具,它的功能十分强大、使用非常灵活、可以对流入、流出及流经服务器的数据包进行精细的控制,作为防火墙其端口转发功能自然是必不可少的,但是需要高的操作权限
Al1ex
2022/06/23
1.7K0
IPTABLES端口转发
SSH端口转发
让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:
用户4877748
2020/07/22
2.8K0
SSH端口转发
如何在Linux中使用SSH动态端口转发代理
本文将介绍如何在Linux中使用SSH动态端口转发代理,让你轻松畅享网络自由,保障个人隐私和数据安全。
华科云商小彭
2023/08/23
2.3K0
如何在Linux中使用SSH动态端口转发代理
Linux 端口转发
本地执行建立隧道,通过远端端口访问本机 vim /etc/ssh/sshd_config
以谁为师
2019/05/28
20.9K1
NC端口转发
需要注意的是,因为服务器和kali不在同一网段。我在实际操作中用的是映射后的IP和端口。如果你的环境在同一网端,直接执行上面命令即可。
逍遥子大表哥
2021/12/19
1.3K0
NC端口转发
点击加载更多

相似问题

无法在我的wordpress网站上安装jetpack

110

如果我在sql中安装WordPress插件,我可以使用WordPress插件吗?

11

我应该在哪里安装webkit的插件?

12

我试图在本地Wordpress安装上安装插件

32

我根本不能在我的wordpress网站上安装谷歌分析

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文