1)从Gamma空间改为Linear空间会导致性能降落吗
2)如何解决没有应用Unity Ads却收到了GooglePlay平台的正告
3)C#端如何解决xLua在执行DoString时候死循环
4)Texture2DArray相干


这是第350篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

Rendering

Q:Linear性能比Gamma差吗?咱们我的项目从之前应用的是Unity 2020.2.7f1版本,抉择的是Gamma。目前降级到2021.3.21f1,切换为Linear空间,Shader和图片都进行过批改,性能也优化过。

然而总体测试下来性能不如之前的Gamma,帧率没有以前高,帧率掉了很多,通过优化,还是不太令人满意,总感觉会卡顿,不晓得是不是从Gamma降级到Linear的起因?

A1:应该和换色彩空间没关系。如果没有非凡性能,Gamma和Linear的次要区别就是最初输入到显示器时要不要做色彩的修改,依据你的形容应该和批改Shader无关。

感激李伟@UWA问答社区提供了答复

A2:在硬件反对的设施上,不该当有显著的性能差别。

在硬件不反对的状况下(比方OpenGL ES 2.0),如果是基于Shader中的模仿转换来实现Linear Space的成果,会有肯定的GPU耗费。然而如果感触上是卡顿,而非继续的低帧率,那也不像是这种状况,倡议从具体的性能Profile数据动手来进行排查。

这里有一个相干的探讨,搜寻performance关键词能够看到一些人做的试验:
https://forum.unity.com/threads/gamma-vs-linear-space.613294/

局部论断援用如下:
“I have just done a stress test of Gamma vs Linear color spaces with transparencies and Gamma is indeed a liiiitle faster than Linear, but the difference is so minimal it doesn't even matter. (2 to 3 frames per second more on a stress test that was overdrawing 8 transparent planes one over the other for the full screen space.)
On any GPU that handles GLES3 there is no performance reason to use Gamma space over Linear.

Gamma space is legacy now and is only useful for legacy GLES2 GPUs (because linear requires GLES3)”

不同的游戏测试后果可能略有差别,但原理上应该是没有可观测的性能差别的,题主能够参考一下。

感激贾伟昊@UWA问答社区提供了答复

Script

Q:我没有应用Unity Ads,但依然收到了GooglePlay平台的正告:

您的“xxxxxxx”利用(版本代码:8)蕴含“com.unity3d.ads:unity-ads”SDK 或您的某个代码库所依赖的SDK,该SDK会收集集体数据或敏感数据,这些数据包含但可能不仅限于Advertising ID,Android ID标识符。依据用户数据政策的相干规定,利用不得将永久性设施标识符与其余集体数据、敏感的用户数据或可重置的设施标识符相关联。

自世界协调工夫(UTC)2023年1月11日午夜起,如果新利用版本蕴含SDK版本且不合乎用户数据政策,则可能无奈公布。您能够思考将该SDK降级至不含违规代码的合规版SDK(若有),或者从您的利用内移除该SDK。

依据您的SDK提供方的状况,您能够思考降级到4.0.1,并/或分割您的SDK提供方,看看是否有适合的更高版本可用。Google无奈举荐任何第三方软件,也无奈为这类软件提供任何背书。

A1:倡议查看下SystemInfo的援用。

感激Knight-132872@UWA问答社区提供了答复

A2:提供几个思路:
1、确认Package下有没有com.unity.ads包
2、如果应用的是Unity中国版,能够切换为以下版本或同版本国际版

感激bo@UWA问答社区提供了答复

A3:亲测,用对应的国内版本就行了,解包发现,中国版不管是否导入Ads,打的包外面都会有Ads内容,国内版本不会有这个问题,明天提交谷歌商店验证过了。

解包后在smali\com\unity3d目录下,splash文件夹,首先要在工程里移除Ads,再打包测试,我用2020.3.38f1和2018.4.36f1测试都没问题。

感激TimWang@UWA问答社区提供了答复

Script

Q:我应用xLua作为游戏的内嵌脚本语言,容许玩家自定义脚本。

当初有个玩家在脚本外面写了一个死循环,当我用DoString去加载这个脚本时候会间接卡死,于是我在里面退出了一个Task:

var isSucceed = false;var task = Task.Run(() => { isSucceed = sandbox.DoString(xxxx)//这里简化一下.外围就是加载这个脚本执行DoString});bool isCompletedSuccessfully = task.Wait(TimeSpan.FromMilliseconds(1500)); //1.5s timeoutif (!isCompletedSuccessfully){    CELog.LogError("加载脚本超时");    isSucceed = false;    luaEnv.Dispose(); //Kill掉以后的Evn    return; //不再加载后续脚本}

当初是只有调用‘luaEnv.Dispose()’编辑器就间接闪退,无论是这里Timeout了调用,还是等几秒当前。

我感觉是因为Task的Timeout只是在超时后回调,然而此时Lua还在死锁中,所以我无奈Dispose。

官网的FAQ提了一句:

调用LuaEnv.Dispose解体,很可能是这个Dispose操作是由lua那驱动执行,相当于在lua执行的过程中把lua虚拟机给开释了,改为只由C#执行即可。

我感觉和我这个状况是一样的,应该如何解决?

A:Update一下目前钻研的停顿:

这是找xLua求教的后果,目前满足我本人的需要:
https://github.com/Tencent/xLua/issues/1077

如果以上办法不满足,还搞不定底层,能够尝试以下几个方向:

MoonSharp
https://www.moonsharp.org/

MoonSharp是纯用C#写的Lua,不过曾经不更新了。Discord还有沉闷,问的问题都会解答。

https://gist.github.com/xanathar/2c777a79937398834ad4

用Hook的形式能够实现以上的需要。

长处就是纯C#的,相对来说好操作。不过就是性能弱,然而如果和我一样Lua只是用于玩家的Mod。其实还好,因为Lua端的逻辑会很弱。

nLua
https://github.com/NLua/NLua/issues/56

nLua的DebugHook是间接被集成好的,xLua的Hook大佬没给裸露进去,要本人搞。

uLua
https://assetstore.unity.com/packages/tools/utilities/lua-mod...

Assetstore下面的资源,近期还在更新。

感激题主Eran@UWA问答社区提供了答复

Texture

Q:从Texture arrays文档(https://docs.unity3d.com/Manual/SL-TextureArrays.html)上来看,GLES3 Metal 曾经能够反对了。

最容易想到的就是地形的Splat层,如果是四层Splat,那么就能够用一个Texture2DArray来代替,益处是缩小了Bind耗费。其中依据龚大(https://www.zhihu.com/question/56015505)的意思来看,仿佛还能够缩小Splat采样次数,但依据本人的测试和了解来看并不行,因为Texture2DArray的Slice之间并不会Blending,不知是不是我了解问题。

我应用一个Texture2DArray来代替4层的Splat地形,从xCode上看开销,并没有任何的减小,那目前来看这么做地形的意义就不是很大了。AssetStore上有一个插件叫MegaSplat就是应用Texture2DArray来达到很多层混合。

目前想到的Texture2DArray还有一个能够利用的中央是场景贴图。比方场景用到了多张 1024的贴图,或者多张Lightmap,原来因为贴图不同导致StaticBatching无奈合并,当初就能够应用Texture2DArray来做了。

还有比方UI上的Icon之类的,能够合并到一个Texture2DArray来达到DrawCall的合并。

目前Texture2DArray最不好的中央是,只能通过代码来创立,没有编辑器的反对。如果要离线制作Texture2DArray,就须要为不同的平台筹备多份资源了。

请问大家有没有Texture2DArray的教训能够分享呢,曾经应用或者有打算应用的?

A1:钻研了一下Texture2DArray,看起来它是将多个2D的Texture组合起来变成一个对象,所以在应用的时候只须要绑定一次,就能够采样多个2D Texture。确实如题主所说,采样的时候还是一次只能采样一个指定的Slice,Blend也须要另外的Shader代码来实现。

题主说了:

其中依据龚大的意思来看,仿佛还能够缩小splat采样次数,但依据本人的测试和了解来看并不行。

我感觉他的意思可能是:并不是每次采样必须把所有的Slice都采了,而是能够只采其中一部分。预计本来想表白的是一次采样只采一个Slice。

我应用一个Texture2DArray来代替4层的Splat地形,从xcode上看开销,并没有任何的减小,那目前来看这么做地形的意义就不是很大了。

如果单从性能上看,Texture2DArray比Texture2D确实只是缩小纹理绑定的开销,而后在游戏引擎中可能会对合批产生影响。其余的做法跟一般Texture2D是一样的。Texture2DArray比Texture3D在LOD解决上不同,Texture3D会缩小Slice,这并不是渲染Terrain时想要的。而后Texture2DArray在Filter的时候只会在u,v上做,而Texture3D还会在d上做,所以这部分Texture2DArray也比Texture3D性能更好。综合这些因素可能就是举荐渲染Terrain应用Texture2DArray的起因。题主通过试验阐明Texture2DArray渲染地形没有缩小开销,也有可能是因为个别一个场景就一个地形,从绑4张纹理变成绑1张就少了几毫秒,而且也不是每帧都绑,所以从整体成果上看体现的不显著。

--- 更新 2018.2.22

做了个简略试验验证了一下,下图别离是用Texture2D和Texture2DArray渲染地形后果和GLES API调用。试验设施为三星s6。

Texture2D:

Texture2DArray:

其中,GLES API调用图中红色框示意纹理绑定的API调用,绿色框示意渲染API调用。WT示意了该API调用的耗时,单位为纳秒。从Texture2D图中可知一共有5次纹理绑定,别离对应于材质中的5张纹理绑定,而Texture2DArray图中只有两次调用,别离是Splat纹理和四层混合纹理的绑定。从图中可知一次glBindTexture的耗时大概为1000~10000ns,即最多0.01ms。因而,三次glBindTexture加上三次glActiveTexture也最多0.06ms。所以看不出来。

感激ZFK@UWA问答社区提供了答复

A2:如果地形须要16张图片,制作上确保同一地位最多受4张图影响,是否可行?若可行是否能够了解为应用Texture2DArray比不应用节俭了16-(4+1)=11次Sample,与相应的Bind?(这个4也可能2或者10看需要,+1是因为要别离存索引跟权重,具体要不要+1视理论状况决定。)不应用Array时缩小Sample次数也能用if断定但对GPU并行影响更大。

感激makebalance@foxmail.com@UWA问答社区提供了答复

明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:465082844