使用HTML5中的canvas进行图形图像.游戏.动画开发时,不需要双缓冲机制

来源:大城小胖的大城 时间:2010-04-01 12:21:00 

在开发 图像 动画 游戏 相关的程序时, 双缓冲( double-buffer )一直是程序员常用(必用)的技巧.
当然 随着各种引擎 框架的发展,以及计算机语言本身的进步 开发人员已经不需要在亲自去实现了(其实 这个实现起来也不复杂)


HTML5中的canvas 为我们使用js在浏览器中进行图形图像以及动画游戏的开发提供了基础保障, 但是它并没有高级到会自动的实现双缓冲, 不过不用担心, 因为它根本不需要双缓冲.

双缓冲最初的本意 是为了减少可见屏幕(画布)的刷新次数 避免画面闪烁.

在传统语言中 如果不使用双缓冲,执行下面的操作:

1 在可见画布上画出一个圆  //系统自动刷新并渲染可见画布
2 在可见画布上画出一个三角 //系统自动刷新并渲染可见画布
3 在可见画布上画出一个方块 //系统自动刷新并渲染可见画布

那么每一步之后 显示系统都会刷新一次"可见画布", 也就是说在短短的时间里 会刷新多次画布.

使用双缓存之后(多了一个非可见画布,也就是那个缓冲):

1 在非可见画布上画出一个圆
2 在非可见画布上画出一个三角
3 在非可见画布上画出一个方块
4 将非可见画布上的内容一次性画到可见画布上

使用双缓冲后 虽然绘画次数多了一次, 但是 实际上可见画布的刷新次数变少了 可以有效的降低画面闪烁的现象.


而在浏览器中使用canvas时, 没必要使用双缓冲, 因为系统不会在每次绘图之后都立即刷新canvas.

举个例子 伪代码.

function a(){
  for (var i=0;i<10;i++){
    // 在canvas上画一些东西
  }
}

当执行函数a时, 虽然对canvas执行了10次的绘图操作,但是并不会刷新和渲染可见画布,而只有当函数执行完成后 才会一次性的刷新并渲染出canvas上的东西.
(当然 如果你使用了setTimeout那就另当别论了)

网上有一些人用canvas写的游戏 内部实现了双缓冲, 其实完全多余的,对性能不仅没有提高 还会有一定的降低.

=================================

以上结论只针对 2010年3月23日之前的 canvas和js,  以后如果js 浏览器 canvas有什么变化 我不敢保证.

不过 即使以后js支持多线程了 支持更多NB特性了, 那么我觉得这个双缓冲也是多余的.
这个本来就应该是机器底层 操作系统甚至是硬件级别支持的, 顶层编码人员原本就不应该去关注所谓的双缓冲.

=================================

最近正在用 js 和 html5 开发一些东西,
感慨一下 Chrome之威武!
同时 在今天这样一个值得纪念的日子里
更要感慨一下Chrome的所有者之伟大!

标签:游戏,程序,双缓冲,canvas
0
投稿

猜你喜欢

  • 一文教你如何快速学会Go的struct数据类型

    2024-02-14 22:58:44
  • 详解Django 时间与时区设置问题

    2021-02-19 03:08:42
  • 在Python中操作字符串之rstrip()方法的使用

    2022-03-22 18:34:36
  • Go 语言入门之net/url 包

    2024-05-29 22:06:33
  • python爬虫之爬取笔趣阁小说

    2021-09-19 19:18:05
  • python使用原始套接字发送二层包(链路层帧)的方法

    2022-06-30 04:14:48
  • python 使用csv模块读写csv格式文件的示例

    2021-04-24 15:58:28
  • 数据库复制性能测试 推送模式性能测试

    2012-07-11 16:13:52
  • Selenium定时刷新网页的实现代码

    2021-09-30 04:01:00
  • pandas如何将datetime64[ns]转为字符串日期

    2022-06-28 13:48:37
  • Pyhon Flask框架:第一个Flask程序

    2023-01-09 16:06:34
  • pywinauto自动化操作记事本

    2021-07-19 03:01:57
  • python数据库如何连接SQLite详解

    2024-01-22 16:36:04
  • 人工智能学习Pytorch数据集分割及动量示例详解

    2021-04-29 11:28:55
  • Python3.5迭代器与生成器用法实例分析

    2022-11-03 14:50:47
  • echarts中X轴显示特定个数label并修改样式的方法详解

    2024-05-29 22:14:30
  • ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解

    2023-11-22 08:18:27
  • Django一小时写出账号密码管理系统

    2023-03-19 23:42:02
  • Python Flask框架开发之运用SocketIO实现WebSSH方法详解

    2021-11-06 01:03:33
  • 微信昵称带符号导致插入MySQL数据库时出错的解决方案

    2024-01-20 23:40:20
  • asp之家 网络编程 m.aspxhome.com