【发布时间】: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