- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当尝试使用大量数据(但屏幕上几乎没有数据)进行 HitTest 时,即使帧时间远低于 16.7 毫秒(总共 10 毫秒),读取像素也非常慢
我正在开发一个在 webgl 中运行的 datavis 平台,但令我困惑的是为什么 readpixels 如此慢。我们正在使用颜色选择方法来 HitTest 被拖动的项目,以便它可以掉落到物体上等。尽管渲染(未读取)为 60fps,但上传到场景的数据越多,所需的时间就越长。它只拉出一个像素,因此它显然与它的阻塞方面相关,但为什么这会比帧时间长近 4 倍?
if (xPos >= 0 && yPos >= 0 && xPos < drawBufferWidth && yPos < drawBufferHeight) {
gl.readPixels(xPos, yPos, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, lastCapturedColourMap);
}
我预计帧速率越高,读取像素的成本就越低,但这似乎是固定成本。有人可以启发我吗?我正在寻找任何可能更好地了解实际导致速度变慢的原因的人,或者寻找 webgl 中 2d 图形的任何其他替代 HitTest 方法的人
最佳答案
正如 mlkn 指出的那样,它很慢,因为 WebGL 是管道化的。为了安全起见,它在 Chrome 中采用双管道。
您从 JavaScript 发出 webgl 命令。该命令被复制到命令缓冲区。另一个进程,GPU 进程读取该命令,它验证您没有做坏事,然后调用一些相应的 GL 函数,该函数将命令写入驱动程序的命令缓冲区。另一个进程读取该命令。
在正常情况下,所有这些事情都是并行运行的。当您发出新命令时,GPU 进程会读取之前的命令并将其传递给 GL。当 GPU 进程发出命令时,GPU 和 GPU 驱动程序将停止处理之前的命令。
当您尝试读取时,所有并行运行的进程都必须停止,并且所有进程都必须等待所有命令处理完毕,以便它们可以读取像素(您发出的所有命令的结果)到目前为止),然后将它们传回。然后它们都必须重新启动,但此时它们的所有命令列表都是空的,因此需要多个命令才能让它们再次并行执行某些操作。
关于javascript - readPixels 性能,是什么让它这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54076117/
我正在尝试使用 unity 创建一个小的测试应用程序。我正在构建应用程序的一个实例并将其设置为充当主机,然后在统一编辑器中作为客户端运行另一个实例。在当前的迭代中,我有一个按钮,按下时应该截取屏幕截图
我正在尝试将图像(作为纹理)绘制到帧缓冲区,应用锐度过滤器(通过拖动 UI 上的 slider ),然后从帧缓冲区读取结果,并通过调用将数据复制到简单的 2d Canvas (不是 webgl) re
为什么我从WebGLRenderingContext.readPixels()获得的imageData颠倒了? 我尝试做以下事情: var gl = renderer.domElement.getCo
我不明白为什么我在 requestanimationframe 循环内丢失了 readpixel 值? var pixels = new Uint8Array(12*12*4); gl.clearCo
我使用 webgl_draw_buffers 扩展创建了一个帧缓冲区对象,以提供三个颜色缓冲区: colorBuffer0 = gl.createRenderbuffer(); gl.bind
当尝试使用大量数据(但屏幕上几乎没有数据)进行 HitTest 时,即使帧时间远低于 16.7 毫秒(总共 10 毫秒),读取像素也非常慢 我正在开发一个在 webgl 中运行的 datavis 平台
谁能告诉我如何在 JOGL 中从缓冲区中读取像素。请用代码说明。 最佳答案 渲染完成后,调用这个方法: public BufferedImage toImage(GL gl, int w, int h
我一直在尝试使用 WebGL 来实现裁剪和封顶。为此,我必须使用模板缓冲区来限制剪切平面的绘制,以便仅绘制对象内部的部分。 首先,我一直在尝试使用模板缓冲区。我的目标是检查 gl.clearStenc
我正在尝试使用 WebGL 来加速小型量子电路模拟中的计算,就像 Quantum Computing Playground does 那样。 。我遇到的问题是 readPixels 需要大约 10ms
我想从我的相机 View 中检索深度缓冲区以用于 3D 过滤应用程序。目前,我正在使用 glReadPixels 来获取深度组件。而不是 [0,1] 值,我需要深度缓冲区的真实值,或者在世界坐标中到相
基本上我有 200 X 200 像素的 Canvas ,一个 20 X 20 X 20 像素的体素。所以我有 100 个体素。当我在 Canvas 上绘图时,我想查看绘制了哪个像素,如果该像素位于其中
我将 id(这是一个包含在 24 位范围内的值)存储到 Float32Array(3) 中,以便稍后在 WebGL 中检索: var r = 0, g = 0, b = id; if
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用RenderTarget-> ReadPixels(),但是由于ReadPixels()的 native
我已更新到 FireFox35,但以下代码不再起作用: var ctx = renderer2.getContext("experimental-webgl",{preserveDrawing
我正在使用headless-gl与 Node 一起在服务器端渲染生成的高分辨率 WebGL 图像。根据所选的分辨率,这可以正常工作。 'use strict'; const Gl = require(
我正在使用 headless-gl 在 Node.js 上运行 webGL,在服务器上动态创建图像。创建后,图像将存储在数据库 (MongoDB) 中,然后用户可以通过 API 再次访问图像。 下面是
图像采用 Base64 格式,我想比较像素关系。 在了解 GPU 的工作原理后,我认为这种类型的分析在 Canvas webgl 上下文中表现最佳,而不是像我之前使用的 2d 。我以前没有使用过 We
我试图将 RenderTexture 绘制到 Texture2D 中,目的是将其保存到磁盘。这种方法在 OSX 编辑器和 Android 上一直有效。 我在 XCode 控制台中没有看到任何错误,当我
我创建了两个 html 客户端,它们使用 websocket 服务器相互通信。一个客户端使用 Three.js 在其 Canvas 上绘制 3D 模型,并将 Canvas 上下文(即 webGl)作为
是否可以在具有多个附件的帧缓冲区上以浮点形式检索像素值? (WebGL 2) 我试过这个: var framebuffer = _gl.createFramebuffer(); _gl.bindFra
我是一名优秀的程序员,十分优秀!