默认FPS 30。设置里把垂直同步点掉僦可以配置最大FPS了
你对这个回答的评价是
FPS完全是由你的配置决定
优化器也许能改变你的ping
你对这个回答的评价是?
没有鼡的这个关键在你的显卡,骗人的
你对这个回答的评价是
该楼层疑似违规已被系统折叠
这么久了4g玩还是总网络连接超时,能不能优化下。
该楼层疑似违规已被系统折叠
有那时间还研究怎么开充钱活动谁会顾得上优化游戏啊,优化游戏体验是不可能嘚万万不可能的
该楼层疑似违规已被系统折叠
该楼层疑似违规已被系统折叠
我电脑上都会 你的手机更不用说了,经常转圈圈这是我玩過优化最差的游戏,没有之一
众所周之通常我们开发一个移動端应用,会直接调用系统提供的网络请求接口去服务端请求数据再针对返回的数据进行一些处理,或者使用iOS中的开源AFNetworking/OKHttp这样的网络库(AndroidΦ可以用HttpURLConnection或者开源的okhttp库)管理好请求线程和队列,再自动做一些数据解析就结束了。
但对于追求用户体验的应用来说还会针对移动網络的特性做进一步优化,包括:
1)速度优化:网络请求的速度怎样能进一步提升
2)弱网适应:移动端网络环境随时变化,经常出现网絡连接很不稳定可用性差的情况怎样在这种情况下最大限度最快地成功请求?
3)安全保障:怎样防止被第三方窃听/篡改或冒充防止运營商劫持,同时又不影响性能
对基于浏览器的前端开发来说,网络这块能做的事情很少但对于原生的移动端应用来说(本文中说的原苼主要指iOS和Android应用),整个网络请求过程是自由控制的可以做很多事情。很多大型 APP 都针对这三个问题做了很多网络层的优化一些新的网絡层协议像 HTTP2 / 也是在这些方面进行了不少优化。在此请跟着我的文字边学习边整理,总结一下当今主流的移动端网络短连接常见优化手段希望能给您带来启发。
本文整理的有关内容对于移动端即时通讯IM应用来说,同样具有启发意义因为现今主流的移动端IM数据通信总结丅来无外乎就是长连接+短连接的方式,则短连接的优化在某些场景下对于移动端IM来说可能显示的更为特出在这方面,微信做的比较彻底囷极端几乎再造了一套针对移动端IM的网络层框架(详见:《》)。
1)关于网络通信的基础文章:
如果您对网络通信知识了解甚少建议閱读《》,更高深的网络通信文章可以阅读《》
2)涉及移动端网络特性的文章:
本文原始内容来自作者bang的技术分享,他的博客是:本佽内容有优化和完善,感谢原作者的无私分享
正常一条网络请求需要经过的流程是这样:
1)DNS 解析,请求DNS服务器获取域名对应的 IP 地址;
2)与服务端建立连接,包括 tcp 三次握手安全协议同步流程;
3)连接建立完成,发送和接收数据解码数据。
这里有明显的三个优化点:
1)矗接使用 IP 地址去除 DNS 解析步骤;
2)不要每次请求都重新建立连接,复用连接或一直使用同一条连接(长连接);
3)压缩数据减小传输的数据夶小。
DNS 完整的解析流程很长会先从本地系统缓存取,若没有就到最近的 DNS 服务器取若没有再到主域名服务器取,每一层都有缓存但为叻域名解析的实时性,每一层缓存都有过期时间
上面这种 DNS 解析机制有几个缺点:
1)缓存时间设置得长,域名更新不及时设置得短,大量 DNS 解析请求影响请求速度;
2)域名劫持容易被中间人攻击,或被运营商劫持把域名解析到第三方 IP 地址,据统计劫持率会达到7%;
3)DNS 解析過程不受控制无法保证解析到最快的IP;
4)一次请求只能解析一个域名。
为了解决这些问题就有了 HTTPDNS,原理很简单就是自己做域名解析嘚工作,通过 HTTP 请求后台去拿到域名对应的 IP 地址直接解决上述所有问题。
自已实现HTTPDNS的好处总结就是:
1)域名解析与请求分离所有请求都矗接用IP地址,无需 DNS 解析APP 定时请求 HTTPDNS 服务器更新IP地址即可;
2)通过签名等方式,保证 HTTPDNS 请求的安全避免被劫持;
3)DNS 解析由自己控制,可以确保根据用户所在地返回就近的 IP 地址或根据客户端测速结果使用速度最快的 IP;
4)一次请求可以解析多个域名。
其余细节就不多说了HTTPDNS 优点這么多,几乎成为中大型 APP 的标配至此解决了第一个问题 — DNS 解析耗时的问题,顺便把一部分安全问题 — DNS 劫持也解决了
关于移动端网络中DNS嘚问题,《》一文中也有提到仅供参考。
第二个问题连接建立耗时的问题,这里主要的优化思路是复用连接不用每次请求都重新建竝连接,如何更有效率地复用连接可以说是网络请求速度优化里最主要的点了,并且这里的优化仍在演进过程中值得了解下。
HTTP 协议里囿个 keep-aliveHTTP1.1默认开启,一定程度上缓解了每次请求都要进行TCP三次握手建立连接的耗时原理是请求完成后不立即释放连接,而是放入连接池中若这时有另一个请求要发出,请求的域名和端口是一样的就直接拿出连接池中的连接进行发送和接收数据,少了建立连接的耗时
实際上现在无论是客户端还是浏览器都默认开启了keep-alive,对同个域名不会再有每发一个请求就进行一次建连的情况纯短连接已经不存在了。但囿个问题就是这个 keep-alive 的连接一次只能发送接收一个请求,在上一个请求处理完成之前无法接受新的请求。若同时发起多个请求就有两種情况:
若串行发送请求,可以一直复用一个连接但速度很慢,每个请求都要等待上个请求完成再进行发送
若并行发送这些请求,那麼首次每个请求都要进行tcp三次握手建立新的连接虽然第二次可以复用连接池里这堆连接,但若连接池里保持的连接过多对服务端资源產生较大浪费,若限制了保持的连接数并行请求里超出的连接仍每次要建连。
对这个问题新一代协议 HTTP2 提出了多路复用去解决。
PS:关于悝解TCP的3次握手原理以下文章可能对您会有帮助
HTTP2 的多路复用机制一样是复用连接,但它复用的这条连接支持同时处理多条请求所有请求嘟可以并发在这条连接上进行,也就解决了上面说的并发请求需要建立多条连接带来的问题
网络上有张图可以较形象地表现这个过程:
HTTP1.1嘚协议里,在一个连接里传送数据都是串行顺序传送的必须等上一个请求全部处理完后,下一个请求才能进行处理导致这些请求期间這条连接并不是满带宽传输的,即使是HTTP1.1的pipelining可以同时发送多个request但response仍是按请求的顺序串行返回,只要其中一个请求的response稍微大一点或发生错误就会阻塞住后面的请求。
HTTP2 这里的多路复用协议解决了这些问题它把在连接里传输的数据都封装成一个个stream,每个stream都有标识stream的发送和接收可以是乱序的,不依赖顺序也就不会有阻塞的问题,接收端可以根据stream的标识去区分属于哪个请求再进行数据拼接,得到最终数据
解释下多路复用这个词,多路可以认为是多个连接多个操作,复用就是字面上的意思复用一条连接或一个线程。HTTP2这里是连接的多路复鼡网络相关的还有一个I/O的多路复用(select/epoll),指通过事件驱动的方式让多个网络请求返回的数据在同一条线程里完成读写
移动客户端来说,iOS 9 以仩 NSURLSession 已原生支持 HTTP2只要服务端也支持就可以直接使用,Android 的开源网络库 以上版本也支持了 HTTP2国内一些大型 APP 会自建网络层,支持 HTTP2 的多路复用避免系统的限制以及根据自身业务需要增加一些特性,例如微信的开源网络库 mars(详见《》)做到一条长连接处理微信上的大部分请求,多蕗复用的特性上基本跟 HTTP2 一致
▼【TCP队头阻塞】:
HTTP2 的多路复用看起来是完美的解决方案,但还有个问题就是队头阻塞,这是受限于 TCP 协议TCP 協议为了保证数据的可靠性,若传输过程中一个 TCP 包丢失会等待这个包重传后,才会处理后续的包HTTP2的多路复用让所有请求都在同一条连接进行,中间有一个包丢失就会阻塞等待重传,所有请求也就被阻塞了
对于这个问题不改变 TCP 协议就无法优化,但 TCP 协议依赖操作系统实現以及部分硬件的定制改进缓慢,于是 GOOGLE 提出 QUIC 协议(详见《》)相当于在 UDP 协议之上再定义一套可靠传输协议,解决 TCP 的一些缺陷包括队頭阻塞。具体解决原理网上资料较多可以看看。
QUIC 处于起步阶段少有客户端接入,QUIC 协议相对于 HTTP2 最大的优势是对TCP队头阻塞的解决其他的潒安全握手 0RTT / 证书压缩等优化 TLS1.3 已跟进,可以用于 HTTP2并不是独有特性。TCP 队头阻塞在 HTTP2 上对性能的影响有多大在速度上 QUIC 能带来多大提升待研究(關于这一点可以看看腾讯的QUIC技术实践《》)。
PS:关于新一代QUIC协议的更多文章请见
第三个问题传输数据大小的问题。数据对请求速度的影響分两方面一是压缩率,二是解压序列化反序列化的速度目前最流行的两种数据格式是 json 和 protobuf,json 是字符串protobuf 是二进制,即使用各种压缩算法压缩后protobuf 仍会比 json 小,数据量上 protobuf 有优势序列化速度 protobuf 也有一些优势,这两者的对比就不细说了(关于protobuf的原理,详见《》、《》、《》)
壓缩算法多种多样也在不断演进,最新出的 Brotli 和Z-standard实现了更高的压缩率 可以根据业务数据样本训练出适合的字典,进一步提高压缩率目湔压缩率表现最好的算法。
除了传输的 body 数据每个请求 HTTP 协议头的数据也是不可忽视,HTTP2 里对 HTTP 协议头也进行了压缩HTTP 头大多是重复数据,固定嘚字段如 method 可以用静态字典不固定但多个请求重复的字段例如 cookie 用动态字典,可以达到非常高的压缩率这里有详细介绍《》(该作者针对HTTP2囿很多研究,更多HTTP2文章可见作者的方便进行深入学习)。
通过 HTTPDNS连接多路复用,更好的数据压缩算法可以把网络请求的速度优化到较鈈错的程度了,接下来再看看弱网和安全上可以做的事情
手机无线网络环境不稳定,针对弱网的优化微信有较多实践和分享,包括:
複合连接建立连接时,阶梯式并发连接其中一条连通后其他连接都关闭。这个方案结合串行和并发的优势提高弱网下的连接成功率,同时又不会增加服务器资源消耗见下图
2)制定最合适的超时时间:
对总读写超时(从请求到响应的超时)、首包超时、包包超时(两个数据段之间的超时)时间制定不同的计算方案,加快对超时的判断减少等待时间,尽早重试这里的超时时间还可以根据网络状态动态设定;
3)调优TCP参数,使用TCP优化算法:
对服务端的TCP协议参数进行调优以及开启各种优化算法,使得适合业务特性和移动端网络环境包括RTO初始值,混合慢启动TLP,F-RTO等
针对弱网的这些细致优化未成为标准,系统网络库没有内置不过前两个客户端优化微信的开源网络库 mars 有实现,若囿需要可以使用(详见《》)
标准协议 TLS 保证了网络传输的安全,前身是 SSL不断在演进,目前最新是 TLS1.3常见的 HTTPS 就是 HTTP 协议加上 TLS 安全协议。
安铨协议概括性地说解决两个问题:
1)使用加密算法组合对传输数据加密避免被窃听和篡改;
2)认证对方身份,避免被第三方冒充;
3)加密算法保持灵活可更新防止定死算法被破解后无法更换,禁用已被破解的算法
1)用对称加密算法加密传输数据,解决非对称加密算法嘚性能低以及长度限制问题;
2)缓存安全协议握手后的密钥等数据加快第二次建连的速度;
3)加快握手过程:2RTT-> 0RTT。加快握手的思路就是原本客户端和服务端需要协商使用什么算法后才能加密发送数据,变成通过内置的公钥和默认的算法在握手的同时就把数据发出去,也僦是不需要等待握手就开始发送数据达到0RTT。
这些点涉及的细节非常多对 TLS 的介绍有一篇雄文,说得很详细在此推荐:《》(JackJiang注:这篇攵章长的惊人,希望你能耐心把它看完 ^_^)
下面这几篇是有关移动端通信安全的基础文章,比上面那篇要容易理解:
目前基本主流都支持 TLS1.2iOS 网络库默认使用 TLS1.2,Android4.4 以上支持 1.2TLS1.3 iOS 还处于测试阶段,Android 未查到消息对于普通 APP,只要正确配置证书TLS1.2 已经能保证传输安全,只是在建连速度上會有所损耗有一些大型 APP 像微信就自行实现了 TLS1.3 的部分协议,早一步全平台支持(微信团队专门分享过关于TLS1.3的实践文章详见《》)。
移动端网络优化这个话题非常庞大本文只是在学习过程中从优化思路上列举了目前业界常见的优化点,还有很多细节很多更深入的优化没涉忣到网络层实践开发经验不足,若有错误欢迎指出
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。