久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

HTML5游戲開發 之 資源加載篇(1)

利用HTML5進行游戲開發,相比于其他語言例如Java、C++等,有很多不同,其中一個就是資源加載。本文主要對HTML5游戲資源加載的問題、原因以及解決方案,進行一些分析,試圖解釋以下問
       一) 背景介紹

       利用HTML5進行游戲開發,相比于其他語言例如Java、C++等,有很多不同,其中一個就是資源加載。本文主要對HTML5游戲資源加載的問題、原因以及解決方案,進行一些分析,試圖解釋以下問題:

  • 如何加載不同類型的資源

  • 如何進行批量加載

  • 如何顯示加載的進度條

  • 如何存放資源

       在文章的最后,也會列舉一些游戲引擎的實現方案,供大家參考。通過此篇文章,希望可以讓讀者對于資源加載的技術有一個全面的了解。

       二) 需要考慮的資源類型

       一般游戲需要的資源,主要包括圖片、音頻、視頻以及二進制數據文件。如果是3D游戲,還會需要一些模型文件,例如3dmax導出的obj文件。通常的情況下,這些資源文件,少則幾十兆,多則幾個G。對于很多客戶端游戲,這個并不是特別大的問題。通常,它們可以將這些資源打在安裝包中,隨著安裝的過程,一次性的存放在本地。

       但是,Web游戲面臨的情況比較復雜,主要有兩個原因:

  • 因為所有的資源都放在云端的服務器上。

  • 瀏覽器為了優化網頁的渲染,對于圖片、音頻等資源的加載,通常都是異步的。

       大家可以回想一下,在打開某些網頁的時候,偶然也會看到,即使在網頁顯示完以后,總有一兩個圖片的位置是空白的,大約幾秒鐘以后,這些圖片往往又在不經意中顯示了出來。

       除了圖片、音頻等二進制文件,還有一類比較特殊的文件,就是Javascript文件。尤其是游戲邏輯比較龐大時,Javascript文件也可能有幾百K,甚至好幾兆。如果僅是根據文件的大小,這類文件似乎可以忽略不計。但是由于瀏覽器對于Javascript文件的處理是同步的,往往這些文件會成為性能的瓶頸。

       舉個例子,當瀏覽器在解析網頁的過程中,碰到了<script>標簽,它會立即轉入對<script>標簽的解析,同時阻塞的等待解析的完成。如果<script>標簽,帶有src屬性,瀏覽器同樣是阻塞的等待下載完成。所以,有時我們抱怨網絡太慢,其實是委屈了運營商,很多時候,是腳本執行占用了太長時間,阻塞了網頁的顯示。

       對于Javascript腳本的加載,首先要解決下載的問題,通常是偽裝Javascript文件成資源文件,比如將Javascript中的腳本,作為整個字符串,放入一個JSON文件,充分發揮瀏覽器異步下載的能力。其次要縮短每次腳本文件解析的時間,這個最重要的就是按需“執行”,也就說要將腳本模塊化。模塊化是比較容易理解的,就是模仿面向對象的編程方法,將不同功能的函數放在不同的文件中。

       但是,這樣做帶來另外一個問題,因為Javascript沒有提供類似于面向對象語言中的模塊繼承功能,例如,在Java中,Java虛擬機會自動的將該文件依賴的其他類,導入運行時環境。為了實現模塊化,也需要為Javascript模擬一套類似的功能,幸運的是,目前已經有許多成熟的類庫,例如RequireJS。因為Javascript文件的加載不屬于游戲開發的專有問題,在本文中不做詳細介紹。

       三) 如何加載不同類型的資源

       2.1 通過瀏覽器內置對象的回調接口,實現資源加載

       對于圖片文件的加載,瀏覽器提供了方便的回調接口,比較容易實現,如下:

  1. var image = new Image();
  2. image.addEventListener(“success”, function(e) {
  3. // do stuff with the image
  4. );
  5. image.src = "/some/image.png";
復制代碼

       但是比較麻煩的是,HTML并沒有提供對等的Audio、Video對象。對于Audio,雖然Web Audio API可以提供類似的功能,但是明顯學習門檻高了一些。對于Video,目前還沒有可以有效的方式,可以模擬類似的功能。對于文本、二進制等文件,更是比較麻煩。

       2.2 通過Ajax請求,實現資源加載

       利用Ajax對HTTP地址進行請求的能力,相信大家沒有任何質疑。但是,在Ajax請求到相關資源以后,如何將資源轉化為相應的圖片、音頻等對象,好像又產生了一些困難。

       但是幸運的是,目前Ajax推出了新的標準,可以支持對二進制數據的提取。再輔助目前新的數據存儲方式,比如Blob、FileSystem等,可以輕松的解決這個問題。

       利用Blob將資源轉換相應的對象,代碼片段如下,更多代碼請參考“New Trics in XHR

  1. window.URL = window.URL || window.webkitURL;  // Take care of vendor prefixes.var xhr = new XMLHttpRequest();
  2. xhr.open('GET', '/path/to/image.png', true);
  3. xhr.responseType = 'blob';
  4. xhr.onload = function(e) {
  5.   if (this.status == 200) {
  6.   var blob = this.response;
  7.   var img = document.createElement('img');
  8.   img.onload = function(e) {
  9.         window.URL.revokeObjectURL(img.src); // Clean up after yourself.
  10.   };
  11.   img.src = window.URL.createObjectURL(blob);
  12.   document.body.appendChild(img);
  13. ...
  14.   }
  15. };
  16. xhr.send();
復制代碼

       利用FileSystem,將資源轉換為相應的對象,代碼片段如下,更多完成代碼,請參考“LOADING LARGE ASSETS IN MODERN HTML5 GAMES”

  1. var xhr = new XMLHttpRequest();
  2. xhr.open('GET', url, true);
  3. xhr.responseType = 'arraybuffer';
  4. xhr.addEventListener('load', function() {
  5.   createDir_(root, dirname_(key).split('/'), function(dir) {
  6.         dir.getFile(basename_(key), {create: true}, function(fileEntry) {
  7.         fileEntry.createWriter(function(writer) {
  8.         writer.onwrite = function(e) {
  9.         // Save this file in the path to URL lookup table.
  10.         lookupTable[key] = fileEntry.toURL();
  11.         callback();
  12.   };
  13.   writer.onerror = failCallback;
  14.   var bb = new BlobBuilder();
  15.   bb.append(xhr.response);
  16.   writer.write(bb.getBlob());
  17.   }, failCallback);
  18. }, failCallback);
  19. });
  20. });
  21. xhr.addEventListener('error', failCallback);
  22. xhr.send();
復制代碼

       上面兩種方式,都是在獲得資源后,為資源生成一個URL地址對象,在將此地址賦給相關的對象。

       2.3 通過創建元素的方式,獲得資源

       于第二種方式,相信不少讀者擔心不同瀏覽器的兼容性,畢竟里面利用了大量的HTML5新屬性,而這些屬性,很多屬于剛剛發布的特性,每個瀏覽器支持的情況不太一樣。所以,還需要一種可以兼容所有瀏覽器的方式。通過創建元素的方式,相對比較保險。參考如下代碼:

  1. var res = document.createElement(“image/audio/xxx”)
  2. res.src = “http://www.yourdomain.com”
復制代碼

       但是這樣的代碼,也碰到了和第一個方法同樣的問題,不是所有的元素都提供了onload函數。對于Image,處理相對簡單。但是對于Audio/Vido,只能利用canplaythrough等函數做一些大約估計。

       總之,為了做好資源下載,可能不能完全依賴某一類方法,最有可能的方式是根據每種方法的優缺點,根據具體原因進行選擇。在一些比較成熟的游戲引擎和類庫的實現中,也確實是融合了這三種不同的方法。

(未完待續)

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

由于實際運行環境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發者能夠決定的,開發者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標簽、以及HTML5提供的對JavascriptAPI的擴展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應用的豐富,HTML5 工程師們已經不滿足于把桌面端體驗簡單移植到移動端,他們覬覦移動原生應用人性化的操作體驗,特別是原生應用與生俱來的豐富的手勢系統。HTML5 沒有提
你想要在自己網站上分享一個產品,或者是一個作品集,又或者僅僅只是一個靈感。在你發布到網上之前,你想讓它看起來有吸引力,專業,或者至少得看起來像那么回事。那么你接下
H5廣告,包括H5廣告的設計流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個講義。同時,也讓我意外的收到了非常好反饋和認!這是對我的極大鼓勵!我的
本文主要內容有:框架與組件、構建生態、開發技巧與調試、html、css與重構、native/hybrid/桌面開發、前端/H5優化、全棧/全端開發、研究實驗、數據分析與監控、其它軟技能、前端技術網
主站蜘蛛池模板: 久久国产精品偷 | 日韩电影一区二区三区 | 91精品91久久久 | 国产色黄 | 国产一区在线免费 | 荷兰欧美一级毛片 | 久久不卡| 欧美一区二区三区在线看 | 一级片片 | 成人久久18免费 | chinese中国真实乱对白 | 国产精品福利网站 | 亚洲欧美在线视频 | 国产高清视频一区 | 99久久久99久久国产片鸭王 | 在线播放一区二区三区 | 亚洲精品一区二区三区在线 | 国产91综合| 欧洲一区二区三区 | 亚洲一区二区av | 国产综合在线视频 | 国产一区 | 91天堂网| 免费午夜视频 | 中文字幕在线免费观看 | av一区二区在线观看 | 99精品免费久久久久久日本 | 成人在线一级片 | 免费一区二区三区 | 久久久久久久一区 | 天堂精品视频 | 亚洲成人自拍 | 成人免费视频网站在线观看 | 在线观看电影av | 国产精品无码专区在线观看 | 中文字幕精品一区久久久久 | 午夜激情视频 | 成人在线观看免费 | 亚洲欧美日韩精品久久亚洲区 | 黄色网毛片 | 国产免费高清 |