如何减缓边玩边下导致的发热问题

如何减缓边玩边下导致的发热问题

1)如何减缓边玩边下导致的发热问题
​2)如何选择网络框架
3)关于函数参数使用Lambda表达式的疑问
4)Unity 5.6升级2018.4,播放特效闪退


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

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

Network

Q:我们项目是实现边玩边下的功能,怎么去降低它的IO?

现在的情况是进入游戏前加载一部分,在进入游戏后会边玩边下2~3GB的资源,发热比较严重,不知道大家怎么处理的,有没有限帧这类的操作优化带宽的压力。

A1:这个需要自己做个策略动态调整,比如当游戏处于战斗等本身消耗比较大的场景时可以停止下载工作,等退出这种特定场景,游戏比较闲置(如只在进行一些简单的UI操作)时再重新开始下载。同时可以随时调整下载开启的线程数,控制下载的负载,从而维护游戏中整体的性能平衡。

感谢刘明@UWA问答社区提供了回答

A2:可以参考UWA学堂上的文章,可以控制下载速度以及下载时CPU和内存占用:《手游HTTP多线程下载原理与优化》

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


Network

Q:最近要立新项目,在网络框架上有选择困难症,项目需求:联机多人割草游戏,需要支持多人游戏,10人以内,400左右的怪物同步,上Steam。

状态同步方案:
1. Mirror免费,可以利用Steam的P2P网络,不支持主机迁移,主机掉了就没了;
2. Photon与Mirror类似,收费,不能用Steam网络;
3. Netcode for GameObjects,Unity官方,预览版,可以用Steam网络,不知道支不支持主机迁移。

状态同步方案开发比较简单,但是比较担心能不能同步这么多的怪物。

帧同步方案:
1. Photon Quantum,提供了确定性方案,无需开发;收费贵,不提供源码;
2. LockstepEngine,看介绍比较完善,但是看评论说有bug。

上面这些方案都是我看文档和介绍总结的,没有实际使用过,麻烦有经验的大佬介绍下哪个最适合,或者有什么其他更好的方案吗?

A:对于Steam的商业游戏:

  1. Mirror太吃Master的机器了,对Master不友好,其他玩家也比较看Master的网络也不友好。
  2. 同上。
  3. Netcode目前处于1.0.0-preview7的版本,大约一个月左右更新一个小版本,个人感觉不是特别稳定,不建议直接用。
  4. Photon Quantum好像是每人每月0.5美元,巨贵,直接不考虑。
  5. LockstepEngine相对上面4个来说应该稍微可以接受一点,大师渔夫哥好久没有维护了。
  6. 推荐一手ET框架。
  7. 对于10个人+400怪物来说,常规的方案可能都不太行,需要自己实现一套类似状态帧的东西。

感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6278e79bb87a45735152e71a


Scripting

Q:关于函数参数使用Lambda表达式的疑问:

写法一:_socket.BeginSend(data, offset, len, SocketFlags.None, out _socketError, new AsyncCallback(OnSendData), _socket);

写法二:_socket.BeginSend(data, offset, len, SocketFlags.None, out _socketError, OnSendData, _socket);

请问写法二本质同第一种是一样的?编译器会帮忙new一个AsyncCallback?或者OnSendData指向的是函数的地址,没有new的开销?

A:我构筑了两个类似的方法(省略了前后实现)以验证两种写法是否有差别。

编译后,使用dnSpy工具查看dll文件,发现IL代码中都会有new的开销,即两种写法本质上是完全一致的。

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


ParticleSystem

Q:Unity 5.6升级2018.4,播放特效闪退。

特效重新激活LimitVelocityoverLifetime播放正常。发现Prefab的差异仅在ClampVelocityModule的模块。其中y和z的minMaxState好的是1,播放闪退的是0。将0改成1特效播放正常。

AssetDatabase.ForceReserializeAssets默认的minMaxState是0,所以我想这是该方法无效的原因之一。后面发现如果x是1,则y、z必须是1。如果x是0,则y、z随便。因为闪退特效现在不多,现在项目的处理方式是对资源进行自检,再确定解决方案。

经过各种测试,也确定了是因为这个原因导致。检测出来的其他特效也会闪退,但不知道为何ClampVelocityModule的minMaxState的x为何会影响,需要借助源码查看原因了。请问大家有源码可以提供么?

A:从源码上看,minMaxState的x、y、z需要做到State同步。

可以根据自己的Unity版本,到官方的Git下载:https://github.com/Unity-Technologies/UnityCsReference

感谢廖武兴@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6279cb10b87a457351539421

封面图来源于网络


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

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