Unity 2017打包iOS版本參數丟失

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表現異常。
測試

丟失的參數和代碼中如何使用看不出任何關聯,連_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問答社區提供了回答

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分支避免紋理採樣是否合適?ui

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

如上我定義一個變量來決定是否採樣Mask貼圖,而後在frag中這樣:spa

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的變量來控制是否採樣某張(或某幾張)貼圖,是否合適。我指望的是當開關關閉時,能夠以另外一個較小的開銷來避免貼圖採樣的開銷。3d

PS:我知道能夠經過變體來控制,可是會增長Shader內存,因此想請教一下這個方案是否可行,謝謝。code

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問答社區提供了回答


Shader

Q:Shader中如何對沒有開放在Property中的屬性,且在editor模式下的變量設置初始值?

例如上圖中,須要全局設置默認fog顏色。

A:以下圖所示:

感謝約定@UWA問答社區提供了回答

今天的分享就到這裏。固然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,咱們早已在UWA問答網站上準備了更多的技術話題等你一塊兒來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com 官方技術QQ羣:793972859(原羣已滿員)

相關文章
相關標籤/搜索