技术分享连载(六十六)

原文链接:https://blog.uwa4d.com/archives/TechSharing_66.html

我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:465082844
UWA 问答社区:answer.uwa4d.com


资源管理

Q1:我在Unity 5.5.2下用AssetBundle依赖打包,但是LoadAllAssets之后,内存中却存在两份相同的文件。

打包过程如下: 将资源A(material)打包到testmaterial.bundle,然后将纹理B打包到testtexture.bundle,再使用一个Sprite C引用纹理B后,将Spirite生成一个Prefab并将其打包到testprefab.bundle。最后导出成的3个Assetbundle之间的依赖关系为:A(testmaterial.bundle)依赖 B(testtexture.bundle),C(testprefab.bundle)依赖B(testtexture.bundle),从最后的生成的manifest也可以看出来依赖关系跟预期的一致。
请输入图片描述
请输入图片描述

测试内存:
我们分别将这个3个AB使用相同的方式在一个空工程中做测试,代码如下:

请输入图片描述

然后在Profile查看内存得到的结果,很明显在内存里面测试的纹理存在两份,这是为什么呢?
请输入图片描述

我们按照提问者的步骤做了下测试,确实在Unity 5.5.2版本中复现了这个问题,可见下图,mat对应了testmaterial.bundle,texture对应了testtexture.bundle,sprite对应了testprefab.bundle。可见纹理会出现在mat和texture两个bundle中,且mat也不再依赖于texture(这与manifest中的记录不符,所以暂估计是Unity的Bug)。
请输入图片描述
但在Unity 5.3.5中用同样的方式打包是没问题的,结果见下图:
请输入图片描述
总之,Unity 5.5系列中这种用法确实需要注意了,目前暂时只能通过把mat和texture合并在一个包里来解决。

另外,感谢UWA 问答社区的钱康来补充了以下内容:
我们在使用Unity 5.4的时候,也遇到这个问题,经过反复测试后发现:如果一个贴图一方面被当成Sprite使用,另一方面被当成Texture使用(譬如RawImage或者Material),就会断开引用产生多份。目前解决办法是保证用Sprite的Prefab及Material打包在一个AssetBundle。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/5927c74052f250573aa862d9
如您对该问题仍有疑问,可以转至社区进行进一步交流。


UGUI 字体

Q2:Unity 5.5版本下的UGUI,我将字体设置为粗体,发现字体只是变宽不加粗,不像正常的粗体,如下图所示。另外,TestMesh Pro需要预渲染,不能用动态字体,只能用于特定范围,有像NGUI(效果还不错)那种对动态字体加粗的方法么?
请输入图片描述

动态字体加粗显示的外观是和字体本身有关系的,如果字体中没有包含“粗体”的字形,那么Unity会通过拉伸来“模拟”加粗,因此得到的效果是有问题的。而这个行为在UGUI和NGUI中是一样的。因此,如果要确保加粗显示正确,则需要使用包含了“粗体”字形的字体,甚至需要考虑是否将其include到发布包中(因为某些设备中的内置字体也有可能被精简过)。


性能优化

Q3:这个红框里面的内存是如何生存的?是实例化生成的吗?但为什么GameObject被销毁掉之后,这部分内存也不会被释放呢?
请输入图片描述

图中的MonoBehaviour也包含了被加载出来的Prefab上的组件(通过Load接口加载出来的),而这部分组件只能在Prefab被销毁的时候才会释放。


UGUI

Q4:请问UGUI Image 在切换Sprite(网络图片) 的时候有卡顿,从Profiler中看到具体卡在SpriteMeshGenerator.TraceShape 这个方法上,如下图所示,有没有什么优化的方法呢?
请输入图片描述

图中的SpriteMeshGenerator.TraceShape/Decompose/Simplify的函数,通常出现在加载或者创建(Sprite.Create)SpriteMeshType为Tight类型的Sprite时,Tight类型的Sprite在加载或创建时,需要检测图片的alpha区域从而生成多边形。计算量较大,建议将其改为FullRect模式。


性能优化

Q5:New出来的Mesh好像都是可读写的,在我填充完数据以后,有什么办法能把这个Mesh改为只读么?

通过 new Mesh创建的网格可以通过以下接口变为只读的,从而降低一部分的内存占用:
https://docs.unity3d.com/ScriptReference/Mesh.UploadMeshData.html


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站(answer.uwa4d.com)上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:465082844(仅限技术交流)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Halide 是一个开源的图像处理和计算机视觉 DSL(领域特定语言),其目的是让程序员更加轻松地编写高性能的图像处理代码。Halide 的特点是具有易于使用的语法、高性能的代码生成以及可移植性。 本系列文章将介绍 Halide 的基本语法和使用方法,并通过一些实例来演示如何使用 Halide 进行图像处理和计算机视觉任务。 第一篇文章将介绍 Halide 的基本概念和安装方法。 ## 什么是 Halide? Halide 是由丹尼尔·瑞德福(Daniel R. Johnson)和 Jonathan Ragan-Kelley 在 MIT 开发的一个开源项目。它是一个用于编写高性能图像处理和计算机视觉代码的 DSL。 Halide 的主要目标是使程序员能够使用一种简单易懂的语法编写高性能的代码,而无需了解 CPU 或 GPU 的细节。Halide 支持多种平台,包括 x86、ARM、MIPS 和 PowerPC 等 CPU,以及 NVIDIA、AMD 和 ARM 等 GPU。 Halide 的核心概念是“函数”。函数可以看作是一组描述了如何对输入数据进行处理的指令集合。这些指令可以被 Halide 编译成高效的 CPU 或 GPU 代码,并在运行时执行。 ## Halide 的安装方法 Halide 可以在 Linux、macOS 和 Windows 等操作系统上运行,并且支持多种编译器,包括 GCC、Clang 和 MSVC 等。下面是在 Ubuntu 20.04 上安装 Halide 的步骤: 1. 添加 Halide 的 PPA: ``` sudo add-apt-repository ppa:halide/ppa ``` 2. 更新软件包列表: ``` sudo apt-get update ``` 3. 安装 Halide: ``` sudo apt-get install libhalide-dev ``` 安装完成后,可以使用以下命令检查 Halide 是否已经安装成功: ``` pkg-config --cflags --libs Halide ``` 如果输出了一些 Halide 相关的信息,则表示 Halide 安装成功。 ## 总结 本篇文章介绍了 Halide 的基本概念和安装方法。下一篇文章将介绍 Halide 的基本语法和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值