改进 UIWebView 初始化时间

Improving UIWebView initialization time

我的公司使用 UIWebView 来展示广告。我遇到的问题是初始化 UIWebView 似乎很昂贵;使用 Time Profiler 进行的分析显示 [UIWebView alloc] initWithFrame:CGRectMake(0,0,500,500)] 需要 31–40 毫秒。这足以导致游戏 运行 在 60 FPS 时出现明显的帧下降。

有没有办法解决这个缓慢的初始化时间问题?我目前的想法是在应用程序启动时(但在游戏开始之前)创建一个 UIWebView,然后重用它(可能创建一个池以供重用,例如 UITableViewCell 的工作方式)或尝试并看看 WKWebView 是否有更好的表现。

这是我的发现:

  1. WKWebView 不会更快地初始化。创建 WKWebViews 花费的时间与创建 UIWebViews 的时间相似(在我做的第 1 次测试中,创建两个 WKWebViews 花费了 46 毫秒。
  2. 创建第一个 Web 视图比创建后续 Web 视图花费的时间要长得多。第一个需要 31-42 毫秒;随后的创建需要约 11 毫秒。这里的好消息是创建第一个 web 视图时,例如。该应用程序的启动允许以更便宜的方式创建未来的网络视图,避免在游戏 运行.
  3. 时出现 40 毫秒的命中
  4. 创建一个 UIWebViews 池是我用例的一个很好的解决方案。通过在应用程序启动时创建网络视图然后重新使用它们,我避免了在游戏 运行.
  5. 时导致帧丢失

UIWebViewWKWebView之间的响应性没有太大差异,因为WKWebView是为了iOS和OSX之间的一致性问题而引入的.无论哪种方式,底层引擎都是Webkit,需要大量初始化。

我最近几年发现的最佳解决方案是从加载了 url 的 0.1 alpha 视图开始淡化 WebView。注意不要从 0.0 开始,也不要让您的 webview 与主视图层次结构分离,因为您的 url 不会被加载。

当调用 didFinishLoading 时,您可以将其淡化为 1.0,从而提供更好的用户体验。 我个人不喜欢 UIWebView 池,因为我在维护它时遇到了一些内存问题,尤其是在 iOS 7 台设备上。