搜尋
首頁web前端H5教程HTML5游戏开发 之 循环的控制(1)

       1) 动画绘制的利器:RequestAnimationFrame

       RequestAnimationFrame,绝对的大名鼎鼎。相信做HTML5的同学们,都听到过这个函数。再重复一下它的好处:
游戏页面在不被显示的时候,RequestAnimationFrame暂停执行,不会占用CPU时间
RequestAnimaitonFrame会将JS产生的动画以及CSS产生的动画,放到同一个Repait和Reflow的循环中。

       对于第二点,很少有人提及,但是非常重要,如果没有RequestAnimationFrame,而用setTimeout,很有可能在每次绘制的时候,JS产生的动画和CSS产生的动画,没有同时发生,相信这个肯定不是你想要的结果。对于第二点,有点晦涩,不太容易懂,让我们更进一步解释一下,这就要从浏览器的渲染流程说起。大体上,浏览器的渲染流程有以下四步:

       更新Dom的结构:每次你执行JS改变Dom结构,或者修改CSS相关属性,都会对Dom结构进行改变。现在HTML5中,多了Canvas元素,对于Canvas对象,执行某个操作,比如画一条线,也属于对Dom结构的改变。但是Canvas有个比较特殊的操作,比如对Canvas对象执行getImageData操作,会强制浏览器立即跳到第四步,将渲染好的浏览器窗口,绘制到屏幕。
渲染每个元素:在所有JS和CSS执行完毕之后,浏览器按照要求,开始对每个元素进行渲染。

  • 将所有元素渲染到窗口:按照窗口大小的要求,将所有的元素,绘制到一个平面上。

  • 通过操作系统窗口管理器,将渲染好的窗口,输出到屏幕。

       通常,执行完第四步,称为一帧。目前,大部分的显示器,都会将显示控制在每秒六十帧,浏览器处于优化的目的,通常的显示频率也不会超过六十帧。

       讲到这里,大约可以清楚一点,如果不用RequestAnimationFrame,而是用传统的SetTimeout,很难要求浏览器将同一次SetTimeout里面执行的Dom或者CSS操作放到同一帧中,也就会随机的出现,某个JS操作的动画和CSS或者Canvas的动画,不能同步。因为随机的,每次行为不一致,相信这是所有开发者都不愿意碰到的情况。没有开发人员怕Bug,但是害怕的是Bug不可以重现。

       2) 计算游戏的帧率(FPS)

       衡量游戏性能的重要指标就是帧率(FPS),因为浏览器的实现不一,有些浏览器出于优化的目的,没有严格的按照第一部分介绍的四步,有些时候,在某一帧没有完成的时候,就开始执行下一帧,所以理论上,很难严格的记录浏览器显示的帧率。如果你可以有个高速的摄像机,对着屏幕拍摄,是可以严格的记录屏幕显示的帧率,但是相信这个方法,很难被大规模使用。

       目前也有一些第三方类库,可以帮助你衡量游戏的帧率,比如比较著名的https://github.com/mrdoob/stats.js,但是这个是非常不严格的,以StatsJS为代表的类库,是利用很衡量setTimeout或者setInterval每秒钟被执行的次数或者时间,来衡量帧率的。但是seTimeout函数被执行的次数和时间,和RequestAnimationFrame没有特别严格的对应关系,只可以作为参考。或者,简单一点说,每一帧被渲染的过程中,setTimetout函数很有可能被执行一次或者两次,甚至更多次。

       理论上,为了监控RequestAnimationFrame帧率,需要开发者hook RequestAnimaitonFrame这个函数,在函数每次执行完毕的时候,执行Canvas的getImageData操作,强制浏览器渲染本次RequestAnimationFrame的所有操作,计算两次渲染操作的时间差,从而得出帧率。

       幸运的是,Firefox浏览器已经开发了得到帧率的接口,可以省去很多周折。比如window.mozPaintCount这个接口,可以直接告诉开发者,浏览器渲染的帧率。

(未完待续)

接上文:HTML5 游戏开发 之 资源加载篇(2)  

HTML5 游戏开发 之 资源加载篇(1)


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何將音頻添加到我的HTML5網站上?如何將音頻添加到我的HTML5網站上?Mar 10, 2025 pm 03:01 PM

本文解釋瞭如何使用< audio>元素,包括用於格式選擇的最佳實踐(MP3,OGG Vorbis),文件優化和JavaScript控件用於播放。 它強調使用多個音頻f

如何將HTML5表單用於用戶輸入?如何將HTML5表單用於用戶輸入?Mar 10, 2025 pm 02:59 PM

本文解釋瞭如何創建和驗證HTML5表格。 它詳細介紹了>元素,輸入類型(文本,電子郵件,編號等)和屬性(必需,模式,最小,最大)。 HTML5的優勢比舊方法形成

如何使用HTML5頁面可見性API檢測頁面何時可見?如何使用HTML5頁面可見性API檢測頁面何時可見?Mar 13, 2025 pm 07:51 PM

本文討論了使用HTML5頁面可見性API來檢測頁面可見性,提高用戶體驗並優化資源使用情況。關鍵方麵包括暫停媒體,減少CPU負載以及基於可見性變化管理分析。

如何使用視口元標記來控制移動設備上的頁面縮放?如何使用視口元標記來控制移動設備上的頁面縮放?Mar 13, 2025 pm 08:00 PM

本文討論了使用視口元標記來控制移動設備上的頁面縮放,重點是寬度和初始尺度之類的設置,以獲得最佳響應和性能。

如何使用地理位置API處理用戶位置隱私和權限?如何使用地理位置API處理用戶位置隱私和權限?Mar 18, 2025 pm 02:16 PM

本文討論了使用GeOlocation API管理用戶位置隱私和權限,並強調要求權限,確保數據安全性並遵守隱私法律的最佳實踐。

如何使用HTML5和JavaScript創建互動遊戲?如何使用HTML5和JavaScript創建互動遊戲?Mar 10, 2025 pm 06:34 PM

本文使用JavaScript詳細介紹了創建Interactive HTML5遊戲。 它涵蓋了遊戲設計,HTML結構,CSS樣式,JavaScript邏輯(包括事件處理和動畫)以及音頻集成。 必需的JavaScript庫(Phaser,Pi

如何將HTML5拖放API用於交互式用戶界面?如何將HTML5拖放API用於交互式用戶界面?Mar 18, 2025 pm 02:17 PM

本文介紹瞭如何使用HTML5拖放API來創建交互式用戶界面,詳細介紹了使元素可拖動的步驟,處理關鍵事件並通過自定義反饋來增強用戶體驗。它還討論了一個常見的陷阱

如何使用HTML5 Websockets API進行客戶端和服務器之間的雙向通信?如何使用HTML5 Websockets API進行客戶端和服務器之間的雙向通信?Mar 12, 2025 pm 03:20 PM

本文解釋了HTML5 Websockets API,用於實時雙向客戶服務器通信。 它詳細詳細介紹了客戶端(JavaScript)和服務器端(Python/Flask)的實現,以應對可伸縮性,狀態管理,一個挑戰

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境