怎么减少静态图片在游戏加载速度中加载的速度 unity

Unity技术分享(88)|耗时分析|修改材质球|加载资源..
原文链接:https://blog.uwa4d.com/archives/2152.html
我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:UWA 问答社区:answer.uwa4d.com
Q1:在UI中,有两个字体控件每帧都要显示不同的数字,第一个有8个字,第二个有6~7个字,需要开outline增加辨识度,从而引起了较高的性能开销。 把这两个控件单独放到另外独立的Canvas,该问题依然存在。现已确定该开销是由这两个字体控件每帧的文本更改引起的。 下图是UI布局:
下面是引起的开销截图:
评论提到一个是8个字,一个是6到7个字,都开启了outline。 首先建议再做一次确认,看是不是禁用这两个之后,SendWill就确实没开销了。因为这个字数看上去并不应该造成很明显的开销;
其次,如果确实是这两个造成的,那么就需要先考虑下能不能转成带outline效果的静态字体,不行的话再考虑下能不能降低更新的频率了,是不是确实要每帧都变;
如果要再降低,就只能考虑静态字体了,如果文本是一些比较固定的内容就很好处理,但如果是像聊天一样,内容无法预知的话似乎就没什么办法了。或者就是低端机用shadow来做。
该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
Q2:我的游戏场景中有一个boxcollider2D,位置在(0.0f,0.0f) 到 (1.0f,1.0f);调用Physics2D.BoxCast(new Vector2(1.0f,1.702), Vector2(1.0f, 1.4f), 0, Vector2(0.0f,1.0f), 2.0f); 会产生碰撞,理论上碰撞的边界在1.700 ,我已经将位置放到1.702,应该是规避了浮点数误差的问题的,如果我将该值放大了1.706就不会产生碰撞了,请问哪里可以调整这个误差值的范围呢?
Unity 2017.1版本的Physics2DSettings里面有一个Default Contact Offset,表示当两个collider之间的距离小于它们的ContactOffset之和就会产生碰撞。把这个值设置小一点应该能解决题主的问题,如下图所示:
Unity 5.x中Contact Offset,默认是0.01,这也是为何1.702不行,而1.706可以的原因。
该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
Q3:UWA有篇文章推荐了使用MaterialPropertyBlock的方式来操作Material属性,能够提升效率。原文如下:使用MaterialPropertyBlock来替换Material属性操作,在查阅 ShaderLab: Properties文档(https://docs.unity3d.com/Manual/SL-Properties.html)的时候,提到:
[PerRendererData] - indicates that a texture property will be coming from per-renderer data in the form of a MaterialPropertyBlock. Material inspector changes the texture slot UI for these properties.
那么问题来了,Shader参数用不用[PerRendererData] 来描述,对MaterialPropertyBlock操作到底有没有什么影响?我测试了用和不用2种情况,显示效果上都是正常的。
理论上[PerRendererData]只是修改Editor的显示行为的。当题主通过MaterialPropertyBlock改变了某个Material的Texture之后,只有加上了这个,才能在预览对应的Material面板上看到这个新Texture。
下图1表示在没有PerRendererData时,Editor下和Runtime时的显示内容;而图2和图3分别是加了PerRendererData后,Editor下和Runtime时的显示。
该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
Q4:现在用Resources.Load()加载资源时,UI动画会出现卡顿的现象,如果想消除卡顿,是不是只能通过异步加载,分拆Prefab和优化材质网格动画之类的操作来实现?还是说UI动画可以在另外的线程播放之类呢?另外我想问下,异步速度是不是一定比同步慢呢?
异步加载可以缓解同步加载的卡顿,但是还是一样会卡,可以查看这个问题帖子中的说明。建议题主尝试进行资源分拆,不要同一时刻进行加载,如果不是及时显示的UI或其他GameObject,可以尝试将部分耗时资源(Atlas、Shadder等)进行预加载,如果是及时显示的UI的,那么异步加载并不能满足这个需求,也就无需考虑了;
异步速度也不一定百分百比同步慢,只能说一般情况下是如此;但具体慢多少,需要看加载的资源类型、资源量。
该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
Q5:游戏对战时因为会频繁更换武器或释放技能(主要是网络玩家),会替换不同的动作,但是发现每次设置animatorOverride[name]=clip(每次设置3-6个),CPU占用50-180ms,请问这是什么原因?我按照官方的指导存了一个list(https://docs.unity3d.com/Reference/AnimatorOverrideController.ApplyOverrides.html),然后每次LateUpdate的时候调用ApplyOverrides,发现占用更高了,每次400ms,请问这个要怎么解决?目前每个网络玩家玩家OverRidesCount是73,会不会是Clip过多的原因?
我们在真机运行时发现animatorOverride[name]=clip的耗时会受到animatorcotrollor中的clip数目的影响,随数目的增多耗时会明显增加,70个以上的clip耗时确实能达到50ms(红米note2)以上。但换为applyOverrides方法时耗时仍然很高,而且出现了堆内存分配,但并没有达到400ms那么高。 另外,这边尝试了整体替换AnimatorOverrideController,即不在现用的AnimatorOverrideController中替换clip,而是在另一OverrideController中换好clip后,再整体替换到runtimeAnimatorController,这样耗时就会降到很低了。
该问题来自UWA问答社区,感谢Saber提供了回答,如您对该问题仍有疑问,可以转至社区进行进一步交流。
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站(answer.uwa4d.com)上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com官方技术博客:blog.uwa4d.com官方问答社区:answer.uwa4d.com官方技术QQ群:(仅限技术交流)
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!这个页面不在了没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之mac上从.ipa中提取unity3D游戏资源(六十六)
Unity3D研究院之mac上从.ipa中提取unity3D游戏资源(六十六)
围观160059次
编辑日期: 字体:
感谢今天某大神(既然是大神名子我当然要保密喽)告诉我Disunity更新了,不然我还不知道。以前很多人都说用Disunity提取出了Unity3D资源,但是我在Mac上从来没有成功过,一直在报错。https://github.com/ata4/disunity/releases 在这里可以看到Disunity3.0是19天以前更新的,新版本真的是太好用了,我不得不赞一下 嘿嘿。 不过记得要在MAC上装好jdk7
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 在这里可以下载mac os 的。
接着找一个Unity3d做的游戏,这里我在补充一下如何辨认某个游戏是用u3d做的。
1.在网上随便下载一个游戏.ipa,并且解压到本地。
2.找到xxx/xxx.app,右键显示包内容,打开Data文件夹。
3.如果发现文件夹中包含 unity default resources 文件,那么恭喜你这个游戏就是用unity3d做的。
再看看这里几个比较重要的文件。
level0 / leve1 ….
图中0-5一共有6个文件,这表示这个游戏用了6个游戏场景。
sharedassets0/sharedassets1 …. 图中0-6一共有7个文件,它的数量永远比场景的数量多一个,可见它和场景有关联性,可以用工具把它解开看看。
Managed:这个文件夹下放的都是dll ,unity自己写的脚本编译成dll后就放在这里,还有其他第三方的dll也放在这里。
resources.assets:这个东西就比较重要了,他游戏里面所有放在resources文件夹下的东西都会放在这里,我们提取也主要在这里提取。
Raw:如果游戏在StreamingAssets文件夹下放东西,那么就会出现一个Raw文件夹。
PS:我个人觉得最好不要在StreamingAssets文件夹下放东西,因为ipa一解开就能看到里面放的啥东西了。如果真的要放,我觉得最好不要放.assetbundle 文件。 因为你需要用www.LoadFromCacheOrDown 这样第一次它会把StreamingAssets下的assetbundle 解压到本地的cache文件夹中,那么StreamingAssets文件夹又是一个只读的文件夹,也就是说你只能读取不能删除,结果就会造成容量过大
因为 解压后的文件 和没有解压的文件都保存在本地。。 所以assetbundle最好直接从服务器上下载,那么这样本地就不会多出来一个assetbundle。
回到正题,说说怎么提取资源。
https://github.com/ata4/disunity/releases
先把DisUnity3.0版本下载到本地然后解压。 确保本地装了jdk7以后打开终端运行。
java -jar /Users/MOMO/Desktop/disunity_v0.3.0/disunity.jar
extract /Users/MOMO/Desktop/Data/resources.assets
一个是disunity.jar的路径,另外一个是resources.assets的路径,根据你电脑的路径来配置就可以了。 嘿嘿嘿各种资源就呼呼呼的解开啦。。如下图所示,它会在resources.assets的同级目录自动创建一个resources的文件夹。
AudioClip:这里是解开的游戏全部声音文件,可以直接播放。
Mesh:这里解开的游戏全部模型文件,他的格式是.obj 你需要在3dmax或者maya中打开,然后转成FBX就可以在u3d里面看到了,嘿嘿。
Shader:这里解开游戏 全部用的shader文件,可以直接使用。
TextAsset:这里解开的是游戏中全部用的text文本文件,如果文本不加密,这里就全都会看到的 嘿嘿呵。
Texture2D:这里放的就是游戏中用到的所有图片,一般是由tga或者 ktx组成,tga可以直接在电脑上查看,但是.ktx需要借助工具来看。
嘿嘿,这里我把Hello Hero这个游戏的图集解开了。如下图所示,这是它用的一个UI图集。
但是模型的贴图怎么解开呢?HelloHero的所有模型贴图都是.ktx格式的。
我们首先要下载一个神一样的工具,嘿嘿。
http://community.imgtec.com/developers/powervr/installers/
下载 PowerVR Tools & SDK v3.3 – MacOS X Installer
下载以后需要安装,安装的时候有一个打开文件的类型,你可以勾选一下.ktx
安装完以后,运行文件的路径很深
/Applications/Imagination/PowerVR/GraphicsSDK/PVRTexTool/GUI/OSX_x86
双击打开就可以。如下图所示,把ktx的图片拖进来就可以看到它的原图了。。
打开.ktx的图以后,可以在把它导出成可以直接在电脑上预览的图片了。。嘿嘿嘿嘿,是不是很简单哈?
另外这篇文章可以推荐大家看看
我在补充一下, 这两个工具都是跨平台的, windows linux mac都可以使用的。
我在补充一下,如果你解开的哪个游戏里面没有resources.assets 那么有可能它游戏里面 没有Resources这个文件夹。有可能它是通过assetbundle下载的。。
java -jar /Users/MOMO/Desktop/disunity_v0.3.0/disunity.jar
extract /Users/MOMO/Desktop/Data/*.assets
你可以执行,把所有的.assets都解开。因为有些东西他可以预制在场景里面,不需要通过Resources.Load。
你最好在反编译一下它的代码, 看看它的assetbundle的下载地址是多少。。
感谢小伙伴的留言。。 大家试试下面的方法,把KTX批量转成PNG。。。
终于实现了批量转换,要先把ktx转换成pvr,然后在转换成png
path %path%;”D:\Program Files (x86)\TexturePacker\bin”
path %path%;”D:\Program Files (x86)\PVRTexTool\CLI\”
for /f “usebackq tokens=*” %%d in (dir /s /b *.ktx) do (
PVRTexToolCLI.exe -f PVRTC1_4_RGB -i “%%d” -o “%%~dpnd.pvr”
TexturePacker.exe –opt RGBA8888 –sheet “%%~dpnd.png” “%%~dpnd.pvr”
del %%~dpnd.pvr
6月13日补充。
#你好Unity3D#@露易娘 小伙伴说:游戏中二次下载的Assetbundle,用同步推类似的软件把Caches文件夹下的资源把文件从手机拷贝到电脑上后缀名改成.assets 然后用disUnity也可以解开它的资源? 我试了锁链战记没能成功,我现在网络不太行,还有谁这样解包成功的吗?或者帮我试试别的游戏?感谢!!
手动玩加载到游戏目录Library/UnityCache/Shared的文件是这样的,一个CAB-e9d01bf34cfbce93af95fb7,一个__info文件,__info文件内容-1
1 CAB-e9d01bf34cfbce93af95fb7,那么CAB那个文件改成assets可以利用jar提取出素材以及文本
上面的内容是一个微博好友给我的留言,因为现在有些游戏是需要下载assetbundle来完成资源的加载。 我试了一下确实把后缀名改成.assets就可以解开资源, 但是不是所有游戏都可以。。
其实我觉得最好的办法,可以用越狱的手机 或者 root的手机 用嗅探器去分析一下它的协议, 因为游戏的assetbundle的下载地址可能就在进入游戏第一个协议里面。 有了下载地址就可以把资源下载下来,这样的方法应该会更好。。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 电脑加载游戏速度很慢 的文章

 

随机推荐