手游推送方案

手游推送方案

1)手游推送方案
2)Unity UI特效和前端的沟通问题
3)低端机上是否要开启多线程渲染
4)RenderTexture在手机端内存变大
5)自己实现Text描边引起DrawCall增加问题


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

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


Android

Q:例如《率土之滨》和《部落冲突》这种游戏,如果你的主城被别人打了,手机上会收到推送通知说有人在打你。有个问题就是游戏已经杀死掉了,为什么还能收到这个通知?这种是实时的通知,不是定时那种,请问下这种要怎么做?

A1:这种准确推送时间客户端是计算不出来的,所以还是得依靠服务器。Android这块以前用过极光推送,还行。iOS有提供服务器推送方案。大概原理就是,我们的服务器通知(苹果的服务器或者极光的服务器)再转向玩家进行推送。
感谢雨松MOMO@UWA问答社区提供了回答

A2:腾讯的信鸽也可以,推送分服务器推送和本地推送。一般这种需求我们需要本地推送,iOS系统本身支持这种推送。安卓并没有对应的API,需要自己启动Server,并与某系统进程绑定,才能保证进程不被杀掉,但是现在各大厂商都自己制定系统,很难做到这一步,也有部分厂商的App在系统白名单里,后台进程不会被杀掉。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cac455026ca1f200dab8f16


资源管理

Q:我们的游戏现在有很多UI特效给特效去用Animation和粒子做,但是有个问题是,他们做很难注意性能问题,而且我一旦改变一些属性,又得重新让它K帧,这样做下来交流成本很高,不知道有没有什么好的解决方案?

A1:我是这样做的,就是美术做的特效Prefab程序不直接用,而是提供一个工具供他们导出生成一个新的Prefab。

这样的好处就是导出的时候可以进行检查,比如检查贴图数量、粒子数量、动画等等,我们可以提前定好UI粒子特效的标准,导出的时候发现资源不符合规范或者有问题,就给他们提示错误,Prefab不予以导出。这样美术就无法上传SVN程序,就不会更新到有问题或者有效率问题的特效。

其实这个思路不仅特效可以用,UI界面、角色、场景等等,我都是这么做的,Prefab自动生成的同时还可以做一些额外的逻辑。
感谢雨松MOMO@UWA问答社区提供了回答

A2:我和楼上的做法类似,不能用导入器强制规范的资源,每天凌晨打包机启动一个资源扫描动作。把不符合规范的扫出来生成报告。
感谢王亮@UWA问答社区提供了回答

A3:我的思路:
自己编写Timeline编辑器(Unity,Unreal官方也可),在编辑器中将美术相关的操作范围规范好,例如播放单粒子特效时的个数及模型、动画、材质等资源使用范围,最终在生成特效数据时,再进行资源和数据检查以及资源整理,避免资源冗余及不规范。

优势:
1、资源和数据剥离,各资源间没有耦合,可快速修改和调整;
2、数据在编辑模式下可共用、也方便联合制作,可快速处理冲突;
3、模板化特效,大大提高开发效率。

两点需要注意:
1、FBX资源冗余,Unity默认关联模型、动画资源为FBX路径。我采取的策略是,将使用到的资源,从FBX中提取,制作成Asset文件(Unity本身也是这么做的,只不过帮他提前做了而已,也会提高打包速度),将Timeline上的资源依赖换成新生成的资源。
2、编辑器本身尽量做好回放功能(尤其是粒子)。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cb46c723ded097520c24ced


渲染

Q:多线程渲染到底是开还是不开呢?在低端机,比如红米Note2开多线程渲染有帮助吗?还是说直接关闭比较好?

A1:题主不妨在红米Note2上具体测试下,看下开关的之后的性能差异。了解到现在挺多大型的ARPG都开启了多线程渲染。
感谢张锐@UWA问答社区提供了回答

A2:对于目前中国市场的手游,都建议开启多线程渲染功能,不仅可以大幅降低主线程上渲染模块的压力,同时还可以极大降低纹理、Mesh和Shader等资源加载的耗时。

当然,没有一种方法是一本万利的,也有它一定的限制和问题,具体我们之前碰到过的问题,可以直接在UWA问答里搜索多线程渲染进行查看。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cac6d1326ca1f200dab8f19


RenderTexture

Q:RenderTexture AA设为1 depth是0,在PC端内存大小是对的,到手机端内存增长了三倍左右,为什么呢?

A1:三倍不太应该,建议通过UWA GOT Online服务或者UWA线上深度测评来查看每个RenderTexture的具体参数,分辨率、格式等参数是否正常。
该回答由UWA提供

A2:内存有变化可能是因为分辨率,RenderTexture的大小是跟着分辨率走的,你比较下你在PC上看的RenderTexture分辨率和手机上RenderTexture分辨率分别是多大。

感谢deviljz@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cb58854d3016c751b5a4430


UI


Q:如图,我们项目自己实现的文字描边,按照我对Unity的合批理解,应该是2个DrawCall,但是实际却是4个,猜测应该是TextShaderOutline的ModifyMesh函数中SetUIVertex方法导致合批失败。如果是,不知道原理是什么?有没有更好的解决方案呢?

功能地址TextureShaderOutline.rar

A:你这个方案和这个有点类似,且做过改进吧。我看了你们只使用了一个材质球。不过我这边Unity版本低一些,你的方案打开有点乱,感觉显示有问题,我把红色字左右拖动,颜色会变,很奇怪。

用博客上原方案,我试了这种叠加的情况能合批(前提是材质球用同一份,颜色不一样,就会是2份材质球了)。

我再针对Unity 2018,调整了一下方案,看看是不是满足你们的需求:

Unity 2018能传递UV2、UV3,然后tangent.zw normal.z 也勉强可以用一下,所以用UV1、UV2存放最原始的UV区域(裁剪用),UV3、tangent.zw传递outlinecolor,normal.z传递outlineborder,这样颜色和宽度变化就不需要改材质球,就能合批了。(注意z轴方向不能缩放,且UI和所在canvas要平,否则tangent.z和normal.z传递会不准确)

参考项目test2018_1_outline.rar
感谢真木@UWA问答社区提供了回答

题主补充:我们这边将ModifyMesh方法中去掉position的上传,就可以合批了。

感谢Rhett@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c98a8bc419e740b2b8afb08


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)

封面图来源于网络