search
HomeWeb Front-endH5 TutorialHTML5游戏开发 之 资源加载篇(1)

       一) 背景介绍

       利用HTML5进行游戏开发,相比于其他语言例如Java、C++等,有很多不同,其中一个就是资源加载。本文主要对HTML5游戏资源加载的问题、原因以及解决方案,进行一些分析,试图解释以下问题:

  • 如何加载不同类型的资源


  • 如何进行批量加载


  • 如何显示加载的进度条


  • 如何存放资源


       在文章的最后,也会列举一些游戏引擎的实现方案,供大家参考。通过此篇文章,希望可以让读者对于资源加载的技术有一个全面的了解。

       二) 需要考虑的资源类型

       一般游戏需要的资源,主要包括图片、音频、视频以及二进制数据文件。如果是3D游戏,还会需要一些模型文件,例如3dmax导出的obj文件。通常的情况下,这些资源文件,少则几十兆,多则几个G。对于很多客户端游戏,这个并不是特别大的问题。通常,它们可以将这些资源打在安装包中,随着安装的过程,一次性的存放在本地。

       但是,Web游戏面临的情况比较复杂,主要有两个原因:

  • 因为所有的资源都放在云端的服务器上。


  • 浏览器为了优化网页的渲染,对于图片、音频等资源的加载,通常都是异步的。


       大家可以回想一下,在打开某些网页的时候,偶然也会看到,即使在网页显示完以后,总有一两个图片的位置是空白的,大约几秒钟以后,这些图片往往又在不经意中显示了出来。

       除了图片、音频等二进制文件,还有一类比较特殊的文件,就是Javascript文件。尤其是游戏逻辑比较庞大时,Javascript文件也可能有几百K,甚至好几兆。如果仅是根据文件的大小,这类文件似乎可以忽略不计。但是由于浏览器对于Javascript文件的处理是同步的,往往这些文件会成为性能的瓶颈。

       举个例子,当浏览器在解析网页的过程中,碰到了碰到了3f1c4e4b6b16bbbd69b2ee476dc4f83a标签,它会立即转入对3f1c4e4b6b16bbbd69b2ee476dc4f83a标签的解析,同时阻塞的等待解析的完成。如果3f1c4e4b6b16bbbd69b2ee476dc4f83a标签,带有src属性,浏览器同样是阻塞的等待下载完成。所以,有时我们抱怨网络太慢,其实是委屈了运营商,很多时候,是脚本执行占用了太长时间,阻塞了网页的显示。

       对于Javascript脚本的加载,首先要解决下载的问题,通常是伪装Javascript文件成资源文件,比如将Javascript中的脚本,作为整个字符串,放入一个JSON文件,充分发挥浏览器异步下载的能力。其次要缩短每次脚本文件解析的时间,这个最重要的就是按需“执行”,也就说要将脚本模块化。模块化是比较容易理解的,就是模仿面向对象的编程方法,将不同功能的函数放在不同的文件中。

       但是,这样做带来另外一个问题,因为Javascript没有提供类似于面向对象语言中的模块继承功能,例如,在Java中,Java虚拟机会自动的将该文件依赖的其他类,导入运行时环境。为了实现模块化,也需要为Javascript模拟一套类似的功能,幸运的是,目前已经有许多成熟的类库,例如RequireJS。因为Javascript文件的加载不属于游戏开发的专有问题,在本文中不做详细介绍。

 三) 如何加载不同类型的资源

       2.1 通过浏览器内置对象的回调接口,实现资源加载


       对于图片文件的加载,浏览器提供了方便的回调接口,比较容易实现,如下:

var image = new Image();
image.addEventListener(“success”, function(e) {
// do stuff with the image
);
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”

window.URL = window.URL || window.webkitURL;  // Take care of vendor prefixes.var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/image.png', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  if (this.status == 200) {
  var blob = this.response;
  var img = document.createElement('img');
  img.onload = function(e) {
        window.URL.revokeObjectURL(img.src); // Clean up after yourself.
  };
  img.src = window.URL.createObjectURL(blob);
  document.body.appendChild(img);
...
  }
};
xhr.send();

    利用FileSystem,将资源转换为相应的对象,代码片段如下,更多完成代码,请参考“LOADING LARGE ASSETS IN MODERN HTML5 GAMES”

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.addEventListener('load', function() {
  createDir_(root, dirname_(key).split('/'), function(dir) {
        dir.getFile(basename_(key), {create: true}, function(fileEntry) {
        fileEntry.createWriter(function(writer) {
        writer.onwrite = function(e) {
        // Save this file in the path to URL lookup table.
        lookupTable[key] = fileEntry.toURL();
        callback();
  };
  writer.onerror = failCallback;
  var bb = new BlobBuilder();
  bb.append(xhr.response);
  writer.write(bb.getBlob());
  }, failCallback);
}, failCallback);
});
});
xhr.addEventListener('error', failCallback);
xhr.send();

上面两种方式,都是在获得资源后,为资源生成一个URL地址对象,在将此地址赋给相关的对象。

       2.3 通过创建元素的方式,获得资源

       于第二种方式,相信不少读者担心不同浏览器的兼容性,毕竟里面利用了大量的HTML5新属性,而这些属性,很多属于刚刚发布的特性,每个浏览器支持的情况不太一样。所以,还需要一种可以兼容所有浏览器的方式。通过创建元素的方式,相对比较保险。参考如下代码:

var res = document.createElement(“image/audio/xxx”)
res.src = “http://www.yourdomain.com”

 但是这样的代码,也碰到了和第一个方法同样的问题,不是所有的元素都提供了onload函数。对于Image,处理相对简单。但是对于Audio/Vido,只能利用canplaythrough等函数做一些大约估计。

       总之,为了做好资源下载,可能不能完全依赖某一类方法,最有可能的方式是根据每种方法的优缺点,根据具体原因进行选择。在一些比较成熟的游戏引擎和类库的实现中,也确实是融合了这三种不同的方法。

以上就是HTML5游戏开发 之 资源加载篇(1)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
html5的div一行可以放两个吗html5的div一行可以放两个吗Apr 25, 2022 pm 05:32 PM

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别是什么html5中列表和表格的区别是什么Apr 28, 2022 pm 01:58 PM

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

html5怎么让头和尾固定不动html5怎么让头和尾固定不动Apr 25, 2022 pm 02:30 PM

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

HTML5中画布标签是什么HTML5中画布标签是什么May 18, 2022 pm 04:55 PM

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html5中不支持的标签有哪些html5中不支持的标签有哪些Mar 17, 2022 pm 05:43 PM

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

html5废弃了哪个列表标签html5废弃了哪个列表标签Jun 01, 2022 pm 06:32 PM

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

html5是什么意思html5是什么意思Apr 26, 2021 pm 03:02 PM

html5是指超文本标记语言(HTML)的第五次重大修改,即第5代HTML。HTML5是Web中核心语言HTML的规范,用户使用任何手段进行网页浏览时看到的内容原本都是HTML格式的,在浏览器中通过一些技术处理将其转换成为了可识别的信息。HTML5由不同的技术构成,其在互联网中得到了非常广泛的应用,提供更多增强网络应用的标准机。

html5为什么只需要写doctypehtml5为什么只需要写doctypeJun 07, 2022 pm 05:15 PM

因为html5不基于SGML(标准通用置标语言),不需要对DTD进行引用,但是需要doctype来规范浏览器的行为,也即按照正常的方式来运行,因此html5只需要写doctype即可。“!DOCTYPE”是一种标准通用标记语言的文档类型声明,用于告诉浏览器编写页面所用的标记的版本。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software