【问题标题】:Fastest 2D App Menu Transition Method?最快的 2D 应用程序菜单转换方法?
【发布时间】:2018-02-28 20:48:09
【问题描述】:

我正在开发一个具有多个菜单的 2D 应用程序,我希望它们能够相互滑动过渡(例如,当前菜单向左,而新菜单从右侧进入)。

我的第一次尝试是编写了一个脚本,该脚本可以为菜单启用父游戏对象并在屏幕上移动菜单(lerp)。所有菜单都在一个设置为屏幕空间 - 覆盖的画布下,但每个菜单都有不同的游戏对象。这达到了预期的效果,但是当我在我的 Android 测试手机上运行时,在过渡期间帧速率会下降 60 fps 到 25 fps。我认为移动菜单 GameObjects 及其所有元素太多了。

这导致了两次尝试,我让游戏对象保持静止,然后将相机滑过(lerp)画布。我制作了画布世界空间并对其进行缩放以完美适合相机。然而,当再次在移动设备上进行测试时,我发现帧率一直下降到 20 fps 左右。不仅在过渡期间,在菜单上也是如此,即使在不与菜单交互时也是如此。

如果画布设置为 Screen Space - Overlay 或 ScreenSpace - Camera,有什么方法可以让 GameObjects 保持静止并移动 Game View?有什么方法可以进行简单的菜单转换,而不会像无名小卒那样拖慢我的应用程序的速度?

【问题讨论】:

  • 移动菜单不应该花费那么多 fps,你的瓶颈在别的地方
  • 您可以在项目质量设置中看到的一件事是您的标准着色器的质量设置。 (项目设置-> 图形)。您可以针对每种设置将它们调低,并且画布可以更快。您可以做的其他事情是将菜单渲染到渲染纹理并在动画期间用它替换。这将使您获得最大 fps,但除非您已经拥有执行此操作的代码,否则需要做一些额外的工作(这有点繁琐,但该方法可用于大量优化画布)。
  • @LassiKinnunen 我将图形设置更改为无济于事。我现在正在处理您的渲染纹理建议。我无法让图像看起来几乎正确,我尝试过的着色器都没有正确的调色板,而且它们都不支持我在场景中使用的图像蒙版。你有什么建议吗?
  • 如果您已经设法将它(您的画布或画布中的子对象)渲染到渲染纹理中,只需将该纹理放在您正在移动的画布中的 rawimage 中(无),然后禁用“真实”的元素?我不确定我是否解释得当。但我一直在做的是将一些复杂的画布元素渲染到纹理中(通过渲染纹理,但为不同的元素重用相同的渲染纹理)并抓住它们并使用它们而不是更复杂的画布元素。当然现在我想了想,你可以使用 rendertex 来避免在移动时重绘画布。
  • RenderTexture 和 Texture.PixelRead 方法都给了我不好的纹理。两者都有一个非常低分辨率的左上角,在同一个角落有一个奇怪的、不一致的 alpha,用于通常完全不透明的显示,并且两者都没有用它们的内容或它们的掩码完整地渲染我的 ScrollRects。 (矩形的内容一旦被揭开,即使不是全部,也会覆盖我的大部分屏幕)

标签: unity3d transition


【解决方案1】:

在这两种方法中,从相机的角度来看,所有元素都移动了。这将在每一帧中触发整个 UI 的重绘。此绘图可能会很慢,尤其是当您有许多透明元素相互叠加时。没有什么神奇的方法可以让事情变得更快,但是手册在一个完整的部分中解决了这个问题,这可能值得一读,以确定在您的特定情况下可以改进的地方:

UI Best Practices

【讨论】:

  • 当然,但是在移动画布方法中,所有元素实际上都在移动,并且必须重新计算它们的所有变换值。我将研究那个 UI 最佳实践链接。
  • 我的 Frame Debug 窗口显示 Canvas.RenderOverlays 中有大约 500 个 Draw Mesh 调用。我要去看看如何瘦下来,但任何提示将不胜感激。
  • 我有很多 Image 组件,显然它们以及 Text 组件不支持批处理。据我了解,这意味着我无法最小化来自我的 UI 的绘图调用。
  • 是的,draw call 的数量很重要。如果你有很多透明度,渲染将需要更多的绘制调用。如果您的层次结构太深,我也可能会更糟
猜你喜欢
  • 2012-11-20
  • 2016-05-29
  • 2021-09-17
  • 2021-12-12
  • 2011-07-12
  • 2021-06-09
  • 2011-08-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多