Unity 3D: 资产包 vs 资源文件夹 vs www.Texture

6
所以,我在Unity 3D的论坛上阅读了一些有关AssetBundles和Resources文件夹的内容,但是我无法找到解决我面临问题的最佳方案。以下是问题:
我的程序是为独立运行而设计的,它加载“书籍”,里面包含.png和.jpg图像。目前,每次程序启动时,页面都是相同的。在任何“书籍”的场景开始时,它会使用www.texture和路径一次性加载所有这些图像。然而,我现在意识到,这可能是在运行时访问事物的一种低效方法--很慢!这意味着用户在场景开始并加载书籍页面图像(在非传奇计算机上)时,无法做任何事情5-20秒钟。所以,我无法确定以下三个选项中哪一个速度最快:
1)每本书加载一个资产包(例如20个每个1 mb的纹理)。
2)每页加载一个资产包(每个1 mb)。
3)以上两种选项之一,但是从资源文件夹中加载。
哪个会更快?为什么?我了解到资产包由unity打包,但这是否意味着其中的纹理将在负载时间时进行预压缩并减少内存占用?资源文件夹是否导致较少的负载时间?这是什么情况?据我了解,资源文件夹会加载到缓存中--但是它是否与独立播放器通常使用的缓存相同?还是多余且未使用的空间?我想另一个问题是我不确定从内存中加载事物和将它们存储在缓存中之间的区别。
感谢大家...
2个回答

9
资源文件夹是捆绑管理的资产。这意味着它们将被Unity压缩,遵循您在IDE中应用的设置。因此,在运行时加载非常高效。您可以为每个平台定制压缩,进一步优化性能。
我们大量使用Resources.Load()来拉取资产,在桌面和移动设备上表现良好。
还有一个特殊的文件夹叫做StreamingAssets,您可以在其中放置捆绑的未管理资产。这是我们想要在运行时播放视频,但不希望Unity将其转换为默认的ogg编解码器的地方。在移动设备上,这些视频会在本机视频播放器中播放。您也可以在其中放置图像,并且加载它们就像使用WWW类一样。由于Unity需要在加载时对图像进行消毒和压缩,因此速度较慢。
由于处理资产的开销,上述过程的开销较大,因此加载WWW会变慢。但是,您可以从服务器或应用程序“沙盒”外部获取数据。
  • 仅加载需要显示的内容,并实现后台进程以在用户忙于浏览每本书的前几页时获取其他内容。这将避免阻塞UI太长时间。
  • 优化图像以减小文件大小。如果需要透明图像,请使用tinypng,否则请使用压缩的JPG。
  • 尽可能使用2的幂次方图像。这应该会稍微加快运行时处理速度。
ath.

这是一个关于资源文件夹的好答案,但我仍然有点困惑我如何使用AssetBundles。我将尝试从资产文件夹中加载内容,看看效果如何。 - Catlard
2
AssetBundles 就像是一个在运行时从外部加载的资源文件夹。您可以从本地源或服务器加载捆绑包。一旦加载完成,您就可以像编译时内置在 Resources 文件夹中的那些资源一样访问其资产。AssetBundles 可以很好地减少编译应用程序的大小,并在运行时加载动态内容(最有可能来自服务器),以确保用户拥有最新的资产。 - Jerome Maurey-Delaunay

4

Jerome提供了关于资源的很好的答案。为了在AssetBundles方面提供一些额外的信息,这里有两种情况:

你的游戏太大了

你有很多纹理,比如说,你的iOS游戏超过了100MB——这意味着苹果会向用户显示警告并阻止他们通过蜂窝网络下载。Resources无法帮助你,因为那个文件夹中的所有内容都已经打包进了应用程序。

解决方案: 将不是绝对必要的艺术作品移动到asset bundles中。构建这些bundles,将它们上传到某个服务器上,然后在运行时按需下载它们。现在你的游戏更小了,也不会出现任何可怕的警告。

你需要为不同平台使用不同版本的艺术作品

另一种情况:你正在为iPhone和iPad开发。由于以上原因,你尽可能缩小艺术作品的大小以符合iPhone的100MB限制。但现在游戏在iPad上看起来很糟糕。怎么办?

解决方案: 创建一个asset bundle,其中包含两个变体。一个是低分辨率艺术作品的手机版本,另一个是高分辨率艺术作品的平板版本。在这种情况下,asset bundles可以随游戏一起发布或发送到服务器上。在运行时,你只需要选择正确的变体并从asset bundle中加载,就能获得适当的艺术作品,而不必在每个地方都进行if/else判断。

总之,AssetBundles使用起来更加复杂,文档也不够完善,Unity的演示有时也会出现问题。因此,请认真评估是否需要使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接