5

ParticleSystem的内存会受到MaxParticles影响吗

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_285.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1)ParticleSystem的内存会受到MaxParticles影响吗
​2)使用代码修改图片压缩格式报错
3)Unity纹理导入设置对内存影响
4)Unity中视频播放的解决方案


这是第285篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Memory

Q:ParticleSystem的内存会受到MaxParticles设置的数值影响吗?

A:在真机上做了一个测试,Unity 2020.3.17,小米9。测试的特效是Unity默认的ParticleSystem特效,结果如下:

1.png

从上面的图上可以看到,内存受到“实际最多粒子数量”的影响,(可以大约理解为持续时间*每秒发射数量,不考虑Burst的发射方式)。当发射数量为0时,ParticleSystem也是有9416Byte的内存占用,这个是Unity内置的各种序列化的东西的占用。

另外,当“实际最多粒子数量”确定后,Active的粒子数随着播放时间增长越来越多,内存占用是不会变的,如下图所示。

2.png

3.png

PS:
当ParticleSystem发射的是Mesh时,会造成Gfx内存上升,且这个Mesh内存占用是不统计到Assets/Mesh内存占用中的。

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6200a0df34a9f84e39f4cd3d


Texture

Q:想新增图片时,自动化处理图片的设置,结果设置图片时报错了,网上也没有找到解决方案,错误如下:Selected texture format ‘Unsupported’ for platform ‘Android’ is not valid with the current texture type ‘Sprite’。

Unity版本:2019.4.34f1

public class TextureImporterProcessor : AssetPostprocessor
{
    void OnPostprocessTexture(Texture2D texture)
    {
        bool haveAlpha = textureImporter.DoesSourceTextureHaveAlpha();
        textureImporter.isReadable = false;
        textureImporter.mipmapEnabled = false;
        textureImporter.alphaIsTransparency = haveAlpha;
    textureImporter.textureType = TextureImporterType.Sprite;
        textureImporter.textureCompression = TextureImporterCompression.Compressed;

        TextureImporterPlatformSettings androidSettings = new TextureImporterPlatformSettings()
        {
            name = "Android",
            overridden = true,
            format = haveAlpha ? TextureImporterFormat.ASTC_RGBA_6x6 : TextureImporterFormat.ASTC_RGB_6x6,
        };
        textureImporter.SetPlatformTextureSettings(androidSettings);

        TextureImporterPlatformSettings iOSSetting = new TextureImporterPlatformSettings()
        {
            name = "iPhone",
            overridden = true,
            format = haveAlpha ? TextureImporterFormat.ASTC_RGBA_6x6 : TextureImporterFormat.ASTC_RGB_6x6,
        };
        textureImporter.SetPlatformTextureSettings(iOSSetting);

        textureImporter.SaveAndReimport();
    }
}

A1:可能是纹理格式的问题,我这边把ASTC_RGBA_6x6改成ASTC_6x6就没有这个报错了。

感谢宗卉轩@UWA问答社区提供了回答

A2:补充上楼的,TextureImporterFormat格式指定有问题,ASTC整合了带A的格式,所以代码里都统一成ASTC_x了。在新的2020版本里已经没有ASTC_RGBA与ASTC_RGB的区分,都统一到一个接口ASTC_x里了,应该是版本过渡的问题,Unity 2019有很多的过渡问题,在2020上面就好很多了。

感谢廖武兴@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61f11918d8413e18eb9613cd


Texture

Q:一张2048x2048的图片但实际像素只有512x512,和一张512x512的图片有什么区别?我们在制作类似纸娃娃的系统,想定一个标准。目前定的512x512的尺寸(为扩展性考虑)。但是大多数装扮尺寸实际可能只有250x250,想知道实际上在加载和内存中会有区别吗?

A1:实验的数据,同样一张图大小为1024的图,在工程设置如下,比较出结果 :

4.png

5.png

以上测试数据是在PC下的测试数据。手机上的数据,楼主可以自己测试一下就知道了。前期可以考虑使用512的尺寸制作原图,然后制作一个工具,在出包时选择自己需要的压缩尺寸。

感谢廖武兴@UWA问答社区提供了回答

A2:续接楼上的回答。

纹理加载进内存以后占用内存计算公式是:
纹理内存(字节) = 宽 x 高 x 像素字节
像素字节 = 像素通道数(R/G/B/A) x 通道大小
也就是说:运行时大小 = 长x宽x每个像素占的大小

举例:RGBA 8888表示的是通道RGBA每个通道都占用8bit那么也就是一个像素占用了4bytes。故,图片大小若为1024x1024,则大小=1024x1024x4/1024/1024 = 4MB。

楼上的例子中采用了ASTC 4x4 block压缩格式。

6.png

ASTC 4x4 block压缩格式,每个像素占用1字节,8bits。一张1024x1024大小的贴图压缩后的大小为1MB。

感谢马三小伙儿@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61f21724d8413e18eb976bdb


Video

Q:需要在游戏内播放视频,满足一些基本的需求,比如播放远程视频,边下边播,设置视频播放速度,视频进度条,暂停之类的。

目前已知的可以用自带的Video Player、AVPro和Sofdec2这三款,想问下有没大佬系统研究过视频播放这一块的,可以分享一点经验,不胜感激。

A:就题主提到的三款视频方式,我用过Video Player和AVPro。

在普通使用上Video Player已经能满足大部分需求,但是在对视频兼容性上,以及平台适用性上,AVPro要比Video Player强很多,而且Video Player还需要自己封装一些接口以便方便自己使用。

Video Player在每个平台有一些特定的要求格式,所以在兼容性上也要自己把控,而且很有可能在Android平台上,有些视频会导致一些莫名的黑屏。它的优点在于轻便,不需要过多的集成,与引擎的兼容性很好,升级引擎不会带来版本不一致的烦恼。

AVPro的一些缺点是功能比较多,对于一些不需要的功能,会比较臃肿,与引擎兼容也不如Video Player。优点就明显了,功能上还是很强大的,而且在平台的兼容性有很好的表现。有一些固定的解码算法,在Android平台上的表现最明显。

很多东西都是双刃的。看自己的需求,没有最好的,只有最合适的。有得必有舍,有舍必得。应该针对自己的需求以及当前项目的限制,周全考虑适合自己的。

感谢廖武兴@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61ee78c5d8413e18eb925149

封面图来源于:GPU Particles Unity
用于Unity的GPU粒子系统。


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK