gpt4 book ai didi

swift - 在 SwiftUI 中,如何以高性能绘制阴影?

转载 作者:行者123 更新时间:2023-12-03 09:29:51 25 4
gpt4 key购买 nike

我使用 .shadow(color:, radius:, x:, y:)在我的应用程序中绘制阴影。这是我所知道的在 SwiftUI 中绘制应用程序的唯一方法。我使用 .sheet(isPresented:, content:)方法来弹出一个包含很多阴影的 View ,当我调试 View 层次结构时,我看到了这些警告:
enter image description here
但我不知道如何设置shadowPath ,或者在SwiftUI中将阴影预渲染成图像并将其放在图层下,请帮助我。

最佳答案

这个警告不是因为你的代码本质上是不好的,而是为了告诉你有更多的渲染阴影的高效方法。
由于您的 UI 元素当前正在编写,SwiftUI 正在根据 View 对象当时的位置和边界动态(在运行时)在 View 对象周围绘制阴影,并且该渲染将在 View 的整个生命周期中跟随 View 。
这是一个数学密集型过程,在最好的情况下涉及对 GPU 的许多绘图调用,在最坏的情况下也涉及 CPU 瓶颈。
在 Swift 中有几种不同的渲染阴影的方法。他们中的大多数使用 SwiftUI 之外的框架(UIKit 和 CoreGraphics,通常,尽管 Metal、Core Animation 和 Core Image 在各种应用程序中都很重要。)
如果您没有在目标硬件上的 UI 层中看到性能问题,则此警告可能不是什么大问题,但如果您非常有动力解决问题,则有一些选择:

选项1
如果您只想让错误消失,最简单的方法是通过添加强制 GPU 调用光栅化 View + 阴影

.drawingGroup()
在 .shadow View 之后的某个地方。请注意,与动态阴影相比,这可能看起来很糟糕。如果您熟悉 UIKit,这类似于 UIView 上的 layer.shouldRasterize 属性。

选项 2
说到 UIKit,另一种方法是使用 SwiftUI 绘图逻辑的 UIViewRepresentable 或完全独立的 UIView。无论哪种方式:
myView = UIView()
myView.layer.shadowPath = UIBezierPath(rect: myView.bounds.cgPath)
应该让你开始......其他阴影属性和东西会有所帮助。

选项 3
您可以以编程方式(硬)或在成像编辑应用程序中(烦人)将阴影渲染为图像,并加载为 Z 索引低于您的 View 的图像,并缩放它们以产生深度错觉。
这是游戏开发人员在拥有蹩脚硬件但仍希望事情看起来不错时所做的那种hacky 工作。

最后......对于大多数 SwiftUI View ,此警告可能可以忽略。如果您在 Instruments 中加载代码,您可能会看到 View 下阴影的动态渲染可能不会显着影响您的 View 渲染性能。此警告通常仅在 UI 调试 session 中可见。
希望这有助于您走上解决方案的道路。

关于swift - 在 SwiftUI 中,如何以高性能绘制阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64077689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com