« ◆プラチナ比とカッパー比 | トップページ | canvasを使ってみる(2);しかも立体 »

HTML5/canvasを使ってみる

メモです。しかも試験中。しかも、もう少し面白味のある試験を canvasを使ってみる(2);しかも立体に置きました。

上の動画はHTML5で策定中のcanvas機能で出力しています。

残念ながら IE8にはcanvasが実装されておらず、excanvas.jsというJavascript ライブラリで機能を実現しています。そのため必ずしも十分な 速度は得られません。
IE9でcanvasが実装されましたがでIE9の機能を使うためにはmeta記述で
 http-equiv="X-UA-Compatible" content="IE=edge"
を宣言する必要があります。

IE9で互換表示モード([ツール]-[互換表示])にするとexcanvas動作で固まることが 分かりました。iframeに入れると絵こそ得られませんが固まって しまうことがないことも分かりましたので、安全のため canvasをiframeに入れています。通常はiframeに入れる 必要はありません。

現在IE9の互換表示モードではココログの画面内にcanvasを表示できませんが、 次のリンクで別窓にcanvas動画を得ることができます。 "../../../html/usecanvas_sub.htm"

canvas用のHTML記述は以下のようになっています。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
</head>
<body>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!--[if lt IE 9]>
<script type="text/javascript" src="../../../js/excanvas.js"></script>
<![endif]-->
<center> <!-- centerは不滅です -->
<canvas id="canvas1" width="480" height="270"
         style="background-color:black"></canvas>
</center>
<script type="text/javascript">
var context;
var colors=[
   "#FF0000","#00FF00","#8080FF","#FFFF00","#00FFFF","#FF00FF",
   "#FF8888","#88FF88","#8888FF","#FFFF88","#88FFFF","#FF88FF"
   ];
function Circle(){ //========= 広がる色の環クラス ===========
   this.size = 0;
   this.color= colors[Math.floor(Math.random()*1000)%colors.length];
   }
Circle.prototype.draw = function(x,y,w){ // 描画/サイズup
   context.save();    // おまじない
   context.beginPath();            // 線指定(これがないと塗りになる)
   context.strokeStyle=this.color; // 線色指定
   context.lineWidth  =w;          // 線幅指定
   context.arc(x,y,++this.size,0,Math.PI*2,false); // 円弧指定
   context.stroke();               // 線描画
   context.restore(); // おまじない
   }
function Hamon(w,h){  //========= 複数の環からなるクラス =========
   this.circles= Array();
   this.tics   = 0;
   this.x      = Math.floor(Math.random()*w);// 中心位置x
   this.y      = Math.floor(Math.random()*h);// 中心位置y
   }
Hamon.prototype.draw= function(){ // 描画/最大サイズを超えた環は消去
   if( (this.tics<20)&&(this.tics%5==0) ){ // 最初の20回の内4回で環生成
      this.circles.push(new Circle());
      }
   ++this.tics;
   for(var i=0;i<this.circles.length;++i){
      this.circles[i].draw(this.x,this.y,2);// 中心位置と幅指定で描画
      }
   while( this.circles.length>0 ){
      if( this.circles[0].size<50 ) break; // 50:環の最大サイズ
      this.circles.shift();                // 環を消去
      }
   }
var arc  = 0;
var hamons=Array();
function draw(){ // 繰り返し呼ばれ波紋を描画する関数
   context= document.getElementById('canvas1').getContext('2d');
   arc += 0.01;  // 増減周期指定:(6.26/n)/15 秒で1周期となる。0.01では約10秒
   if( (Math.random()*1000)<(Math.sin(arc)*250+300) ){//波紋生成割合制御
      hamons.push(new Hamon(480,270));
      }
   // context.clearRect(0,0,480,270); Android版ChromeではclearRectにはバグあり
   context.fillStyle="#000000";   // 背景色の黒と同じ色
   context.fillRect(0,0,480,270); // 背景色にする代わりに塗りつぶす
   for(var i=0;i<hamons.length;++i){
      hamons[i].draw();
      }
   while( hamons.length>0 ){
      if( hamons[0].circles.length!=0 ) break;
      hamons.shift();                      // 環を持たない波紋消去
      }
   }
function start(){
   //context= document.getElementById('canvas1').getContext('2d');
   setInterval(draw,67); // 指定間隔で関数呼び出し。67は1/15秒を示す
   }
try{ // load完了で関数呼び出し
   window.addEventListener("load",start(),false);
   }
catch(e){
   window.attachEvent("onload",start);
   }
</script>
</body>
</html>

iframe記述は次の様になっています。

<center><!-- centerが使えないならHTML5には反対です -->
<iframe src="../../../html/usecanvas_sub.htm" frameborder="0" 
        width="490" height="300">
</iframe>
</center>

とりあえず「canvasを使ってみた」だけです。canvasの有用な使い方からは 外れたものです。説明は近々追加。

ブラウザ毎の差が大きいので、とりあえずノートPCでのCPU使用率グラフを 載せます。考察はその内。なお、GoogleChromeは一見良い値で動いている ように見えますが、しばらく動くと、CPU100%使用でピタッと動かなくなり 少しするとまた動きだします。operaが一番安定しているようです。 Flashで同等のものを作成し動かした例も載せます。基本的にはFlashが 最も軽く安定しているようです。このような作業にはcanvasはとにかく 重く不安定というのが印象です。

ま、アニメーションはcanvasの目指すところではない、というのは分かったうえでの とりあえずです。

2012/5/22 追加
Core-i7 2600K(3.40GHz) 8G-memoryのWindows7/64bit,IE9/64bitで動かすと CPU使用率はほぼ0%となります。

Flashを用いた場合のものも載せます。このレベルだと差は殆どありませんが、 Flashの方が若干軽いかなという"印象"は受けます。

 参考 Flash版

参考までに同じ内容のFlashアニメーションを別ページ ../../../html/b342sub_flash.htm"に置きました。
ほぼ同じ規模ですがどのブラウザでも問題なく動きます。

 Android版Chromeのバグ対応 2014/1/11

残念ながらAndroid版ChromeのcanvasにはバグがありclearRectでは 背景色になりません。
黒で塗りつぶす形にしました。
HTML5で用意されるものはデタラメなものだらけです。やっぱりFlashがいい

|

« ◆プラチナ比とカッパー比 | トップページ | canvasを使ってみる(2);しかも立体 »

トラックバック


この記事へのトラックバック一覧です: HTML5/canvasを使ってみる:

« ◆プラチナ比とカッパー比 | トップページ | canvasを使ってみる(2);しかも立体 »