到网速对网游的影响,很多人玩游戏的人都会联想到下面的情景:好容易等到机会来临,举枪射击,以为革命大业就此可定,不料网速不稳,果断卡住,等网速恢复,自己已是万箭穿身。
因网络不通畅带给游戏者的烦恼其实远不止如此,掉线、登录时间过长甚至无法登录等情况也时有发生。是什么原因造成了这样的情况,我们又该如何去寻找补救措施呢?
其实,造成网速过慢的原因很多,其中最主要的是不同运营商之间跨网通讯的兼容性问题。电信、联通、移动三大运营商之间的网络相互访问时,经常会出现延迟过高、丢包之类等情况。目前解决该问题的最有效的办法是利用网游加速器进行加速。以NETPAS标准版为例。
安装后启动程序,在该界面中单击“注册”按钮完成注册并登录,在“服务类型”项中选择“游戏加速”,然后单击“启动加速”按钮。
稍后会出现该界面,显示当前分配的地址及连接时间、接收的数据等信息,说明加速开始。此后程序会在后台全自动处理网络数据,对游戏进行加速,期间根本无需我们手工参与。
那么,NETPAS的加速效果究竟如何呢?为了得到一个比较明确的答案,在某日的11:15~11:45,我们用两台配置相同的笔记本,对其进行了一个简单测试。测试游戏为魔兽世界,测试环境为:联通4MB ADSL、i5-2310 CPU、4GB内存,Windows 7 64位旗舰版操作系统,测试方法为将其中一台直接接入宽带,另一台使用NETPAS加速器,每5分钟记录一次数据,最后得到的结果见图3:
在网络良好的环境中,NETAS加速效果对比
从中我们可以看出,使用加速器的延迟表现明显要好于未使用时,这里尤其要说明的是,由于我们测试所处的网络环境良好,这种差异还不算太大,如果在网络环境不好的使用,效果会更为可观。
小技巧:提高网速的其他方法汇总
别在网络高峰期玩游戏,比如在晚上8~11点之间,或者是节假日等;
内网用户,在玩网游时,应保证网内无人使用迅雷、快车或P2P之类的软件传输文件(包括看视频);
有些软件会在后台偷偷连接网络并进行数据传输,可用360和金山卫士等防护软件将其禁止。以360安全卫士为例:
右击桌面上的“加速球”,选择“看网速”,进入相应界面,右击在后台连网的程序,在出现的右键菜单中选择“禁止访问网络”,即可禁止其访问网络。
收费or免费 网络加速器的抉择
面对网速过慢、延时过高、容易掉线以及登录困难等问题很多人会选择加速器,网游加速器的确可在一定程度上解决问题。不过,面对种类繁多的加速产品,我们到底该怎么选择?
目前所有的网游加速器,都是通过花钱买节点,然后通过中转服务来达到加速目的的。从这一意义上来说,各加速器的基础加速效果并无多大差异。所以无论是免费的还是免费的,基本上都能满足一般玩家的需要。知道了加速器的原理,那面临是该选择免费的还是收费的这个问题时,就不难决定了。
由于各大加速器是通过购买节点的方式进行加速的,这就意味着它们的付出需要得到回报。所以,尽管目前网上有不少打着免费旗号的网游加速器在诱导用户下载,但实际上,它们的免费是有一定限制的,比如,只在某段时期内免费(可免费试用多长时间,通常为七7~10天),只在固定时段内免费(比如晚上11点到次日7时),或者只对指定的游戏免费(通常是一些较老的游戏,新游戏需要付费)。
有些所谓的免费只是针对一部分较老的游戏
目前真正免费的网游加速器只有一款,那就是网游快车。网游快车的营利方式不在于向用户收费,而在于在界面中显示尽可能多的广告,所以比较适合那些对广告不太反感的朋友使用。不过,为了安全起见里面显示的广告最好不要随便去点击,以免出现不必要的麻烦。
虽然完全免费,但网游快车中显示的广告的确让人厌烦
尽管如此,骨灰级玩家因为在游戏中浸淫的时间过长,涉及到的游戏面广,在选择网游加速器方面,与一般玩家还是有区别。他们应该根据自己的实际情况,选择真正适合的产品才行。选择的标准,主要取决于网游加速器提供的特色功能、支持游戏的多寡和具体的收费情况。那么,我们就来看看几大加速器的优劣和功能对比吧。
五大主流加速器整体优势、特色功能及收费情况列表
小知识:国服玩家如何登录外服?
国服玩家要想登录外服,必须借助代理或VPN才行。除了上面介绍的部分加速器可以实现外,目前国内也有不少专门的免费VPN,比如“CoCoVPN”。该VPN目前已经稳定运营一年以上,线路也超过100条以上,延迟稳定低于50ms,有兴趣的玩家不妨试一下。
页游玩得爽 浏览器帮忙
新型的页游以其小巧、精悍的特性受到很多游戏爱好者的喜爱。但是,要想玩的舒畅,似乎除了对网速有要求之外,对于浏览器的选择也有着一门“学问”。
利用小号挖矿采集资源,让大号升级得更快,是很多页游爱好者的生存之道。不过,现在大部分页游会通过Cookie限制用户,只能同时只能登录一个账号。多个账号如何同时登录呢?而且随着HTML5技术的发展,选择适合的页游浏览器也变得至关重要。那么,浏览器对Flash和HTML5的支持程度是否直接影响到网游的实际表现?哪些浏览器对Flash和HTML5的支持更好呢?
如果我们的目的只是要同时登录多个小号,完全可以用“松果游戏浏览器”来解决。在浏览器中选择自己所玩的游戏,并用大号登录,单击页面收藏夹栏右侧的“小号登录”按钮,在浏览器的标签栏中,会出现一个名为“小号”的标签。在该标签中,已经登录的游戏会处于未登录状态,用小号登录即可。用类似的方法,可以同时开最多10个小号。
松果游戏浏览器最多可同时开启10个小号
而对于浏览器对Flash和HTML5的支持性能方面,我们则可以通过Asteroids HTML5和GUIMark2平台提供的两个测试来说明。其中前者可检测浏览器的HTML5游戏性能,后者则可检测浏览器的Flash性能。显然,在玩游戏(特别是大型游戏)的过程中,如果浏览器对这两个方面支持不好,就会出现游戏很卡、运行不流畅、或者画面质量下降等情况。
在这两大测试中,都以得分最高的浏览器为优胜。
目前国内用户是常用的五大浏览器在Asteroids HTML5测试中的得分情况
五大浏览器在GUIMark2测试中的得分情况
通过上两个测试,我们不难看出,在Asteroids HTML5测试中,IE11及IE10的分数、帧数排名最为靠前,而在Flash测试方面,虽然其最终成绩稍逊于Chrome,但仅仅1~4分的差距,在日常使用的过程中,实际上是很难感觉出其中差别的。所有就游戏性能来说,IE10和IE11表现不错,是网页游戏用户的最好的选择。
小知识:页游如何避免恶意网站
对网页游戏玩家来说,常见的恶意网种无非有三种,一是打着销售武器装备的幌子直接骗取买家钱财的,二是假冒游戏官方页面,盗取用户账号密码的,三是直接在游戏官方网站挂马,以达到非法目的的。对于这几种情况,我们都可通过浏览器提供的相应功能来进行识别。目前像360安全浏览器、Chrome、IE和Firefox等浏览器,都提供了网址安全功能,借助它,我们可很容易看出网站的安全性能。此外,像360和金山安全卫士等,也提供了游戏模式,会自动识别玩家进入的网站是否安全。只要善于利用,即可将恶意网站拒之门外。
游戏下载别盲目 设置当中有诀窍
现在的游戏客户端越来越大,下载自然需要很长时间,有没有较好的方法可以提高迅雷的下载速度,减少等待时间?我们是否可以通过一些手动设置,来提高迅雷的下载速度?
还别说,就拿迅雷来说,要想让下载顺利地高效运行,不进行一些设置还真不行。
首先,要保证一次下载的任务不要太多,一般以最多三个为宜。此外,就是限制上传速度。不限制上传速度将在很大程度上降低下载速度,这一现象,在BT下载时最为明显。限制的方法为:在迅雷主界面中,单击主菜单按钮,选择“配置中心”,打开“系统设置”对话框。
在左侧的“基本设置”项下选择“常规设置”子项,在右侧勾选“自定义模式”,然后将“最大上传速度”设置为最小值(默认是10KB/s),单击“确定”按钮。
其次,是让迅雷的下载线程心可能地多些。出于稳定的原因,迅雷默认设置中作了保守的设置,而我们的机器和网络环境都比较好,这时完全可以自行设置,使其全速前进。
在左侧的“我的下载”项中选择“任务默认属性”子项,然后在右侧,将“原始地址线程数”设置为10,然后选择“下载加速”子项,将右侧的三个选项全部选中,单击“确定”按钮。
第三,适时利用“暂停”“开始”按钮,也可加速下载进程。有时候,任务搜索到的资源超过100个,但是速度却降低了,这时候,可以先暂停任务,再开始,让服务器重新搜索资源,这时速度会明显上升。
文件较大时,应尽量选择在夜里11时到次日8点这一时段下载,因为此时是上网低峰期,可获得最为理想的下载速度。通宵下载时,为了达到节能的目的,可以直接关闭显示器,并启用离开模式。
离开模式可以在关闭大部分设备的电源的同时,进行影音处理、文件下载、文件复制等操作。默认情况下,该模式并未启用,我们需要通过修改注册表来启用它。
按下“Win+R”组合键,打开运行对话框,输入Regedit,回车,打开注册表编辑器窗口,右击[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power]子键,选择“新建→DWORD(32-位)值”,新建一个名为AwayModeEnabled的值。在右侧窗格中双击该值,打开“编辑DWORD(32位值”对话框,将“数值数据”设置为1,单击“确定”按钮,重启系统,离开模式即可被启用。以后我们可以通过在“开始→关机”菜单中选择“睡眠”命令,让计算机处于离开模式
修改注册表开启系统的离开模式
小知识:下载时是否应该打开QOS服务
QoS(Quality of Service)即服务质量。它是网络的一种安全机制, 用来解决网络延迟和阻塞等问题。 正常情况下,如果我们访问网络的目的,只是用来浏览一下网页或收发邮件,该机制并不会发挥作用,但如果我们要观看在线视频、欣赏在线音乐或下载文件时,该机制就十分必要了。因为它会在网络传输量较大时,确保重要的数据不会延迟或丢弃,同时保证网络能够高效运行。所以我们此前常听说的用关闭QOS服务来提高网速的做法,是杀鸡取卵,得不偿失的一种错误做法。
扩展阅读:“杀手”出场 网速蹭蹭涨
对于一些高级游戏玩家来说,因为对网速的苛刻要求,往往会选购“杀手网卡”。你一定会问。杀手网卡的“杀手锏”是什么?为什么会受到游戏玩家的青睐呢?我们又该如何选择?
杀手网卡实际上是一台帮助电脑处理网络信号的微型电脑,它不但具备NPU(网络处理单元),还具备缓存、FLSH和LIUNX操作系统,甚至可以外挂防火墙软件,P2P下载软件等,类似于使用番茄固件的路由器。其主要是在网络带宽较大(比如局域网或100MB以上)、或网络质量不好,经常丢包时,可减轻电脑CPU的负担,让CPU轻装前进,从而达到更快地运行游戏地目的、二是它会绕过系统堆栈,直接处理大部分的TCP/IP处理任务,可以减少13毫秒的数据包延迟。所以,杀手网卡对于一些CS之类的射击竞技游戏联网时效果不错。此外,它对于用UDP协议传输数据的网络游戏也有一定的优化作用。
么是CANVAS? 首先介绍下canvas, 前端的同学可能很熟悉,举个很简单的例子,
平常用的网页截图、H5游戏、前端动效、可视化图表…,都有canvas 的应用场景, 官方的定义:
canvas是HTML5提供的一种新标签,
ie9才开始支持的,canvas是一个矩形区域的画布,可以用JS控制每一个像素在上面绘画。canvas 标签使用 JavaScript
在网页上绘制图像,本身不具备绘图功能。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。
看着很简单,其实canvas这个标签的加入,赋予了我们更多创建惊艳的前端效果的能力。但是你知道他也有性能问题??本篇文章就简单谈一谈canvas的性能优化。
我们都知道浏览器上渲染动画 每一秒高达60帧,也就是1秒钟内我们完成60次图像绘制, 也就是每一帧图像的绘制时间其实就是(1000/ 60)。 如果在每一帧动画的时间小于 16.7 ms 辣么就会出现卡顿、丢帧。而canvas 其实是一个指令式绘图系统, 他通过绘图指令来完成绘图操作。
影响canvas两个很关键的因素:
第一个渲染的图形数量多,就是调用绘图指令的次数比较多,
第二个渲染的图形大,就是一次绘图渲染的时间比较长
这句话怎么理解呢 , 假设你要在场景中画正n变形,这是一个 很常见的需求可能你稍不注意写下了下面这几行代码:
function drawAnyShape(points) {
for(let i=0; i<points.length; i++) {
const p1 = points[i]
const p2 = i=== points.length - 1 ? points[0] : points[i+1]
ctx.fillStyle = 'black'
ctx.beginPath();
ctx.moveTo(...p1)
ctx.lineTo(...p2)
ctx.closePath();
ctx.stroke()
}
}
points 对应的生成多边形的点,代码如下:
function generatePolygon(x,y,r, edges = 3) {
const points = []
const detla = 2* Math.PI / edges;
for(let i= 0;i<edges;i++) {
const theta = i * detla;
points.push([x+ r * Math.sin(theta), y + r * Math.cos(theta)])
}
return points
}
一看这fps低成这个样子,很多人这时候说,你画的图形多,那我只要悄悄的改下代码,就能让fps 回归正常
重写了正多边形的方法:
function drawAnyShape2(points) {
ctx.beginPath();
ctx.moveTo(...points[0]);
ctx.fillStyle = 'black'
for(let i=1; i<points.length; i++) {
ctx.lineTo(...points[i])
}
ctx.closePath();
ctx.stroke()
}
看了下fps 已经成功升到了30fps, 这是为什么呢, 第一段我们在循环中去做绘图操作, 循环一次, stoke() 一次,这显然是不合理的,第二个直接把stoke() ,放到循环外,其实就调用了一次,所以我们可以得出减少绘图指令是可以提高canvas的性能的
为什么需要分层渲染, 在游戏中,假设人物的不停地在移动,但是呢背景可能加了很多花里呼哨的元素,但是我在每一次更新的时候,场景本身是不变的,变的只有人物不停的移动,如果每一帧再去重绘不就造成了性能浪费, 这时候分层canvas就出现了 我们先看下一张图你可能就明白了。
我通过3个canvas叠在一起,通过设置每个canvas的 z-index 达到了3个画布还是在同一层的错觉,这样我在requestAnimation中,只需要对 动的图形去做重新绘制就好了,其余的依旧是保持不动 。
伪代码
<canvas id="backgroundCanvas" />
<canvas id="peopleActionCanvas" />
const peopleActionCanvas = document.getElementById('peopleActionCanvas');
const backgroundCanvas = document.getElementById('backgroundCanvas');
function draw(){
drawPeopleAction(peopleActionCanvas);
if (needDrawBackground) {
drawBackground(backgroundCanvas);
}
requestAnimationFrame(draw);
}
一个背景层一个运动层, 在抽象一点,我们什么时候应该去做分层 ,如果画布纯是静态的就没有必要去做分层了, 如果当前有静态有东动态的,你可以逻辑层放在最上面,然后展示层 放在最底下就可以实现所谓的 分层渲染了,但是最好保持在3-5个。
局部渲染的话其实就是调用canvas 的 clip方法。官方文档MDN 对这个方法的使用
CanvasRenderingContext2D.clip() 是 Canvas 2D API 将当前创建的路径设置为当前剪切路径的方法
如何用canvas 画一个1/4圆。
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'red'
ctx.arc(100, 100, 75, 0, Math.PI*2, false);
//ctx.clip();
ctx.fillRect(0, 0, 100,100);
这里填充的时候 没有用clip 画面上应该是一个矩形。
这时候我把clip注释解开来, 矩形变成了一个半圆。 所以clip 这个 api 结合 fillRect 填充 就是实现填充任意图形路径。
canvas 中画了1000 个圆形, 如果你只改一个颜色,那其他999都是不变的 这种浪费是肯定存在性能问题, 如果在做动画效果可想而知,丢帧非常厉害。 这里就可以使用我们上面的api
正确的做法其实就是我们要做局部刷新:
确定改变的元素的包围盒(是否存在相交)
画出路径 然后 clip
最后重新绘制绘制改变的图形
clip() 确定绘制的的裁剪区域,区域之外的图形不能绘制,详情查看 CanvasRenderingContext2D.clip() clearRect(x, y, width, height) 擦除指定矩形内的颜色,查看 CanvasRenderingContext2D.clearRect()
包围盒
用一个框去把图形包围住, 其实在几何中我们叫包围盒 或者是boundingBox。 可以用来快速检测两个图形是否相交, 但是还是不够准确。最好还是用图形算法去解决。 或者游戏中的碰撞检测,都有这个概念。这里讨论的是2d的boudingbox, 还是比较简单的。
虚线框其实就是boundingBox, 其实就是根据图形的大小,算出一个矩形边框。理论我们知道了,映射到代码层次, 我们怎么去表达呢? 这里带大家原生实现一下bound2d 类, 其实每个2d图形,都可以去实现。 因为2d图形都是由点组成的,所以只要获得每一个图形的离散点集合, 然后对这些点,去获得一个2d空间的boundBox。
我们先说下 什么是离屏canvas???
OffscreenCanvas提供了一个可以脱离屏幕渲染的canvas对象。它在窗口环境和web worker环境均有效。
脱离屏幕渲染的canvas对象,这对我们实际写动画的时候真的有用吗???
想象以下这个场景:如果发现自己在每个动画帧上重复了一些相同的绘制操作,请考虑将其分流到屏幕外的画布上。 然后,您可以根据需要频繁地将屏幕外图像渲染到主画布上,而不必首先重复生成该图像的步骤。由于浏览器是单线程,canvas的计算和渲染其实是在同一个线程的。这就会导致在动画中(有时候很耗时)的计算操作将会导致App卡顿,降低用户体验。
幸运的是, OffscreenCanvas 离屏Canvas可以非常棒的解决这个麻烦!
到目前为止,canvas的绘制功能都与标签绑定在一起,这意味着canvas API和DOM是耦合的。而OffscreenCanvas,正如它的名字一样,通过将Canvas移出屏幕来解耦了DOM和canvas API。
由于这种解耦,OffscreenCanvas的渲染与DOM完全分离了开来,并且比普通canvas速度提升了一些,而这只是因为两者(Canvas和DOM)之间没有同步。但更重要的是,将两者分离后,canvas将可以在Web Worker中使用,即使在Web Worker中没有DOM。这给canvas提供了更多的可能性。
这就离屏canvas 为啥和webworker 这么配的缘故了。
如何创建离屏CANVAS?
创建离屏canvas有两种方式:
一种是通过OffscreenCanvas的构造函数直接创建。比如下面的示例代码:
// 离屏canvas
const offscreen = new OffscreenCanvas(200, 200);
第二种是使用canvas的transferControlToOffscreen函数获取一个OffscreenCanvas对象,绘制该OffscreenCanvas对象,同时会绘制canvas对象。比如如下代码:
const canvas = document.getElementById('canvas');
const offscreen = canvas.transferControlToOffscreen();
我写了下面这个小demo 验证下到底是不是可靠的
const canvas = document.getElementById('canvas');
// 离屏canvas
const offscreen1 = new OffscreenCanvas(200, 200);
const offscreen2 = canvas.transferControlToOffscreen();
console.error(offscreen1,offscreen2, '222')
离屏canvas怎么与主线程的canvas通信呢?
这时候引用另外一个api transferToImageBitmap
通过transferToImageBitmap函数可以从OffscreenCanvas对象的绘制内容创建一个ImageBitmap对象。该对象可以用于到其他canvas的绘制。
比如一个常见的使用是,把一个比较耗费时间的绘制放到web worker下的OffscreenCanvas对象上进行,绘制完成后,创建一个ImageBitmap对象,并把该对象传递给页面端,在页面端绘制ImageBitmap对象。
写个小demo测试下:
优化前
我们画 10000 * 10000 个矩形看看页面的响应和时间,代码如下:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
function draw() {
for(let i = 0;i < 10000;i ++){
for(let j = 0;j < 1000;j ++){
ctx.fillRect(i*3,j*3,2,2);
}
}
}
draw()
ctx.arc(100,75,50,0,2*Math.PI);
ctx.stroke()
可以很明显的感受到,在渲染出图形前,浏览器是失去响应的,我们无法做认可操作。这样的用户体验肯定是非常差的。
优化后
我们使用离屏canvas + webworker 进行优化,代码如下:
我们先看下worker 的代码:
let offscreen,ctx;
// 监听主线程发的信息
onmessage = function (e) {
if(e.data.msg == 'init'){
init();
draw();
}
}
function init() {
offscreen = new OffscreenCanvas(512, 512);
ctx = offscreen.getContext("2d");
}
// 绘制图形
function draw() {
ctx.clearRect(0,0,offscreen.width,offscreen.height);
for(var i = 0;i < 10000;i ++){
for(var j = 0;j < 1000;j ++){
ctx.fillRect(i*3,j*3,2,2);
}
}
const imageBitmap = offscreen.transferToImageBitmap();
// 传送给主线程
postMessage({imageBitmap:imageBitmap},[imageBitmap]);
}
看下主线程的代码:
const worker = new Worker('./worker.js')
worker.postMessage({msg:'init'});
worker.onmessage = function (e) {
// 这里就接受到work 传来的离屏canvas位图
ctx.drawImage(e.data.imageBitmap,0,0);
}
ctx.arc(100,75,50,0,2*Math.PI);
ctx.stroke()
对比两个很明显的变化, 画多个矩形是个非常耗时的操作会影响其他图形渲染,可以采用离屏canvas + webworker 来解决这种失去响应。
touchmove事件和滚动事件有时候是有冲突的,这样在我们移动手指时回导致绘画效果的卡顿,或者事件点位跳跃的情况发生,这时候我们只需要把滚动事件禁用既可以了
禁用方式是在标签上加上或者微信小程序页面加上"disableScroll": true,如果是uniapp在pages.json加上
“disableScroll”: true
<canvas :id="cid" disable-scroll="true" type="2d" ></canvas>
Waterworks!》是一款免费的卡牌策略游戏,由老牌独立开发商Scriptwelder出品(该团队曾以精品Flash游戏著称)。该游戏的主题是为一个逐步发展的中世纪城市“Grudziądz”提供与发展度相适宜的水资源(好吧,我更愿意称之为“五水共治模拟”)。
这游戏听上去就很有教育意义——确实如此。当然,不仅如此,它还是个确实挺好玩,模拟经营部分做的挺完善的游戏(所以不仅仅是听个噱头)。
在《Waterworks!》中,玩家使用一副卡牌来建立新兴的中世纪城市的基础设施和资源(只涉及水相关)。在几百年的时间里,这些基础设施必须重新进行改造,扩大规模,才能让一个大型的繁华城市在一个没有什么天然淡水的地方茁壮成长。这是一个非常严谨的游戏,每张卡都有一个目的和适当的用途,通过手部管理使你能够在城市人口供不应求之前有效地发展水利工程。
在游戏的最后,玩家会惊讶的发现自己建造了非常令人印象深刻的水力工程——而这确实在五六百年前的中世纪有可能发生。
《Waterworks!》可以在Itch.io上免费玩到,并且不用下载(这是一个发布于网页端的html5小游戏),相信大家完了之后会对中世纪给排水(以及五水共治)有更深一步的理解。可惜没有中文,不过真的入手起来也不难。
说了这么多,到底什么是五水共治呢?其实很简单,就是指“治污水、防洪水、排涝水、保供水、抓节水”。不得不说,我国的政策概括的都相当精准,如果《Waterworks!》想继续深入挖掘,完全可以往这五个方向深耕(甚至小编都想去做一个真·五水共治的游戏了,希望到时候大家多多支持(逃……
*请认真填写需求信息,我们会在24小时内与您取得联系。