当我绘制多个大尺寸图标时性能下降

when I draw multiple icons with large size performance drop

我正在使用 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 倍。

您可以做一些事情。

  1. 开启深度测试,前后绘制

    这仅在您的图标是 100% 不透明或可选地具有一些 100% 透明像素并且您使用 discard 不绘制这些像素时才有效。如果你有不同级别的 alpha(你正在混合),那么你不能使用这种技术。

    这将帮助它绘制更少的像素,但仍然远远超过 32x32 的情况。

  2. 试着找出不需要绘制的四边形。

    4k显示器只有800万像素,为什么要画6500万像素?这意味着每个像素平均被透支 7 次!

    如果有什么要知道的,您可以跳过一些四边形。

  3. 如果纹理大于它们正在绘制的尺寸,请确保使用 mip。

    使用没有 mips 的 1024x1024 纹理绘制 2x2 四边形比使用 mips 要慢。原因是没有 mip,GPU 必须在像素之间跳很长一段距离,这很可能是缓存未命中。使用 mip 时,它将获取适当的 mip 级别,并且彼此相邻的像素将在缓存中。

以我 2018 年末配备 Intel UHD Graphics 617 的 Macbook Air 为例,我只能在 WebGL 中以 60fps 的速度每帧绘制大约 500 万像素。