失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > build unity 丢失_【厚积薄发】Unity 打包iOS版本参数丢失

build unity 丢失_【厚积薄发】Unity 打包iOS版本参数丢失

时间:2019-07-09 05:17:24

相关推荐

build unity 丢失_【厚积薄发】Unity 打包iOS版本参数丢失

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

UWA 问答社区:

本期目录:

Unity 打包iOS版本参数丢失

如何解决相机不渲染的问题

Unity出安卓APK超过2GB,无法正常安装运行

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

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

Shader

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

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

(Unity .4.28和Unity .4.32都试过)

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

感谢题主jiacat@UWA问答社区提供了回答,欢迎大家转至社区交流:

/question/5d8ad7ab39b494208a464ff4

Animation

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

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

感谢题主好心情@UWA问答社区提供了回答,欢迎大家转至社区交流:

/question/5d81ad59f6bfcf23aea6a88d

Build

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

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

感谢田航@UWA问答社区提供了回答,欢迎大家转至社区交流:

/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问答社区提供了回答,欢迎大家转至社区交流:

/question/5d81e71691262623a9fc75f0

Shader

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

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

A:如下图所示:

感谢约定@UWA问答社区提供了回答,欢迎大家转至社区交流:

/question/5d82e3f191262623a9fc760e

封面图来源于网络

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

官网:

官方技术博客:

官方问答社区:

UWA学堂:

如果觉得《build unity 丢失_【厚积薄发】Unity 打包iOS版本参数丢失》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。