在每一帧上更新整个 VBO 是绘制许多变化的独特三角形的最有效方法吗?

2024-05-12

答复我之前的问题 https://stackoverflow.com/questions/24592099/drawing-many-unique-triangles-with-a-single-draw-call-for-better-performance/24605055建议我使用顶点缓冲区对象并将位置数据与颜色数据合并到单个数组中,我现在已经在这个简单的测试用例中完成了:

http://jsfiddle.net/headchem/r28mm/14/ http://jsfiddle.net/headchem/r28mm/14/

每帧的伪代码:

function drawFrame() {
    // clear global vertex[] array containing both position and color
    // recreate it with new triangles and colors (determined elsewhere)
    drawShapes();

    // put the vertex array into the VBO using gl.bufferData
    // finish with a single call to gl.drawArrays(gl.TRIANGLES, 0, numItems);
    render();
}

我知道没有灵丹妙药,但对于我渲染一个充满变化的独特三角形的屏幕的目标来说,这是最有效的方法吗?使用 bufferSubData 是否比 bufferData 有任何好处?

当我在动画循环中对此进行测试时,我可以在帧速率受到影响之前每帧更新大约 800 个三角形。当我想要在每一帧上都有独特且不断变化的三角形时,这是否是我能做的限制?我看到人们抛出更大的数字,例如 50k 三角形 - 是因为他们能够在显卡上缓存顶点数组,并且不需要更改每个帧上的每个顶点和颜色?使用 canvas api 时,我可以在帧率下降之前绘制 1500 个不同颜色和位置的矩形 - 我的 WebGL 做错了什么,canvas api 的性能优于它?


我查看了你的代码,发现你的 JavaScript 效率很低。例如,重复执行的这一行:

convertedVerts = convertedVerts.concat(getConvertedVerts(pxVerts, zIndex, color));

效率可能非常低:程序的简单执行需要 O(n^2) 时间,其中 n 是顶点数,因为每次该行运行时都会将元素复制到新数组中。

通过将其更改为以下内容,我在 Firefox 和 Safari 上获得了很大的性能提升(Chrome 似乎并不关心,也许是因为它优化了复制):

convertedVerts.push.apply(convertedVerts, getConvertedVerts(pxVerts, zIndex, color));

最好还是改变一下getConvertedVerts这样它就需要将数组推入而不是创建并返回一个数组。

但是,您的程序可能应该编写的方式是分配一个Float32Array once,然后在每个帧中直接将新值写入其中(传递数组和起始索引)。避免创建新数组,尤其是避免创建新数组Float32Arrays,每一帧,更不用说每个顶点了。

我还建议您摆脱中间的画布模拟步骤(例如构造 rgba() 颜色,然后再次解析它)——没有理由在代码中进行任何字符串操作,尽管这不是'这几乎与上述算法效率低下一样严重。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在每一帧上更新整个 VBO 是绘制许多变化的独特三角形的最有效方法吗? 的相关文章

  • 如何处理 OpenGL ES 2.0 着色器中的 NaN 或 inf

    这是基于以下问题 在 OpenGL 着色器中检测 NaN 的最佳方法 https stackoverflow com questions 9446888 best way to detect nans in opengl shaders标准
  • 将球体 a 旋转到自身的 b 点

    我试图弄清楚如何将球体从 A 点旋转到 B 点 我找到了一些Unity3d代码 Quaternion rot Quaternion FromToRotation pointA pointB sphere transform rotation
  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • 来自 gluUnProject 的 IllegalArgumentException

    我收到此错误消息 08 30 19 20 17 774 ERROR AndroidRuntime 4681 FATAL EXCEPTION GLThread 9 08 30 19 20 17 774 ERROR AndroidRuntime
  • 在 OpenGL 中移动相机时出现故障

    我正在为 iPhone 编写一个基于图块的游戏引擎 除了以下故障之外 它基本上可以正常工作 基本上 相机将始终将玩家保持在屏幕中央 并且它会移动以正确跟随玩家并在静止时正确绘制所有内容 然而 当玩家移动时 玩家行走的表面瓷砖会出现故障 如下
  • 将 WebGL 应用程序部署为本机 iOS 或 Android 应用程序?

    有谁知道如何将 WebGL 应用程序部署为本机 iOS 或 Android 应用程序 商业中间件是可以接受的 但开放项目会更好 谢谢 作为 Joris 答案的延伸 这似乎是基于内森 德弗里斯的作品 http atnan com blog 2
  • 如果使用多个 EAGLView,则不会绘制纹理

    我在使用Apple EAGLView 和Texture2D 时遇到了一些问题 如果我创建 EAGLView 的实例并绘制一些纹理 效果会很好 但是 每当我创建 EAGLView 的第二个实例时 都不会绘制新视图中的纹理 作为 OpenGL
  • VS CODE 中的 WEBGL 自动完成

    我有一个学校项目 我需要使用 WEBGL 但是在没有自动补全的情况下编写所有代码是相当困难的 我没有找到合适的扩展名 你有想法吗 为了让 Visual Studio 代码能够自动完成 它需要知道变量的类型 例如 如果你有这个 const g
  • WebGL:enablevertexattribarray索引超出范围

    这是我的顶点和片段着色器
  • 渲染脚本渲染在Android上比OpenGL渲染慢很多

    背景 我想根据Android相机应用程序的代码添加实时滤镜 但Android相机应用程序的架构是基于OpenGL ES 1 x 我需要使用着色器来自定义我们的过滤器实现 然而 将相机应用程序更新到OpenGL ES 2 0太困难了 然后我必
  • 开发iPhone游戏需要什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • LibGDX - 着色器适用于桌面但不适用于 Android

    我编写了一个简单的程序 可以在 3D 环境中渲染球体 并根据球体周围的四个光源为其着色 当我在桌面上运行该程序时 它工作得很好 但在 Android 设备上 球体只是纯色的 下面是一些图片来说明我正在谈论的内容 gt Desktop gt
  • 纹理不适用于网格 - OpenGL

    我正在使用 OpenGL Es 我已成功加载 obj 文件 网格 并且显示良好 但当我应用纹理时 它不显示 我添加了下面的代码 public void draw GL10 gl bind the previously generated t
  • 上传统一块的正确顺序是什么?

    在示例页面中https www lighthouse3d com tutorials glsl tutorial uniform b locks https www lighthouse3d com tutorials glsl tutor
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 如何将任意颜色的色度键滤镜应用到实时摄像头源ios?

    基本上我想将色度键滤镜应用到 ios 实时摄像头源 但我希望用户选择将被另一种颜色替换的颜色 我找到了一些使用绿屏的示例 但我不知道如何动态替换颜色而不仅仅是绿色 知道如何以最佳性能实现这一目标吗 您之前曾询问过我的情况GPUImage h
  • 三.js环境光意想不到的效果

    在下面的代码中 我渲染了一些立方体并使用点光源和环境光照亮它们 然而 当设置为 0xffffff 时 AmbientLight 会将侧面的颜色更改为白色 无论其指定的颜色如何 奇怪的是 点光源按预期工作 我怎样才能使环境光表现得像点光 因为
  • presentRenderbuffer :GL_RENDERBUFFER_OES 需要很长时间

    我在游戏中添加了一个分析器并隔离了此功能 有时 它会导致 FPS 下降 这是我的结果 Present buffer time 22 Present buffer time 1 Present buffer time 9 Present bu
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题

随机推荐