Unity 2017打包iOS版本参数丢失

Unity 2017打包iOS版本参数丢失

1)Unity 2017打包iOS版本参数丢失
2)如何解决相机不渲染的问题
3)Unity出安卓APK超过2G,无法正常安装运行
4)在Shader中用if分支避免纹理采样是否合理
5)Shader中如何对没有开放在Property中的属性,且在editor模式下的变量设置初始值


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

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


Shader

Q:如图,Unity 5.6.6版本下打包iOS并没出现问题,升级到2017后安卓没问题,iOS打包后不少参数丢失,Shader表现异常。


丢失的参数和代码中如何使用看不出任何关联,连_Time这种内置参数也会丢失。目前仅发现使用了UNITY_INSTANCING_BUFFER_START定义的参数会较大概率丢失。设置InstanceStrip为KeepAll,打包材质,放入alwaysinclude都无法解决该问题。
(2017.4.28和2017.4.32都试过)

A:逐行查看编译后的metal代码,发现根源问题是UNITY_INSTANCING_BUFFER_START内定义的Float4。如果与外部定义的Float4不连续时,生成的Buff大小不正确,甚至会出现参数丢失的可能。修改为Float4连续,最后放Float后正常。

感谢题主jiacat@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d8ad7ab39b494208a464ff4


Animation

Q:一个比较大的模型在进入场景或者出场景时,由于大部分都在屏幕外面,只有一小部分在屏幕内,Unity就默认只优化不渲染,但是此操作会导致模型突然闪入或者闪出屏幕,请问一下这个应该怎么解决呢?

A:发现是动画的问题,这个模型是一个动画做的漂浮的物件,美术直接使用的Legacy CullingType选了Base on Renderer,进入屏幕前的动画是没有启动的,改成Always Animate就可以正常显示了。

感谢题主好心情@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d81ad59f6bfcf23aea6a88d


Build

Q:安卓APK包超过2G大小,无法安装或者安装后无法启动运行,看Log是Zip解压问题,这是什么原因?

A:这个是安卓平台限制的,之前我们也遇到了,后面发现安卓应用商店的包都没有超过2G的APK,最大见过1.98G,超出的资源只能走分包了,热更新进行下载。

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


ShaderLab

Q:在Shader中用if分支避免纹理采样是否合适?

Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _MaskTex ("Mask Texture", 2D) = "white" {}
    [ToggleOff] _UseMaskTex("Use Mask Texture", Float) = 0.0
    }

如上我定义一个变量来决定是否采样Mask贴图,然后在frag中这样:

half4 frag (v2f i) : SV_Target
{
    half4 mainColor = tex2D(_MainTex, i.uv);
    if (_UseMaskTex)
    {
            half4 maskTex = tex2D(_MaskTex, i.uv);                    
                mainColor *= maskTex.r;
    }
        return mainColor;
}

我查了一些资料,大部分都说Shader里的动态分支开销很大,然后看到有些朋友说定义在Properties里的变量作为if的判断条件,属于静态分支,在GPU处理同一批像素中可以只走一条分支而不走另外一条分支的开销。

所以我想请问的是,如果我通过一个Properties的变量来控制是否采样某张(或某几张)贴图,是否合适。我期望的是当开关关闭时,可以以另一个较小的开销来避免贴图采样的开销。

PS:我知道可以通过变体来控制,但是会增加Shader内存,所以想请教一下这个方案是否可行,谢谢。

A1:我记忆中是这样的,GPU中的if分支本身是存在开销的,大概相当于十几条计算指令的开销。但是当一块连续像素(可能移动端GPU上的一个tile)走的是同一个分支的情况下,就不会对另一个分支进行计算。个人猜测如果是从Properties传值这样的静态分支,最终的消耗应该就是if本身 + 所选的分支开销。所以不只是静态分支,有时使用if对分支内大量计算进行优化还是有效的。

Shader太简单可以试试通过叠Overdraw来测试,比如:一个Shader用if返回颜色,另一个Shader采一次图,都使用Alpha blend然后在摄像机前叠100层去测试性能。
感谢王阳@UWA问答社区提供了回答

A2:个人觉得还是加个Keyword的好,让这种选择在CPU端来做,就GPU而言所有同一个warp中的thread必须执行相同的指令,如果这些线程在遇到控制流语句时,如果进入不同的分支,那么同一时刻除了正在执行的分支外,其余分支都被阻塞了,也就是说不管你做与不做都在那里耗着,十分影响性能。当然你考虑的变体导致内存问题也有可能,比如你的Shader已经存在1000个变体了,再加上这个Keyword那就有2000个变体了,内存的占用是很恐怖的,不过这个时候你的重点应该是怎么去修改你的Shader,当然如果你这个处理的像素在屏幕上只是很小一部分,其实怎么做都可以。

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


Shader

Q:Shader中如何对没有开放在Property中的属性,且在editor模式下的变量设置初始值?

例如上图中,需要全局设置默认fog颜色。

A:如下图所示:

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

封面图来源于网络


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

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