webgl - 当我绘制多个具有大尺寸性能下降的图标时
问题描述
我正在使用 javascript 和 webgl 制作 3D 应用程序。当我绘制 1000 个 32x32 像素的图标时,fps 为 60,但是当我绘制 1000 个 256x256 像素的图标时,fps 为 10,执行 drop。
我应该怎么做才能通过绘制 1000 个大小为 256x256 的图标来增加 FPS?
解决方案
GPU 受填充率限制。这意味着他们可以在 60fps 时每帧绘制的最大像素数有限制。每个 GPU 都不同,但如果应用程序尝试绘制太多像素,运行速度很慢是很常见的。
因此,如果您要绘制 1000 个 32x32 四边形,则大约为 100 万像素。如果您要绘制 1000 个 256x256 的四边形,大约是 6500 万像素,所以工作量是 65 倍。
有些事情你可以做。
打开深度测试并从前到后绘制
这仅适用于您的图标是 100% 不透明或可选地具有一些 100% 透明像素并且您
discard
用于不绘制这些像素的情况。如果你有不同级别的 alpha(你正在混合),那么你不能使用这种技术。这将有助于它绘制更少的像素,但仍远远超过 32x32 的情况。
尝试找出不需要绘制的四边形。
4k 显示器只有 800 万像素,为什么要画 6500 万像素?这意味着平均每个像素都被透支了 7 次!
如果无论如何你知道你可以跳过一些四边形跳过它们。
如果纹理大于它们被绘制的大小,请确保使用 mips。
使用没有 mips 的 1024x1024 纹理绘制 2x2 四边形比使用 mips 更慢。原因是没有 mips,GPU 必须在像素之间跳跃很长的距离,这可能是缓存未命中。使用 mips,它将获取适当的 mip 级别,并且彼此相邻的像素将在缓存中。
以我的 2018 年末配备 Intel UHD Graphics 617 的 Macbook Air 为例,我在 WebGL 中以 60fps 的速度每帧只能绘制约 500 万像素。
推荐阅读
- reactjs - Laravel Blade 404 中的 React Router Not Found Error 以获得更深的 url 级别
- php - PHP:在不使用循环的情况下获取数组中的值
- python - 在seaborn barplot之前隐藏文本
- html - 具有可扩展行的 Angular + Bootstrap 表
- python - 尽管没有错误,Amazon Lambda 每分钟都会使用多个请求 ID 重新调用
- excel - 如何在单元格中手动输入数据并且相邻单元格中的日期是自动的,并且要更改它,请求密码?
- terraform - terraform azurerm 模板部署后获取数据
- php - PHP无法显示jpg图像,显示黑屏,里面有小矩形
- python - Scipy.stats.entropy 给出了与熵公式不同的结果
- laravel - 每个循环中是否有任何问题可以打破它而不是创建模型?