移动平台纹理压缩格式选择

1)移动平台纹理压缩格式选择
2)Unity 2018是否在Mali GPU上支持Alpha 8格式
3)如何在Unity自带的Navmesh上获取地面高度
4)ParticleSystem无法重新播放
5)UI开发中按界面的打开顺序返回到上级面板的问题


Texture

Q:在这之前了解过纹理压缩的相关知识和UWA的一些推荐方式。但还是有一点小的疑问,所以在这里再次提出来,希望得到解答。

在纹理压缩格式的选择上,如果Android选用ETC,iOS选用PVRTC,因为有2的次方(ETC1和PVRTC)长宽相等(PVRTC)的要求。

问题1:大家对于美术出图的大小要求是怎样的?

  • 出图就出成2的次方。
  • 出图不是2的次方,然后通过Unity默认的NPOT的选项让它自动转换了。
  • 其它方式?

问题2:上述1和2两个方式有本质上的区别吗?看到UWA上Xin大提到了直接使用NPOT的方式(3年前的问题了):
https://answer.uwa4d.com/question/58d2943ae00cc20065a42597

问题3:2的次方要求极端情况会导致ETC2(4的倍数要求,但考虑到如果要使用PVRTC)的内存占用变得很大,这种情况选择ETC2还是RGBA16?

2的次方的要求极端情况会导致宽高都扩大接近一倍(比如:300*300往大的变会变成512*512),这样算下来多数情况如果带Alpha,512*512的ETC2-RGBA比300*300的RGBA16的内存占用还要高。

问题4:大家在纹理压缩格式的选择上,现在(2019年)的项目都是怎样选择的?

ASTC考虑设备的普及情况,Android暂时没有考虑,iOS在考虑范围内(A8要求)。

A:先说问题4吧,这个会影响之前的问题。

2019年,我觉得中国大陆的产品iOS上ASTC已经没什么问题了。iPhone 5s以及之前的设备就算了吧,内存就够玩的了(当然还要看游戏类型,休闲小游戏还是要考虑更多兼容)。放弃的另外一块是iPad mini和老的iPad,iPad的更新频率比较低,所以老设备多一些,但是市场占有率整体也低。

Android我觉得ETC2够用了,像normal等特殊贴图用特殊的压缩方式,也没必要强上ASTC。

iOS:2018年上线的项目强上了ASTC,主要是因为UI不接受PVRTC的压缩效果。

这种选择的情况下:
问题1:方形就不用考虑了,不重要。POT建议遵守,这种对于GPU性能有好处,通过合图以及美术规范就可以处理了。

问题2:大部分情况下没有本质区别,只要贴图按照UV采样就没问题。个人倾向于让POT成为美术基本的出图规范(特殊的Loading图等除外)。另外就是美术,如果知道可以用到更大尺寸而消耗又一样,也许可以增加一些细节。

问题3:RGBA16如果效果不失真可以考虑。话说300*300这种,你可以选择搞成256*256,但是整体肯定还是推荐压缩的格式,大部分情况下都比RGBA16要好一些(内存消耗+效果整体考虑)。

一般来说,UI大部分会合图成POT的,3D的部分都以POT的方式设计和制作,这样整体的规范比较好制定。特殊的部分才用NPOT的,也只会影响比较少的部分。

感谢贾伟昊@UWA问答社区提供了回答


Texture

Q:测试机型OPPO A3,贴图大小1024*1024

测试样例一:
Unity 2017.4.16 / 21张 Alpha 8图片

测试结果:

测试样例二:
Unity 2018.3.13 / 11张 Alpha 8图片 / 11张 R8图片

测试结果:

根据第一张图片对比,可以看到Unity 2017.4.16不支持Alpha 8格式,而Unity 2018.3.13的格式支持Alpha 8格式贴图,根据第二张图片的Graphics内存大小验证发现Unity 2017上Alpha 8格式已经FallBack到4MB的RGBA32,而Unity 2018上Alpha 8格式内存还是保持在1MB。同时我用SnapDragon Profiler抓帧小米5机器发现Unity 2018打包的APK中Alpha 8格式被转换成R8格式。

简而言之:Unity 2017.4.16打包的APK中不支持Alpha 8并且Fallback为RGBA32格式,Unity 2018.3.13打包的APK中支持Alpha 8,而且用SnapDragon Profiler抓帧发现在GPU中以R8格式存在。

问题一:Unity 2018.3.13能支持Alpha 8格式贴图?
问题二:Unity 2018的R8格式在iOS或者Android上是否对硬件有要求?

A:问题1:
Unity在GLES3对于单通道Alpha 8的图,其实都是会变成R8的,这也就是为什么题主截出来的图是R8的。为了支持在Shader中可以使用Alpha通道获取R8贴图中R通道的数据,就需要依赖于Texture Swizzle机制。不幸的是Unity 2018针对GPU为Mali并且系统版本在Marshmallow及以上的机器,都认定Texture Swizzle机制存在问题。所以Unity会将Alpha 8直接Fallback到了RGBA格式上,导致GPU上对应贴图内存变为4倍。

问题2:
1)Unity对于GLES 2.0,直接支持Alpha 8的图,应该不需要考虑转到R8的问题了。当然R8本身也是支持的。
2)对于iOS,我还没测试过,就不下定论了。

感谢[email protected]问答社区提供了回答


Navmesh

Q:在人物做移动的时候,都不会使用重力、刚体之类的,玩家想去一个点,y的坐标就得获取地形的高度,对此有什么好的办法吗?

A:把地形数据存为二进制,然后就能根据x、y得到高度了。可以把是否能行走记录下来,整体记录到一个大的二维数组中,然后直接存储到本地文件。读取的时候根据x、z直接去索引二维数组的对应地图数据。

感谢[email protected]问答社区提供了回答


ParticleSystem

Q:在对特效设置显隐中,不使用SetActive true/false, 而是移到屏幕之外,然后对animator enable true/false,以期减少Animator instance开销。

届时特效中附带的粒子无法重新播放,导致特效从屏幕外移回屏幕内时,特效上粒子都丢失。附上代码和特效

  {
        if (obj == null)
            return;

//         //显示隐藏暂时遇到粒子系统无法重新播放的问题, 暂时用原有方式
//        obj.SetActive(bActive);
//        return;

        Vector3 pos = obj.transform.localPosition;
        Animator[] Anis = obj.GetComponentsInChildren<Animator>();

        //没有animator 显影直接SetActive true/fasle
        if(Anis.Length <= 0)
        {
            obj.SetActive(bActive);
            return;
        }
        if (bActive)
        {
            if (pos.x > 10000)
            {
                pos.x = pos.x - 10000;
            }
        }
        else
        {
            if (pos.x < 10000)
            {
                pos.x = pos.x + 10000;
            }
        }
        for (int i = 0, count = Anis.Length; i < count; i++)
        {
            Anis[i].enabled = bActive;
            if (bActive)
            {
                AnimatorStateInfo anif = Anis[i].GetCurrentAnimatorStateInfo(0);
                Anis[i].Play(anif.nameHash, 0, 0);
            }
        }
       // if(bActive)
        {
            ParticleSystem[] pars = obj.GetComponentsInChildren<ParticleSystem>();
            for(int i = 0, count = pars.Length; i<count;i++)
            {
                if (bActive)
                    pars[i].Play();
                else
                    pars[i].Pause();
            }
        }
        obj.transform.localPosition = pos;
    }

A:下面的写法暂时没遇到你说的情况:

// 开始播放
foreach (var particleSystem in m_ParticleSystems)
{
    particleSystem.time = 0;
    particleSystem.Play(false);  // false参数不递归子物体
}

// 停止播放
foreach (var particleSystem in m_ParticleSystems)
{
    particleSystem.Clear(false);
    particleSystem.Stop(false);
}

感谢张迪@UWA问答社区提供了回答


UI

Q:UI开发中界面返回的方法我是用栈的方式实现的,会把面板信息存到栈中,但是会出现要打开的新面板已经在栈中存在,这种是要怎么处理,还有可能会出现成环的问题,就是类似这种 A→B→C→A→B→C ,这种要怎么处理?怎么判断是否成一个环?设计上是可以避免,但是如果出现了要怎么处理?求各位大佬帮帮忙。

A1:如果做了完备的数据和表现分离,将当前界面状态,比如选中的Tab页、滚动到的位置等信息存储下来,栈内存储的是界面ID和这些信息,做支持已经存在的栈是完全可以支持的。

当然,你也可以和策划沟通来确认。如果出现你描述的新面板在栈中已经存在如何处理,比如:是否可以就从栈中删除然后添加到新的位置,逻辑上也可以,只是确定表现是否合适。

最后,栈记录的是玩家之前看过的界面,即便有环,也不是无尽的环,另外这个栈通常会有一个上限,配合一个清空时机,来避免内存占用过多之类的问题。
感谢贾伟昊@UWA问答社区提供了回答

A2:一般界面是分层级设计的,比如:一级面板,二级面板,三级面板,四级面板,Tips面板。同级面板只允许同时打开一个或左右各一个。

从高层级面板跳转打开低层级面板时,直接清空低层级之上的栈数据。比如:A是一级面板,B是二级面板,C是三级面板。从C跳转打开A时,直接清空二三级数据,并替换一层级面板的数据。

如果要检测也可以,直接从底部扫描一下,发现有相同的,就清除这个位置以上的。比如:A–>B–>C 这时打开A,发现第0个位置已经存在A了,就直接删除位置1以上的节点。

不要用栈,直接用数组会更方便。

感谢[email protected]问答社区提供了回答



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

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

原文地址:https://www.cnblogs.com/uwatechnologies/p/12601061.html

时间: 2024-10-10 04:59:13

移动平台纹理压缩格式选择的相关文章

常用纹理和纹理压缩格式

转载至: http://blog.csdn.net/ynnmnm/article/details/44983545 by 夜风 简单纹理格式 RGBA8888 每个像素4字节,RGBA通道各占用8位 RGBA4444 每个像素2字节,RGBA通道各占用4位 RGB888 每个像素3字节,RGB通道各占用8位,无透明通道 RGB565 每个像素2字节,RGB通道各占用5/6/5位,无透明通道 RGBA5551 每个像素2字节,RGB通道各占用5位,透明通道1位,所以要么完全透明要么不透明 DXT纹

Unity3d纹理压缩格式表

将Texure Type设置为Advanced时纹理的格式列表 格式 详解 Automatic Compressed 压缩RGB纹理,默认选项,常用的漫反射纹理格式.4位/像素(32KB, 256x256) RGB Compressed DXT1 压缩的RGB纹理.常用的漫反射纹理格式.4位/像素(32KB, 256x256) RGBA Compressed DXT5 压缩的RGBA纹理.是漫反射和高光控制纹理的主要格式.1字节/像素(64KB, 256x256) RGB Compressed

纹理压缩

CCImage作为cocos2dx texture的核心处理函数包含了丰富的底层API调用和纹理格式操作,我想以CCImage来作为切入点发散性地去做扩展可能更加容易加深我们对cocos2dx引擎的理解,话不多说. #define CC_GL_ATC_RGB_AMD 0x8C92 #define CC_GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 #define CC_GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE CCImage

为什么需要纹理压缩

"最近在玩什么游戏,推荐一个".不管是谁,总会说过或听过这个问题吧. 这时候,你脑海里面浮现的也许是这样的画面 或许最终小伙伴们也能接受这样的游戏 但还是会有一些玩家更怀念这样的游戏 在软件开发,特别是三维应用中,纹理随处可见,但受限于网络环境和硬件能力,纹理也是一大瓶颈.而且在一般的三维应用中,纹理所占大小基本都会在1/2以上,模型中往往超过2/3.或许你会说,纹理不就是一张图吗,有那么重要吗? 如下两张对比图,可能你会认为前者逼格高,但对于正常人而言,后者显然要好很多.正是有了纹理

使用 PVRTC 压缩格式创建纹理(Creating textures in the PVRTC compression format)

使用 PVRTC 压缩格式创建纹理(Creating textures in the PVRTC compression format) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 有关该篇

干货:Unity游戏开发图片纹理压缩方案

原文:http://www.jianshu.com/p/f7c3741f22af Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,Android平台设置成RGBA16等. 嗯,非常的智能. 但是,在一些进阶的使用中,一些情况是难以满足的. 比如,我们NGUI的图集纹理,在Android平台,使用ETC

音视频开发的压缩格式分析

网络摄像机和音视频开发作为网络应用的新型产品,适应网络传输的要求也必然成为产品开发的重要因素,而这其中视频图像的技术又成为关键.在目前中国网络摄像机和音视频开发的产品市场上,各种压缩技术百花齐放,且各有优势,为用户提供了很大的选择空间.AnyChat音视频开发平台使用的就是h.264主流的音视频编解码.现在小编整理几种视频的压缩格式进行对比分析:         JPEG.M-JPEG 有相当一部分国内外网络摄像机和音视频开发都是采用JPEG,Motion-JPEG压缩技术,JPEG.M-JPE

DXT纹理压缩

转:http://blog.csdn.net/lhc717/article/details/6802951 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩色的贴图自然表现力也是越强,但是同时带来的问题是所需占用的内存会成倍的上升,而节省内存这一点在目前的游戏中还是非常非常重要的. 所以各个平台上都在使用纹理压缩的技术,让纹理贴图在内存占用和显示效果能达到一个尽可能的平衡.在DirectX中,使用一种叫做DXT的纹理压缩技术,目前这种技术被大部分显卡所

常见压缩格式比对,及 Linux 下的压缩相关指令

可先浏览加粗部分 一.常见压缩档 *.zip | zip 程序压缩打包的档案: (很常见,但是因为不包含文档名编码信息,跨平台可能会乱码) *.rar | winrar 进程压缩打包的档案:(在windows上很常见,但是是商业软件.) *.gz | gzip 程序压缩的档案: (linux目前使用最广泛的压缩格式) *.bz2 | bzip2 程序压缩的档案: *.xz | xz 程序压缩的档案: *.tar | tar 程序打包的资料,并没有压缩过: *.tar.gz | tar 程序打包的