整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          讓你的網(wǎng)游騎上加速快馬

          到網(wǎng)速對(duì)網(wǎng)游的影響,很多人玩游戲的人都會(huì)聯(lián)想到下面的情景:好容易等到機(jī)會(huì)來臨,舉槍射擊,以為革命大業(yè)就此可定,不料網(wǎng)速不穩(wěn),果斷卡住,等網(wǎng)速恢復(fù),自己已是萬箭穿身。

          因網(wǎng)絡(luò)不通暢帶給游戲者的煩惱其實(shí)遠(yuǎn)不止如此,掉線、登錄時(shí)間過長(zhǎng)甚至無法登錄等情況也時(shí)有發(fā)生。是什么原因造成了這樣的情況,我們又該如何去尋找補(bǔ)救措施呢?

          其實(shí),造成網(wǎng)速過慢的原因很多,其中最主要的是不同運(yùn)營(yíng)商之間跨網(wǎng)通訊的兼容性問題。電信、聯(lián)通、移動(dòng)三大運(yùn)營(yíng)商之間的網(wǎng)絡(luò)相互訪問時(shí),經(jīng)常會(huì)出現(xiàn)延遲過高、丟包之類等情況。目前解決該問題的最有效的辦法是利用網(wǎng)游加速器進(jìn)行加速。以NETPAS標(biāo)準(zhǔn)版為例。

          安裝后啟動(dòng)程序,在該界面中單擊“注冊(cè)”按鈕完成注冊(cè)并登錄,在“服務(wù)類型”項(xiàng)中選擇“游戲加速”,然后單擊“啟動(dòng)加速”按鈕。

          稍后會(huì)出現(xiàn)該界面,顯示當(dāng)前分配的地址及連接時(shí)間、接收的數(shù)據(jù)等信息,說明加速開始。此后程序會(huì)在后臺(tái)全自動(dòng)處理網(wǎng)絡(luò)數(shù)據(jù),對(duì)游戲進(jìn)行加速,期間根本無需我們手工參與。

          那么,NETPAS的加速效果究竟如何呢?為了得到一個(gè)比較明確的答案,在某日的11:15~11:45,我們用兩臺(tái)配置相同的筆記本,對(duì)其進(jìn)行了一個(gè)簡(jiǎn)單測(cè)試。測(cè)試游戲?yàn)槟ЙF世界,測(cè)試環(huán)境為:聯(lián)通4MB ADSL、i5-2310 CPU、4GB內(nèi)存,Windows 7 64位旗艦版操作系統(tǒng),測(cè)試方法為將其中一臺(tái)直接接入寬帶,另一臺(tái)使用NETPAS加速器,每5分鐘記錄一次數(shù)據(jù),最后得到的結(jié)果見圖3:

          在網(wǎng)絡(luò)良好的環(huán)境中,NETAS加速效果對(duì)比

          從中我們可以看出,使用加速器的延遲表現(xiàn)明顯要好于未使用時(shí),這里尤其要說明的是,由于我們測(cè)試所處的網(wǎng)絡(luò)環(huán)境良好,這種差異還不算太大,如果在網(wǎng)絡(luò)環(huán)境不好的使用,效果會(huì)更為可觀。

          小技巧:提高網(wǎng)速的其他方法匯總

          • 別在網(wǎng)絡(luò)高峰期玩游戲,比如在晚上8~11點(diǎn)之間,或者是節(jié)假日等;

          • 內(nèi)網(wǎng)用戶,在玩網(wǎng)游時(shí),應(yīng)保證網(wǎng)內(nèi)無人使用迅雷、快車或P2P之類的軟件傳輸文件(包括看視頻);

          • 有些軟件會(huì)在后臺(tái)偷偷連接網(wǎng)絡(luò)并進(jìn)行數(shù)據(jù)傳輸,可用360和金山衛(wèi)士等防護(hù)軟件將其禁止。以360安全衛(wèi)士為例:

          • 右擊桌面上的“加速球”,選擇“看網(wǎng)速”,進(jìn)入相應(yīng)界面,右擊在后臺(tái)連網(wǎng)的程序,在出現(xiàn)的右鍵菜單中選擇“禁止訪問網(wǎng)絡(luò)”,即可禁止其訪問網(wǎng)絡(luò)。

          收費(fèi)or免費(fèi) 網(wǎng)絡(luò)加速器的抉擇

          面對(duì)網(wǎng)速過慢、延時(shí)過高、容易掉線以及登錄困難等問題很多人會(huì)選擇加速器,網(wǎng)游加速器的確可在一定程度上解決問題。不過,面對(duì)種類繁多的加速產(chǎn)品,我們到底該怎么選擇?

          目前所有的網(wǎng)游加速器,都是通過花錢買節(jié)點(diǎn),然后通過中轉(zhuǎn)服務(wù)來達(dá)到加速目的的。從這一意義上來說,各加速器的基礎(chǔ)加速效果并無多大差異。所以無論是免費(fèi)的還是免費(fèi)的,基本上都能滿足一般玩家的需要。知道了加速器的原理,那面臨是該選擇免費(fèi)的還是收費(fèi)的這個(gè)問題時(shí),就不難決定了。

          由于各大加速器是通過購(gòu)買節(jié)點(diǎn)的方式進(jìn)行加速的,這就意味著它們的付出需要得到回報(bào)。所以,盡管目前網(wǎng)上有不少打著免費(fèi)旗號(hào)的網(wǎng)游加速器在誘導(dǎo)用戶下載,但實(shí)際上,它們的免費(fèi)是有一定限制的,比如,只在某段時(shí)期內(nèi)免費(fèi)(可免費(fèi)試用多長(zhǎng)時(shí)間,通常為七7~10天),只在固定時(shí)段內(nèi)免費(fèi)(比如晚上11點(diǎn)到次日7時(shí)),或者只對(duì)指定的游戲免費(fèi)(通常是一些較老的游戲,新游戲需要付費(fèi))。

          有些所謂的免費(fèi)只是針對(duì)一部分較老的游戲

          目前真正免費(fèi)的網(wǎng)游加速器只有一款,那就是網(wǎng)游快車。網(wǎng)游快車的營(yíng)利方式不在于向用戶收費(fèi),而在于在界面中顯示盡可能多的廣告,所以比較適合那些對(duì)廣告不太反感的朋友使用。不過,為了安全起見里面顯示的廣告最好不要隨便去點(diǎn)擊,以免出現(xiàn)不必要的麻煩。

          雖然完全免費(fèi),但網(wǎng)游快車中顯示的廣告的確讓人厭煩

          盡管如此,骨灰級(jí)玩家因?yàn)樵谟螒蛑薪臅r(shí)間過長(zhǎng),涉及到的游戲面廣,在選擇網(wǎng)游加速器方面,與一般玩家還是有區(qū)別。他們應(yīng)該根據(jù)自己的實(shí)際情況,選擇真正適合的產(chǎn)品才行。選擇的標(biāo)準(zhǔn),主要取決于網(wǎng)游加速器提供的特色功能、支持游戲的多寡和具體的收費(fèi)情況。那么,我們就來看看幾大加速器的優(yōu)劣和功能對(duì)比吧。

          五大主流加速器整體優(yōu)勢(shì)、特色功能及收費(fèi)情況列表

          小知識(shí):國(guó)服玩家如何登錄外服?

          國(guó)服玩家要想登錄外服,必須借助代理或VPN才行。除了上面介紹的部分加速器可以實(shí)現(xiàn)外,目前國(guó)內(nèi)也有不少專門的免費(fèi)VPN,比如“CoCoVPN”。該VPN目前已經(jīng)穩(wěn)定運(yùn)營(yíng)一年以上,線路也超過100條以上,延遲穩(wěn)定低于50ms,有興趣的玩家不妨試一下。

          頁(yè)游玩得爽 瀏覽器幫忙

          新型的頁(yè)游以其小巧、精悍的特性受到很多游戲愛好者的喜愛。但是,要想玩的舒暢,似乎除了對(duì)網(wǎng)速有要求之外,對(duì)于瀏覽器的選擇也有著一門“學(xué)問”。

          利用小號(hào)挖礦采集資源,讓大號(hào)升級(jí)得更快,是很多頁(yè)游愛好者的生存之道。不過,現(xiàn)在大部分頁(yè)游會(huì)通過Cookie限制用戶,只能同時(shí)只能登錄一個(gè)賬號(hào)。多個(gè)賬號(hào)如何同時(shí)登錄呢?而且隨著HTML5技術(shù)的發(fā)展,選擇適合的頁(yè)游瀏覽器也變得至關(guān)重要。那么,瀏覽器對(duì)Flash和HTML5的支持程度是否直接影響到網(wǎng)游的實(shí)際表現(xiàn)?哪些瀏覽器對(duì)Flash和HTML5的支持更好呢?

          如果我們的目的只是要同時(shí)登錄多個(gè)小號(hào),完全可以用“松果游戲?yàn)g覽器”來解決。在瀏覽器中選擇自己所玩的游戲,并用大號(hào)登錄,單擊頁(yè)面收藏夾欄右側(cè)的“小號(hào)登錄”按鈕,在瀏覽器的標(biāo)簽欄中,會(huì)出現(xiàn)一個(gè)名為“小號(hào)”的標(biāo)簽。在該標(biāo)簽中,已經(jīng)登錄的游戲會(huì)處于未登錄狀態(tài),用小號(hào)登錄即可。用類似的方法,可以同時(shí)開最多10個(gè)小號(hào)。

          松果游戲?yàn)g覽器最多可同時(shí)開啟10個(gè)小號(hào)

          而對(duì)于瀏覽器對(duì)Flash和HTML5的支持性能方面,我們則可以通過Asteroids HTML5和GUIMark2平臺(tái)提供的兩個(gè)測(cè)試來說明。其中前者可檢測(cè)瀏覽器的HTML5游戲性能,后者則可檢測(cè)瀏覽器的Flash性能。顯然,在玩游戲(特別是大型游戲)的過程中,如果瀏覽器對(duì)這兩個(gè)方面支持不好,就會(huì)出現(xiàn)游戲很卡、運(yùn)行不流暢、或者畫面質(zhì)量下降等情況。

          在這兩大測(cè)試中,都以得分最高的瀏覽器為優(yōu)勝。

          目前國(guó)內(nèi)用戶是常用的五大瀏覽器在Asteroids HTML5測(cè)試中的得分情況

          五大瀏覽器在GUIMark2測(cè)試中的得分情況

          通過上兩個(gè)測(cè)試,我們不難看出,在Asteroids HTML5測(cè)試中,IE11及IE10的分?jǐn)?shù)、幀數(shù)排名最為靠前,而在Flash測(cè)試方面,雖然其最終成績(jī)稍遜于Chrome,但僅僅1~4分的差距,在日常使用的過程中,實(shí)際上是很難感覺出其中差別的。所有就游戲性能來說,IE10和IE11表現(xiàn)不錯(cuò),是網(wǎng)頁(yè)游戲用戶的最好的選擇。

          小知識(shí):頁(yè)游如何避免惡意網(wǎng)站

          對(duì)網(wǎng)頁(yè)游戲玩家來說,常見的惡意網(wǎng)種無非有三種,一是打著銷售武器裝備的幌子直接騙取買家錢財(cái)?shù)模羌倜坝螒蚬俜巾?yè)面,盜取用戶賬號(hào)密碼的,三是直接在游戲官方網(wǎng)站掛馬,以達(dá)到非法目的的。對(duì)于這幾種情況,我們都可通過瀏覽器提供的相應(yīng)功能來進(jìn)行識(shí)別。目前像360安全瀏覽器、Chrome、IE和Firefox等瀏覽器,都提供了網(wǎng)址安全功能,借助它,我們可很容易看出網(wǎng)站的安全性能。此外,像360和金山安全衛(wèi)士等,也提供了游戲模式,會(huì)自動(dòng)識(shí)別玩家進(jìn)入的網(wǎng)站是否安全。只要善于利用,即可將惡意網(wǎng)站拒之門外。

          游戲下載別盲目 設(shè)置當(dāng)中有訣竅

          現(xiàn)在的游戲客戶端越來越大,下載自然需要很長(zhǎng)時(shí)間,有沒有較好的方法可以提高迅雷的下載速度,減少等待時(shí)間?我們是否可以通過一些手動(dòng)設(shè)置,來提高迅雷的下載速度?

          還別說,就拿迅雷來說,要想讓下載順利地高效運(yùn)行,不進(jìn)行一些設(shè)置還真不行。

          首先,要保證一次下載的任務(wù)不要太多,一般以最多三個(gè)為宜。此外,就是限制上傳速度。不限制上傳速度將在很大程度上降低下載速度,這一現(xiàn)象,在BT下載時(shí)最為明顯。限制的方法為:在迅雷主界面中,單擊主菜單按鈕,選擇“配置中心”,打開“系統(tǒng)設(shè)置”對(duì)話框。

          在左側(cè)的“基本設(shè)置”項(xiàng)下選擇“常規(guī)設(shè)置”子項(xiàng),在右側(cè)勾選“自定義模式”,然后將“最大上傳速度”設(shè)置為最小值(默認(rèn)是10KB/s),單擊“確定”按鈕。

          其次,是讓迅雷的下載線程心可能地多些。出于穩(wěn)定的原因,迅雷默認(rèn)設(shè)置中作了保守的設(shè)置,而我們的機(jī)器和網(wǎng)絡(luò)環(huán)境都比較好,這時(shí)完全可以自行設(shè)置,使其全速前進(jìn)。

          在左側(cè)的“我的下載”項(xiàng)中選擇“任務(wù)默認(rèn)屬性”子項(xiàng),然后在右側(cè),將“原始地址線程數(shù)”設(shè)置為10,然后選擇“下載加速”子項(xiàng),將右側(cè)的三個(gè)選項(xiàng)全部選中,單擊“確定”按鈕。

          第三,適時(shí)利用“暫停”“開始”按鈕,也可加速下載進(jìn)程。有時(shí)候,任務(wù)搜索到的資源超過100個(gè),但是速度卻降低了,這時(shí)候,可以先暫停任務(wù),再開始,讓服務(wù)器重新搜索資源,這時(shí)速度會(huì)明顯上升。

          文件較大時(shí),應(yīng)盡量選擇在夜里11時(shí)到次日8點(diǎn)這一時(shí)段下載,因?yàn)榇藭r(shí)是上網(wǎng)低峰期,可獲得最為理想的下載速度。通宵下載時(shí),為了達(dá)到節(jié)能的目的,可以直接關(guān)閉顯示器,并啟用離開模式。

          離開模式可以在關(guān)閉大部分設(shè)備的電源的同時(shí),進(jìn)行影音處理、文件下載、文件復(fù)制等操作。默認(rèn)情況下,該模式并未啟用,我們需要通過修改注冊(cè)表來啟用它。

          按下“Win+R”組合鍵,打開運(yùn)行對(duì)話框,輸入Regedit,回車,打開注冊(cè)表編輯器窗口,右擊[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power]子鍵,選擇“新建→DWORD(32-位)值”,新建一個(gè)名為AwayModeEnabled的值。在右側(cè)窗格中雙擊該值,打開“編輯DWORD(32位值”對(duì)話框,將“數(shù)值數(shù)據(jù)”設(shè)置為1,單擊“確定”按鈕,重啟系統(tǒng),離開模式即可被啟用。以后我們可以通過在“開始→關(guān)機(jī)”菜單中選擇“睡眠”命令,讓計(jì)算機(jī)處于離開模式

          修改注冊(cè)表開啟系統(tǒng)的離開模式

          小知識(shí):下載時(shí)是否應(yīng)該打開QOS服務(wù)

          QoS(Quality of Service)即服務(wù)質(zhì)量。它是網(wǎng)絡(luò)的一種安全機(jī)制, 用來解決網(wǎng)絡(luò)延遲和阻塞等問題。 正常情況下,如果我們?cè)L問網(wǎng)絡(luò)的目的,只是用來瀏覽一下網(wǎng)頁(yè)或收發(fā)郵件,該機(jī)制并不會(huì)發(fā)揮作用,但如果我們要觀看在線視頻、欣賞在線音樂或下載文件時(shí),該機(jī)制就十分必要了。因?yàn)樗鼤?huì)在網(wǎng)絡(luò)傳輸量較大時(shí),確保重要的數(shù)據(jù)不會(huì)延遲或丟棄,同時(shí)保證網(wǎng)絡(luò)能夠高效運(yùn)行。所以我們此前常聽說的用關(guān)閉QOS服務(wù)來提高網(wǎng)速的做法,是殺雞取卵,得不償失的一種錯(cuò)誤做法。

          擴(kuò)展閱讀:“殺手”出場(chǎng) 網(wǎng)速蹭蹭漲

          對(duì)于一些高級(jí)游戲玩家來說,因?yàn)閷?duì)網(wǎng)速的苛刻要求,往往會(huì)選購(gòu)“殺手網(wǎng)卡”。你一定會(huì)問。殺手網(wǎng)卡的“殺手锏”是什么?為什么會(huì)受到游戲玩家的青睞呢?我們又該如何選擇?

          殺手網(wǎng)卡實(shí)際上是一臺(tái)幫助電腦處理網(wǎng)絡(luò)信號(hào)的微型電腦,它不但具備NPU(網(wǎng)絡(luò)處理單元),還具備緩存、FLSH和LIUNX操作系統(tǒng),甚至可以外掛防火墻軟件,P2P下載軟件等,類似于使用番茄固件的路由器。其主要是在網(wǎng)絡(luò)帶寬較大(比如局域網(wǎng)或100MB以上)、或網(wǎng)絡(luò)質(zhì)量不好,經(jīng)常丟包時(shí),可減輕電腦CPU的負(fù)擔(dān),讓CPU輕裝前進(jìn),從而達(dá)到更快地運(yùn)行游戲地目的、二是它會(huì)繞過系統(tǒng)堆棧,直接處理大部分的TCP/IP處理任務(wù),可以減少13毫秒的數(shù)據(jù)包延遲。所以,殺手網(wǎng)卡對(duì)于一些CS之類的射擊競(jìng)技游戲聯(lián)網(wǎng)時(shí)效果不錯(cuò)。此外,它對(duì)于用UDP協(xié)議傳輸數(shù)據(jù)的網(wǎng)絡(luò)游戲也有一定的優(yōu)化作用。

          么是CANVAS? 首先介紹下canvas, 前端的同學(xué)可能很熟悉,舉個(gè)很簡(jiǎn)單的例子,
          平常用的網(wǎng)頁(yè)截圖、H5游戲、前端動(dòng)效、可視化圖表…,都有canvas 的應(yīng)用場(chǎng)景, 官方的定義:
          canvas是HTML5提供的一種新標(biāo)簽,
          ie9才開始支持的,canvas是一個(gè)矩形區(qū)域的畫布,可以用JS控制每一個(gè)像素在上面繪畫。canvas 標(biāo)簽使用 JavaScript
          在網(wǎng)頁(yè)上繪制圖像,本身不具備繪圖功能。canvas 擁有多種繪制路徑、矩形、圓形、字符以及添加圖像的方法。
          看著很簡(jiǎn)單,其實(shí)canvas這個(gè)標(biāo)簽的加入,賦予了我們更多創(chuàng)建驚艷的前端效果的能力。但是你知道他也有性能問題??本篇文章就簡(jiǎn)單談一談canvas的性能優(yōu)化。

          哪些因素會(huì)影響canvas的性能

          canvas優(yōu)化的幾種方式

          我們都知道瀏覽器上渲染動(dòng)畫 每一秒高達(dá)60幀,也就是1秒鐘內(nèi)我們完成60次圖像繪制, 也就是每一幀圖像的繪制時(shí)間其實(shí)就是(1000/ 60)。 如果在每一幀動(dòng)畫的時(shí)間小于 16.7 ms 辣么就會(huì)出現(xiàn)卡頓、丟幀。而canvas 其實(shí)是一個(gè)指令式繪圖系統(tǒng), 他通過繪圖指令來完成繪圖操作。
          影響canvas兩個(gè)很關(guān)鍵的因素:
          第一個(gè)渲染的圖形數(shù)量多,就是調(diào)用繪圖指令的次數(shù)比較多,
          第二個(gè)渲染的圖形大,就是一次繪圖渲染的時(shí)間比較長(zhǎng)

          優(yōu)化canvas

          1. 減少繪圖指令的調(diào)用

          這句話怎么理解呢 , 假設(shè)你要在場(chǎng)景中畫正n變形,這是一個(gè) 很常見的需求可能你稍不注意寫下了下面這幾行代碼:

          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 對(duì)應(yīng)的生成多邊形的點(diǎn),代碼如下:

           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低成這個(gè)樣子,很多人這時(shí)候說,你畫的圖形多,那我只要悄悄的改下代碼,就能讓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 已經(jīng)成功升到了30fps, 這是為什么呢, 第一段我們?cè)谘h(huán)中去做繪圖操作, 循環(huán)一次, stoke() 一次,這顯然是不合理的,第二個(gè)直接把stoke() ,放到循環(huán)外,其實(shí)就調(diào)用了一次,所以我們可以得出減少繪圖指令是可以提高canvas的性能的

          2.分層渲染

          為什么需要分層渲染, 在游戲中,假設(shè)人物的不停地在移動(dòng),但是呢背景可能加了很多花里呼哨的元素,但是我在每一次更新的時(shí)候,場(chǎng)景本身是不變的,變的只有人物不停的移動(dòng),如果每一幀再去重繪不就造成了性能浪費(fèi), 這時(shí)候分層canvas就出現(xiàn)了 我們先看下一張圖你可能就明白了。

          我通過3個(gè)canvas疊在一起,通過設(shè)置每個(gè)canvas的 z-index 達(dá)到了3個(gè)畫布還是在同一層的錯(cuò)覺,這樣我在requestAnimation中,只需要對(duì) 動(dòng)的圖形去做重新繪制就好了,其余的依舊是保持不動(dòng) 。

          偽代碼

           
          <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);
          }
          

          一個(gè)背景層一個(gè)運(yùn)動(dòng)層, 在抽象一點(diǎn),我們什么時(shí)候應(yīng)該去做分層 ,如果畫布純是靜態(tài)的就沒有必要去做分層了, 如果當(dāng)前有靜態(tài)有東動(dòng)態(tài)的,你可以邏輯層放在最上面,然后展示層 放在最底下就可以實(shí)現(xiàn)所謂的 分層渲染了,但是最好保持在3-5個(gè)。

          3. 局部渲染

          局部渲染的話其實(shí)就是調(diào)用canvas 的 clip方法。官方文檔MDN 對(duì)這個(gè)方法的使用

          CanvasRenderingContext2D.clip() 是 Canvas 2D API 將當(dāng)前創(chuàng)建的路徑設(shè)置為當(dāng)前剪切路徑的方法

          如何用canvas 畫一個(gè)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);
          

          這里填充的時(shí)候 沒有用clip 畫面上應(yīng)該是一個(gè)矩形。

          這時(shí)候我把clip注釋解開來, 矩形變成了一個(gè)半圓。 所以clip 這個(gè) api 結(jié)合 fillRect 填充 就是實(shí)現(xiàn)填充任意圖形路徑。

          canvas 中畫了1000 個(gè)圓形, 如果你只改一個(gè)顏色,那其他999都是不變的 這種浪費(fèi)是肯定存在性能問題, 如果在做動(dòng)畫效果可想而知,丟幀非常厲害。 這里就可以使用我們上面的api

          正確的做法其實(shí)就是我們要做局部刷新:

          確定改變的元素的包圍盒(是否存在相交)
          畫出路徑 然后 clip
          最后重新繪制繪制改變的圖形
          clip() 確定繪制的的裁剪區(qū)域,區(qū)域之外的圖形不能繪制,詳情查看 CanvasRenderingContext2D.clip() clearRect(x, y, width, height) 擦除指定矩形內(nèi)的顏色,查看 CanvasRenderingContext2D.clearRect()

          包圍盒
          用一個(gè)框去把圖形包圍住, 其實(shí)在幾何中我們叫包圍盒 或者是boundingBox。 可以用來快速檢測(cè)兩個(gè)圖形是否相交, 但是還是不夠準(zhǔn)確。最好還是用圖形算法去解決。 或者游戲中的碰撞檢測(cè),都有這個(gè)概念。這里討論的是2d的boudingbox, 還是比較簡(jiǎn)單的。

          虛線框其實(shí)就是boundingBox, 其實(shí)就是根據(jù)圖形的大小,算出一個(gè)矩形邊框。理論我們知道了,映射到代碼層次, 我們?cè)趺慈ケ磉_(dá)呢? 這里帶大家原生實(shí)現(xiàn)一下bound2d 類, 其實(shí)每個(gè)2d圖形,都可以去實(shí)現(xiàn)。 因?yàn)?d圖形都是由點(diǎn)組成的,所以只要獲得每一個(gè)圖形的離散點(diǎn)集合, 然后對(duì)這些點(diǎn),去獲得一個(gè)2d空間的boundBox。

          4.離屏CANVAS 和WEBWORKER

          我們先說下 什么是離屏canvas???

          OffscreenCanvas提供了一個(gè)可以脫離屏幕渲染的canvas對(duì)象。它在窗口環(huán)境和web worker環(huán)境均有效。

          脫離屏幕渲染的canvas對(duì)象,這對(duì)我們實(shí)際寫動(dòng)畫的時(shí)候真的有用嗎???

          想象以下這個(gè)場(chǎng)景:如果發(fā)現(xiàn)自己在每個(gè)動(dòng)畫幀上重復(fù)了一些相同的繪制操作,請(qǐng)考慮將其分流到屏幕外的畫布上。 然后,您可以根據(jù)需要頻繁地將屏幕外圖像渲染到主畫布上,而不必首先重復(fù)生成該圖像的步驟。由于瀏覽器是單線程,canvas的計(jì)算和渲染其實(shí)是在同一個(gè)線程的。這就會(huì)導(dǎo)致在動(dòng)畫中(有時(shí)候很耗時(shí))的計(jì)算操作將會(huì)導(dǎo)致App卡頓,降低用戶體驗(yàn)。

          幸運(yùn)的是, OffscreenCanvas 離屏Canvas可以非常棒的解決這個(gè)麻煩!

          到目前為止,canvas的繪制功能都與標(biāo)簽綁定在一起,這意味著canvas API和DOM是耦合的。而OffscreenCanvas,正如它的名字一樣,通過將Canvas移出屏幕來解耦了DOM和canvas API。

          由于這種解耦,OffscreenCanvas的渲染與DOM完全分離了開來,并且比普通canvas速度提升了一些,而這只是因?yàn)閮烧撸–anvas和DOM)之間沒有同步。但更重要的是,將兩者分離后,canvas將可以在Web Worker中使用,即使在Web Worker中沒有DOM。這給canvas提供了更多的可能性。

          這就離屏canvas 為啥和webworker 這么配的緣故了。

          如何創(chuàng)建離屏CANVAS?
          創(chuàng)建離屏canvas有兩種方式:

          一種是通過OffscreenCanvas的構(gòu)造函數(shù)直接創(chuàng)建。比如下面的示例代碼:

           // 離屏canvas 
           const offscreen = new OffscreenCanvas(200, 200);
          第二種是使用canvas的transferControlToOffscreen函數(shù)獲取一個(gè)OffscreenCanvas對(duì)象,繪制該OffscreenCanvas對(duì)象,同時(shí)會(huì)繪制canvas對(duì)象。比如如下代碼:
           
          const canvas  = document.getElementById('canvas');
          const offscreen = canvas.transferControlToOffscreen();
          我寫了下面這個(gè)小demo 驗(yàn)證下到底是不是可靠的
           
            const canvas  = document.getElementById('canvas');
            // 離屏canvas 
            const offscreen1 = new OffscreenCanvas(200, 200);
            const offscreen2 = canvas.transferControlToOffscreen();
            console.error(offscreen1,offscreen2, '222')    
          

          離屏canvas怎么與主線程的canvas通信呢?

          這時(shí)候引用另外一個(gè)api transferToImageBitmap

          通過transferToImageBitmap函數(shù)可以從OffscreenCanvas對(duì)象的繪制內(nèi)容創(chuàng)建一個(gè)ImageBitmap對(duì)象。該對(duì)象可以用于到其他canvas的繪制。

          比如一個(gè)常見的使用是,把一個(gè)比較耗費(fèi)時(shí)間的繪制放到web worker下的OffscreenCanvas對(duì)象上進(jìn)行,繪制完成后,創(chuàng)建一個(gè)ImageBitmap對(duì)象,并把該對(duì)象傳遞給頁(yè)面端,在頁(yè)面端繪制ImageBitmap對(duì)象。

          寫個(gè)小demo測(cè)試下:

          優(yōu)化前
          我們畫 10000 * 10000 個(gè)矩形看看頁(yè)面的響應(yīng)和時(shí)間,代碼如下:

            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()
           
          

          可以很明顯的感受到,在渲染出圖形前,瀏覽器是失去響應(yīng)的,我們無法做認(rèn)可操作。這樣的用戶體驗(yàn)肯定是非常差的。

          優(yōu)化后
          我們使用離屏canvas + webworker 進(jìn)行優(yōu)化,代碼如下:

          我們先看下worker 的代碼:

          let offscreen,ctx;
          // 監(jiān)聽主線程發(fā)的信息
          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()
          

          對(duì)比兩個(gè)很明顯的變化, 畫多個(gè)矩形是個(gè)非常耗時(shí)的操作會(huì)影響其他圖形渲染,可以采用離屏canvas + webworker 來解決這種失去響應(yīng)。

          5.禁用頁(yè)面和canvas的滾動(dòng)事件

          touchmove事件和滾動(dòng)事件有時(shí)候是有沖突的,這樣在我們移動(dòng)手指時(shí)回導(dǎo)致繪畫效果的卡頓,或者事件點(diǎn)位跳躍的情況發(fā)生,這時(shí)候我們只需要把滾動(dòng)事件禁用既可以了
          禁用方式是在標(biāo)簽上加上或者微信小程序頁(yè)面加上"disableScroll": true,如果是uniapp在pages.json加上
          “disableScroll”: true

          <canvas  :id="cid" 		 disable-scroll="true" type="2d" ></canvas>
          

          總結(jié)

          1. 繪制的圖形的數(shù)量和大小會(huì)影響canvas的性能,減少繪圖次數(shù),減少canvas接口調(diào)用次數(shù)
          2. 圖形數(shù)量過多,但是只刷新部分 可以使用局部渲染
          3. 邏輯層和背景圖層分離 可以使用分層渲染
          4. 某些長(zhǎng)時(shí)間的邏輯影響主線程的, 可以使用離屏渲染 和webworker 來解決問題
          5. 禁用頁(yè)面和容器的滾動(dòng)

          Waterworks!》是一款免費(fèi)的卡牌策略游戲,由老牌獨(dú)立開發(fā)商Scriptwelder出品(該團(tuán)隊(duì)曾以精品Flash游戲著稱)。該游戲的主題是為一個(gè)逐步發(fā)展的中世紀(jì)城市“Grudzi?dz”提供與發(fā)展度相適宜的水資源(好吧,我更愿意稱之為“五水共治模擬”)。

          這游戲聽上去就很有教育意義——確實(shí)如此。當(dāng)然,不僅如此,它還是個(gè)確實(shí)挺好玩,模擬經(jīng)營(yíng)部分做的挺完善的游戲(所以不僅僅是聽個(gè)噱頭)。

          在《Waterworks!》中,玩家使用一副卡牌來建立新興的中世紀(jì)城市的基礎(chǔ)設(shè)施和資源(只涉及水相關(guān))。在幾百年的時(shí)間里,這些基礎(chǔ)設(shè)施必須重新進(jìn)行改造,擴(kuò)大規(guī)模,才能讓一個(gè)大型的繁華城市在一個(gè)沒有什么天然淡水的地方茁壯成長(zhǎng)。這是一個(gè)非常嚴(yán)謹(jǐn)?shù)挠螒颍繌埧ǘ加幸粋€(gè)目的和適當(dāng)?shù)挠猛荆ㄟ^手部管理使你能夠在城市人口供不應(yīng)求之前有效地發(fā)展水利工程。

          在游戲的最后,玩家會(huì)驚訝的發(fā)現(xiàn)自己建造了非常令人印象深刻的水力工程——而這確實(shí)在五六百年前的中世紀(jì)有可能發(fā)生。

          《Waterworks!》可以在Itch.io上免費(fèi)玩到,并且不用下載(這是一個(gè)發(fā)布于網(wǎng)頁(yè)端的html5小游戲),相信大家完了之后會(huì)對(duì)中世紀(jì)給排水(以及五水共治)有更深一步的理解。可惜沒有中文,不過真的入手起來也不難。

          說了這么多,到底什么是五水共治呢?其實(shí)很簡(jiǎn)單,就是指“治污水、防洪水、排澇水、保供水、抓節(jié)水”。不得不說,我國(guó)的政策概括的都相當(dāng)精準(zhǔn),如果《Waterworks!》想繼續(xù)深入挖掘,完全可以往這五個(gè)方向深耕(甚至小編都想去做一個(gè)真·五水共治的游戲了,希望到時(shí)候大家多多支持(逃……


          主站蜘蛛池模板: 中文字幕日韩一区二区不卡| 亚洲综合一区二区| 一区二区高清在线| 一区二区三区视频免费| 国产精品区AV一区二区| 中文字幕Av一区乱码| 亚洲国产一区在线观看| 亚洲精品色播一区二区| 视频一区二区三区免费观看| 国产A∨国片精品一区二区 | 国99精品无码一区二区三区| 日韩精品无码中文字幕一区二区| 国产一区二区三区韩国女主播| 精品综合一区二区三区| 大伊香蕉精品一区视频在线 | 精品人无码一区二区三区 | 国产一区二区三区在线视頻| 人妻无码视频一区二区三区| 亚洲av无码一区二区三区四区| 日韩毛片一区视频免费| 国精品无码一区二区三区在线蜜臀| 久久久老熟女一区二区三区| 国产SUV精品一区二区四| 日韩精品无码一区二区三区AV| 一区二区精品在线| www一区二区三区| 交换国产精品视频一区| 中文字幕亚洲一区二区三区| 成人免费观看一区二区| 好爽毛片一区二区三区四| 无码人妻精品一区二区蜜桃| 国产一区二区三区免费观在线 | 国产成人一区二区三区免费视频| 成人精品一区二区三区中文字幕| 亚洲AV日韩AV一区二区三曲| 精品一区二区在线观看| 国产在线精品一区二区在线看 | 国产高清视频一区二区| 日韩人妻不卡一区二区三区| 精品一区二区三区高清免费观看| 无码乱码av天堂一区二区 |