【问题标题】:Optimization of sprites (quantity vs redundant transparency)精灵的优化(数量与冗余透明度)
【发布时间】:2015-11-19 09:13:06
【问题描述】:

我应该在充满 2d 透明精灵的 2D 游戏中使用什么。

  • 以尽可能低的透明度裁剪到最大值的图像。但我需要其中一些来完成一张图片。
  • 一个大精灵,其中透明像素占图像的 50% 以上。
  • 或者也许这无关紧要,我应该只采用不同的方法,然后是 Sprite 渲染器。

感谢所有建议。下面的例子。

我会提到我正在使用 Unity 制作这款游戏​​,并且它必须尽可能快地在移动设备上运行。但是 anwser 必须与 Unity 相关。

  • 需要多张图片才能完成一张图片,但没有透明度

  • 单个图像,但像素很多或冗余

【问题讨论】:

  • 我建议 1 张图像比多张图像更好,因为它只需要检查一张图像与后面图像的重叠/透明度,而不是检查多个图像彼此之间的重叠/透明度,然后再检查后面的图像(我希望你能明白我想说的:))
  • 我知道检查透明度是如何工作的,但我假设它是按像素而不是按纹理进行的,因为显卡不知道它之前在给定空间中放置的内容。所以这对我来说毫无意义;P如果你能以某种方式证明它,我会很感激。

标签: image unity3d sprite shader


【解决方案1】:

四年后,我可以满怀信心地回答我的问题了。

批处理

使用像素较少的较小图像并多次重复使用总是更好。 Unity 有一个管道,可以在 GPU 中缓存您的图像,并多次将其用于相同的着色器代码。所有这一切都通过一个 CPU 到 GPU 调用。这种效果称为“batching”。

绘图调用通常是资源密集型的,图形 API 为每个绘图调用做大量工作,导致 CPU 端的性能开销。这主要是由于绘制调用之间完成的状态更改(例如切换到不同的材质)造成的,这会导致图形驱动程序中的资源密集型验证和转换步骤。

批处理:在 CPU 上转换网格(精灵)的顶点,将许多相似的顶点组合在一起,然后一次性绘制它们。

较小的图像可确保更少的 GPU 内存用于几乎“免费”的批处理操作。

Stenciling

您可以通过创建模板缓冲区来限制和简化模板共享执行。无需渲染每个像素(即使不透明度为 0),您可以增加模板值以在 0.3 甚至 0.5 处截断 alpha - 通常情况下,您不需要那种柔和的阴影或柔和的边缘,并且可以加快速度增加执行时间。

默认的精灵着色器使用非常小的模板值即可完成此任务,但您可以找到大量插件或着色器来帮助您完成此任务,并通过较小的图形权衡来提高游戏速度。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多