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


Shader

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

unity ios 打包 bitcode unity ios 打包 错误_shader

 

unity ios 打包 bitcode unity ios 打包 错误_build_02

 

丢失的参数和代码中如何使用看不出任何关联,连_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后正常。

unity ios 打包 bitcode unity ios 打包 错误_贴图_03

 

感谢题主jiacat@UWA问答社区提供了回答


Animation

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

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

感谢题主好心情@UWA问答社区提供了回答


Build

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

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

感谢田航@UWA问答社区提供了回答


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层去测试性能。

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

感谢李星@UWA问答社区提供了回答


Shader

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

unity ios 打包 bitcode unity ios 打包 错误_贴图_04

 

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

A:如下图所示:

unity ios 打包 bitcode unity ios 打包 错误_build_05

感谢约定@UWA问答社区提供了回答