2010年3月アーカイブ

ピアアシストネットワークの参加ノードに対して、機能の利用を一部制限する事ができます。今回は NetGroup とパスワードの関係についてです。

パスワードの設定

ピアアシストネットワークに対するパスワードの設定には GroupSpecifier のメソッドを使います。この事から既にお察しのとおり、パスワードは NetGroup のインスタンスを生成する前に設定しておく必要があります。また、パスワードが違うと同じグループとして扱われません。この点にも注意が必要です。

下がパスワードを設定するための GroupSpecifier クラスのメソッドです。ポストとアプリケーションレベルのマルチキャストに対するパスワードを設定することができます。

// ポストのパスワード設定
public function setPostingPassword(password:String=null, salt:String=null):void
// パブリッシュのパスワード設定
public function setPublishPassword(password:String=null, salt:String=null):void
 

引数はどちらのメソッドも同じで、1 つ目がパスワードの文字列、2 つ目がパスワードの推測を難しくするための文字列 (ソルト) です。

上でも書いたように、同じネットワークに参加するためには同じパスワードを指定する必要がありますが、それに加えてソルトも同じでなければなりません。本来ソルトはパスワードの推測を難しくするためのものなので、ランダムに変えることが望ましいのですが、ランダムにした場合はソルトの値を共有する仕組みが必要になります (あたりまえですが)。 このあたりちょっと面倒なところです。

さて、以上のとおり、パスワードとソルトは、ピアアシストネットワークへの参加を制限します。ここまでだと、Web サイトへのパスワードと同じようなものだと思われるかもしれません。ですが、ここで設定するパスワードにはもう一つの使い道があります。

今回は、アプリケーションレベルマルチキャストです。

マルチキャスト用 NetStream の生成

マルチキャストは 1 対多の通信に向いた方式で、大量のデータを少ない遅延で送りたいときに使用します。遅延と信頼性のどちらを優先させるかを指定するオプションもあります。

マルチキャストを行うには、まずグループに接続します。下がそのサンプルですが、基本的に NetGroup クラスのときに説明したものと同じです。グループにマルチキャストを許可するため、GroupSpecifier.multicastEnabled に true を設定する点だけ変更してあります。

// NetConnection.Connect.Success の時に呼ばれる
private function onConnect():void {
  _groupSpecifier = new GroupSpecifier(GROUPNAME);
  // マルチキャストの許可
  _groupSpecifier.multicastEnabled = true;
  _groupSpecifier.serverChannelEnabled = true;
 
  _netGroup = new NetGroup(_netConnection, _groupSpecifier.toString());
  _netGroup.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
 

グループへの接続に成功したら、次は NetStream のインスタンスの生成です。NetStream 編 で紹介したように、2 つ目の引数には GroupSpecifier から生成したグループ識別用の文字列を使います。残りは、通常のストリーミングのときと同様です。publish() メソッドを呼ぶと送信が開始されます。

private var _netStream:NetStream;
private var _streamName = "multicaststream";
// NetGroup.Connect.Success の時に呼ばれる private function onNetGroupConnect(group:Object):void { // NetStream のインスタンス生成 _netStream = new NetStream(_netConnection, _groupSpecifier.toString()); _netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); _netStream.attachAudio(Microphone.getMicrophone()); _netStream.attachCamera(Camera.getCamera()); // パブリッシュ開始 _netStream.publish(_streamName); }

今回は、ピアアシストネットワーク内のポストの実現です。

ポストによるデータ送信

ポストは、ピアアシストネットワークの全てのノードに対してメッセージを送信する機能です。チャットのような多対多の通信に向いた通信手段です。ベストエフォート型の配信のため、メッセージの到着は必ずしも保障されません。

ポストを実行するには、NetGroup クラスの post() メソッドを実行します。

public function post(message:Object):String
 

引数には送信されるオブジェクトを渡します。このオブジェクトに適当な値を設定しておきます。

下はその 1 例です。チャット文字列と一緒にいくつかの送信者側情報を送っています。前回の記事とあわせてお使いください。

// 送信用オブジェクトの生成
var message:Object = new Object;
// データの設定
message.user = userNameText.text;
message.text = chatText.text;
message.sequence = sequenceNumber++;
message.sender = netConnection.nearID;
// post() の実行
_netGroup.post(message);
 

ポストされたデータの受信

次はメッセージの受け取り方です。

ポストされたデータが届くと、NetStatusEvent イベントが発生します。このときのコードは NetGroup.Posting.Notify です。

このコードに対する処理をイベントハンドラー内に記述します。

NetGroup クラスは Flash Player 10.1 から追加された新しいクラスです。ピアアシストネットワークを利用するためのクラスで、ストリーミングにおける NetStream と同じ位置づけになります。

ほとんどのピアアシストネットワーク関連の機能 (ポスト、オブジェクト複製、ダイレクトルーティング) には NetGroup クラスの API を経由してアクセスします。

NetGroup インスタンスの生成

では、まず NetGroup のインスタンスの生成です。下は NetGroup のコンストラクタです。

NetGroup(connection:NetConnection, groupspec:String)
 

コンストラクタの 1 つ目の引数は NetConnection のインスタンスです。ここには例えば "Stratus への接続" のように、使用するランデブーサービス (あるいは使用しない事) を指定します。2 つ目の引数は GroupSpecifier のインスタンスから生成する文字列です。この中にはグループ名や利用する機能の情報などが含まれます。

NetGroup のインスタンスを生成すると、指定されたグループ情報を使ってピアアシストネットワークへの接続が行われます。

ここで具体的な例を。下は、ポストを行うグループを形成する場合のサンプルです。onConnect() メソッド内に NetGroup に関連するコードが含まれています。後は 1 対 1 ストリーミングのときとほぼ同じです。

CS5 発表の特設サイトがオープンしています。URL は http://cs5launch.adobe.com/ です。

このサイトによると、オンラインで発表イベントが 行われるとのこと。日時は、アメリカの西海岸で 4 月 12 日の午前 8 時、日本時間では 4 月 13 日の深夜 0 時からです。通訳は、たぶんなさそうです。登録が上記サイトから行えます。

今回はピアアシストネットワークの話題です。Flash Player 10.1 の新機能ですね。

開発環境は Flash Player 10.1 対応が必要です。以下のコードを実際に試す場合は Adobe Labs のダウンロードページから Flash Player 10.1 ベータ版と Flash Builder 4 ベータ (または Flex Builder 3) 用の Player global swc をダウンロードしてお使いください。

GroupSpecifier クラス

ピアアシストネットワークを構成するには、まず GroupSpecifier のインスタンスを生成します。GroupSpecifier クラスは RTMFP のグループ名やグループの仕様を指定するためのクラスです。

下が、コンストラクタの定義です。

public function GroupSpecifier(name:String)
 

引数は 1 つで、指定するのはグループ名です。同一のグループに参加したいノードは、ここで同じ名前を指定します。

ですので、グループ名は、他のグループと区別しやすい名前にすることが重要です。できるだけ、誰が何のために使っているグループなのか、わかり易い名前にするのがよいでしょう。例えば、com.mycompany.rtmfp.demo.sample1 なんてのは使えそうです。

より確実にユニークな名前にしたいとか、ユニークな名前を考えるるのにあまり手間をかけたくない人のためには、専用のメソッドが用意されています。GroupSpecifier のインスタンスに makeUnique() メソッドを呼ぶと、かなり長めのランダムな文字列を足してくれます。下が makeUnique() メソッドの定義です。

public function makeUnique():void
 

makeUnique() を使用したときは、新しく生成されたグループの識別子を、グループに参加する他のノードに事前に渡す必要があります。安全にはなるが手間も増える、といったところでしょうか。

RTMFP でもストリームの受信ノードにデータを送ることができます。引き続き Flash Player 10 の機能の範囲です。

send() メソッド

RTMFP による P2P のストリーミングの場合でも、send() メソッドを使って受信側のメソッドを呼び出すことが可能です。その際、メソッドの引数としてデータを送信することができます。

send() メソッドは、ストリームを受信している全てのノードにデータ送信することができます。

下は send() メソッドの宣言です。

public function send(handlerName:String,   ...   arguments):void
 

1 つ目の引数が受信先で実行されるメソッドの名前です。2 つ目以降がそのメソッドに渡される引数になります。引数の数は任意です。

例えば、送信側では以下のようなコードを実行するとします。

_sendStream.send("sayHello", _netConnection.nearID);
 

この場合は、ストリームを受信している全てのノードに対し、sayHello() というメソッドを送信側のノード ID を引数として呼びだす、という指示になります。

受信ノードの設定

send() メソッドは、受信ノードの NetStream インスタンスの client 属性に設定されているオブジェクトのメソッドを実行します。onPeerConnect() メソッドの場合 (このときは送信側でしたが) と同じ構造です。

そのため、受信側ではオブジェクトに必要なメソッドを定義してから client 属性に設定しておきます。このオブジェクトに一致する名前のメソッドが定義されていないと何も起きません。

下のサンプルでは、sayHello() というメソッドを定義したオブジェクトを、NetStream オブジェクトの client 属性に設定しています。

3 月 16 日に開催された Adobe Flash Platform Camp Tokyo の期間限定ストリーミングが 3 月 24 日提供される事になりました。(http://adobefpc.jp/

ライムライト・ネットワークス・ジャパン株式会社様のご好意により、当日の全セッションが CDN サービス 「LimelightSTREAM On-demand」 として提供されるそうです。見逃していた方は是非この機会にどうぞ。

期間限定での提供となりますので、アクセスはお早めに。最大2週間、容量が上限に達し次第終了になるとのことです。

Flex Data Visualization コンポーネントのオープンソース化

一つ書き忘れてました。10 日前から、Flex Data Visialization コンポーネントがオープンソース化されています。

これにより、AdvancedDataGrid, OLAPDataGrid といったコンポーネントや、BarChart, PieChart 等のチャートコンポーネントも、無償の Flex SDK の一部になってます。ということで、Flex Builder Professional のライセンスが無くても、Data Visialization コンポーネントを使う事ができるようになりました。

Flex 4 SDK のリリース版は、既にオープンソース化された Data Visualization コンポーネントも含めて配布されています。Flex 3 SDK もそのうち更新される (たぶん) と思います。

Flash Builder 4 と同時に Flex 4 SDK のリリース版も公開されました。Adobe サイトからダウンロードできます。(Download Adobe Flex 4 SDK) もちろんオープンソースサイトからもダウンロードできます。(Gumbo Downloads

Flex 4 SDK では Spark と呼ばれる新しい UI コンポーネントアーキテクチャーが採用されました。主なポイントは以下のとおりです。

  • UI コンポーネントの View と Logic を分離、デザイナーと開発者の協業をより効果的に
  • 新しいアニメーションエンジンの採用、パフォーマンスの向上、より多彩なエフェクトの使い方
  • 強化されたレイアウト機能、コンテナとレイアウトの分離
  • FXG と MXML グラフィックスの採用、デザインツールと直接データ交換
  • 約 30 の新しいコンポーネントやプリミティブ (Group, Panel, Button, Label, etc.)
  • Flex 3 のコンポーネントとの共存が可能

また、ステートも新しく使いやすく設計しなおされました。これによって Flash Builder 4 のステートをサポートする機能も向上しています。

開発者向けには、

  • コンパイラのパフォーマンス向上
  • MXML ドキュメントの ASDoc サポート
  • 双方向バインディング
  • CSS セレクター
  • OSMF ベースのビデオコンポーネント
  • SWFObject ベースの HTML テンプレート

等の新機能が提供されています。

Flash Player 10 の新しいテキストエンジンと TLF の統合も行われています。まだ、一部のコンポーネント限定で、機能も制限されますが、今後のアップデートで順次強化される予定とのことです。

より詳しい情報が Flex デベロッパーセンターに掲載されています。こちらもご覧ください。

Flash Builder 4 が発表されました。(Adobe Flash Builder 4) また、ColdFusion Builder も発表されました。(Adobe ColdFusion Builder) どちらもアドビストアから購入可能です。

今回の Flash Builder 4 は Premium Edition と Standard Edition の 2 本立てです。Edition 間の主な違いは、テスト関連機能 (プロファイラー、FlexUnit サポートなど) のサポートです。詳しいバージョン間の比較はこちらのページ (アップグレード情報) をご覧ください。

Flash Builder 4 の主な新機能は、

  • データ中心型の開発サポート
  • ネットワークモニター (Premium のみ)
  • コマンドラインビルド (Premium のみ)
  • FlexUnit の統合 (Premium のみ)
  • コード (アクセサー、イベントハンドラー) の自動生成
  • ASDoc 統合
  • Flash Professional とのワークフロー
  • テーマブラウザー

強化された機能は、

  • リファクタリング
  • デバッガー
  • プロファイラー
  • ビジュアルレイアウト
  • スキン/スタイル編集
  • ビジュアルレイアウト機能

などなど盛りだくさんです。コンパイルが早くなったのも嬉しいところです。Flash Catalyst との連携機能も楽しみですね。

Flash Builder 4 は体験版が公開されています。(Flash Builder 4 体験版

それから、Flash Platform 向けのソーシャルネットワークサービスも発表されました。(Social Service - US サイト) これは、Facebook、Twitter、MySpace 等のサービスに、同じキー同じ API で接続できるというサービスです。サービスごとにキーの入手とコードのメンテをする必要がなくなります。

このサービスは Adobe と Gigya が共同で提供します。

既に会場やストリーミング等でご覧になった方も多いと思いますが、先日の Flash Camp Tokyo では、いろいろと興味深いセッションがありました。

その中の、アドビのエバンジェリスト 2 人のセッションから Flash CS5 関連の情報を簡単にまとめておきます。画像がないので分かりにくいかとは思いますが。

昨日のセッションは全て同時通訳付で Adobe TV にも公開される予定とのことです。見逃した方、もう一回見たい方はお楽しみに。

1. Flash CS5 と Flash Builder 4 の新機能 by Lee Brinelow

  • デコツール: ブラシを使ってパターンを描画。パターンは最初から提供されているものに加えて、JavaScript を使って自分で作ることが可能
  • コードスニペット: よく使われるコードのスニペットをオブジェクトに貼り付けたりエディタに書き出したり。基本的な動作は記述済みの状態からコーディングを始めることができるためスクリプト初心者でも取っ掛かり安い。
  • TLF: 高機能な新しいテキストライブラリ。縦書きサポート、多段カラムの指定など。TLF テキスト用の新しいプロパティパネルの追加。複数のテキストブロックを繋げて一つの文章の表示領域として使用することが可能。
  • ビデオ: ステージ上でもビデオを再生することが可能に。それにあわせてオーサリング環境にキューポイントの設定パネルを新設。
  • XFL: .fla に加えて新しく追加されたファイルフォーマット。.fla はバイナリだったが、XFL では基本的にテキスト (XML) ベースになる。そのため、ソース管理システムでバージョン管理しやすい。アセット等も個々にファイルとして扱え、Flash Professional CS5 で編集中にイメージの一つを Photoshop で更新することも可能。
  • Flash Builder の統合: Flash Builder とのラウンドトリップが可能に。Flash Builder を ActionScript のエディタとしてより使いやすく。
  • FXG: ステージで描画したグラフィックスを FXG という XML フォーマットで書き出せる。このタグは、Flex アプリケーションの MXML 内にそのまま埋め込んで使用できる。FXG は Illustrator 等でもサポートされる Adobe CS 内でのグラフィック交換フォーマットとして使用される。

2. Adobe Flash CS5 を使用した iPhone アプリケーション開発 by Mike Chambers

Flash CS5 を使用して作成された iPhone アプリケーションの紹介と、Packager for iPhone を使った iPhone アプリケーションの開発時におけるパフォーマンス上の考慮点についての説明。

主な内容は、

RTMFP ストリームに対するアクセス制御についての話題です。今回も Flash Player 10 の開発環境があれば大丈夫です。

ストリームへのアクセス制御

Strutas には個々のノードを認証する仕組みがありません。そのため、ノード ID (と開発者キー) が分かってしまえば誰でもパブリッシュ中のストリームを受信できてしまいそうです。。。

このような場合、送信しているノード内に、他のノードからのアクセスを制御する機能を持ちたくなるかもしれません。ということで、NetStream には P2P ストリームへの接続要求に対するロジックを記述する手段が提供されています。

これによって、Strutas のように認証の仕組みが無いランデブーサービスを利用していても、別の認証サービスを併用して接続可否を判断することが可能になります。例えば、事前に認証サービスに登録されている farID 以外からのリクエストは受け付けないように、とかいう使い方ができます。

onPeerConnect() メソッド

ストリームに対するアクセス制御を実現する手段として NetStream に追加されたメソッドが onPeerConnect() です。

onPeerConnect() は、他のノードからの接続要求があると、実際の接続が行なわれる前に呼び出されます。そのため、アクセス許可の判断がまだ間に合うというわけです。もちろん、他の目的に使うこともできるかもですが。

onPeerConnect() の定義は下のとおりです。戻り値は Boolean で、true を返すと接続許可 false だと接続拒否の指示になります。

public function onPeerConnect(subscriber:NetStream):Boolean
 

引数には、接続要求をしているノードの NetStream オブジェクトが渡されます。NetStream には、相手 RTMFP ノードの ID を保持する属性 farID が追加されているので、認証に使えそうです。

NetStream.farID:String  [参照のみ] 
 

ちなみに NetStream には nearID 属性はありません。

下は onPeerConnect() メソッドをごくごく単純してみたサンプルです。

NetConnection 編の続きです。今回も Flash Player 10 に対応した開発環境があればお試しいただけます。

前回は、RTMFP ノードから Stratus に接続するところまででした。今回は、ノード間で 1 対 1 のストリーミングを行うため、NetStream クラスを使って RTMFP ノード同士を接続します。

NetStream インスタンス生成

では、まず NetStream のインスタンスを生成します。

下は NetStream のコンストラクタです。RTMFP に対応するため、NetStream のコンストラクタには 2 つ目の引数ができました。この引数は Flash Player 10 以降で有効です。また、プロトコルが RTMP の時には無視されます。

NetStream(connection:NetConnection,   peerID:String = "connectToFMS")
 

現在 2 つ目の引数には、以下の 4 種類のオプションが指定できます。

  • NetStream.CONNECT_TO_FMS: FMS への接続
  • NetStream.DIRECT_CONNECTIONS: P2P でのストリーム直接配信
  • 他のクライアントの ID (NetConnection.nearID): 指定したクライアントからのストリーム受信
  • グループ ID: グループへのマルチキャスト (このオプションについては別の機会に説明します)

指定を省略したときのデフォルト値は NetStream.CONNECT_TO_FMS (FMS への接続) です。ですので、クライアント間で直接 1 対 1 のストリーミングを行うときは、必ず 2 つ目の引数を明示的に指定します。その際、指定する値はパブリッシュする側と受信する側で異なります。

以下、送信する側、受信する側、それぞれについて説明します。

RTMFP 上の 1 対 1 のストリーミングのコーディング例を紹介します。今までに RTMP を使ったストリーミングのコードを書いたことがあれば、RTMFP の 1 対 1 接続のストリーミングの実装は簡単です。コードの基本は同じですので。

今回のコードは、Flash Player 10 に対応した開発環境 (Flash Professional CS4, Flex Builder 3) があれば試せます。

以下の記事では、ランデブーサービスとして Stratus を使うことを前提としています。そこで、まずは Stratus を利用するための準備をします。

Stratus への接続準備

Stratus のサービスを使うには Stratus の開発者キーが必要です。開発者キーは Adobe Labs に取得用の専用ページ (Stratas Developer Key Download) が用意されていますので、そこから入手してください。(Adobe ID が必要です)

入手した開発者キーは "rtmfp://stratus.adobe.com/" の後ろに追加して、それを接続先 URL として使用します。そのため、開発者ごとに独立したサービスが提供できます。

なお、Stratus への接続はあくまで仲介サービスを利用するためです。Stratus とストリーミング用のセッションを張るためではありません。

NetConnection インスタンスの生成

まず Stratus へ接続するために NetConnection のインスタンスを生成します。

private var _netConnection:NetConnection = new NetConnection();
 

次に connect() メソッドを使って Stratus に接続します。

public function connect(command:String, ...  arguments):void
 

connect() メソッドは RTMFP 用に機能が拡張されています。関数の形式は変わっていませんが、プロトコルに "rtmfp:" を指定できるようになっています。

Stratus に接続する場合は、上でも説明したように "rtmfp://stratus.adobe.com/xxxxxxxx-xxxx" が (xxxxxxxx-xxxx は開発者キー) 引数となります。ちなみに、URL の後にインスタンス名を足して "rtmfp://stratus.adobe.com/xxxxxxxx-xxxx/room1" のようにしても無視されます。

サーバー通信を行わずに IP マルチキャストにより通信相手を見つける場合は、引数に "rtmfp:" を指定します。ただし、このオプションは今回の 1 対 1 ストリーミングでは使用できません。

RTMFP に関して Flash Player 10.1 からの大きな違いは "グループ" のサポートです。

Flash Player 10 では、(何らかの仕組みを構築しない限り) 配信したい全てのノード (Flash Player が実行されているマシン) に個別に接続する必要がありました。例えば、相手が 10 台なら 10 セッション、20 台なら 20 セッションという具合です。

これに対して、Flash Player 10.1 からは、複数のノードの集合、すなわち "グループ" に対して接続することができます。一旦グループに接続されれば、グループ内全てのノードに対して配信することができます。最近公開された Stratus ベータ 2 には、この変更にあわせグループへの仲介機能が追加されています。

さて、このグループは、ただのノードの集まりではありません。

グループは参加しているノード間で仮想のネットワーク (いわゆるオーバーレイネットワーク) を自律的に構築し、更に、経路情報の共有、最適な配信経路の判断、トポロジーの最適化等も行います。

難しいことは考えなくても、"グループ" が勝手に数千万ユーザー規模でも使える P2P ネットワークを構築してくれる (公称) ということです。お蔭で RTMFP アプリケーションの使い道もずいぶん広がったように思います。

グループが構成する仮想ネットワークはピアアシストネットワーク (Peer-Assisted Network) と呼ばれます。

グループはピアアシストネットワーク内で、データを配信するための手段をいくつか提供します。以下、ごく簡単に説明を。

RTMFP の続きです。今回は、RTMFP の接続の仕組みと Stratus の簡単な説明です。

RTMFP の接続

到達可能な IP ネットワークにさえつながっていれば、P2P の接続に必要なのは、通信相手の IP アドレスだけです。(ポート番号も要りますね)

ただ、P2P ではどのように相手の IP アドレスを知るか、ということが大きなポイントになります。大抵のクライアントには DNS 経由でたどり着くことは現実的でないですし、また、そもそもクライアントの IP アドレスは固定されているとは限りません。。。

そこで RTMFP では以下のような手順で接続が行われます。(前回書いたように RTMFP クライアントには識別用のユニークな ID が割り振られています)

  1. 通信したいクライアントの ID を取得
  2. 取得した ID に該当するクライアントの IP アドレスを取得
  3. 取得した IP アドレスに対して接続要求を送信

見てのとおり、このステップの実現には 2 つの壁があります。"クライアント ID の取得" と、その "ID に対応する IP アドレスの取得" です。

1 つ目の "相手クライアント ID の取得" については、その仕組みが RTMFP の中では用意されていません。FMS のサーバーサイド ActionScript を使うなどして別途提供する必要があります。(Flash Player 10.1 からはオーバーレイネットワークの導入によりこの手間は緩和されています)

2 つ目の "ID に対応する IP アドレスの取得" については、どこかでクライアント ID と IP アドレスの対応表を管理する必要があるのですが、RTMFP ではこれをサーバーに持たせることになっています (いわゆるハイブリッド P2P)。

そこで Stratus や FMS の登場となるわけです。

RTMFP (Real Time Media Flow Protocol) は Flash Player 10 から追加された新しいプロトコルで、Flash Platform 上での P2P の通信を実現します。Flash Player 10.1 では、この RTMFP の機能が拡張されています。

P2P といっても何種類かの通信型がありますが、Flash Player 10 の (つまり最初に公開された時点での) RTMFP は 1 対 1 通信型のアプリケーション用です。通信する相手それぞれと専用のセッションを張る必要がありました。

これが Flash Player 10.1 では "動的なノードのグループ化によるオーバーレイネットワーク" のサポートにより、"誰" と通信しているかは意識する必要がなくなっています。(基本的にどのグループに属しているかだけ知っていればよい) これにより、多数のノードとの通信が簡単かつ効率的になり、アプリケーションレベルのライブマルチキャスト (データの一斉配信) やスウォーミング (ファイルを複数のノードから同時にダウンロード) それから分散ハッシュテーブル (DHT) 型の分散データ管理も実現できるようになりました。

開発チームによるとスケーラビリティは非常に高く、数百万ユーザ規模でも数秒程度の遅延で情報共有が可能とのことです。(どうやって確認したのか聞いてみたいところではありますが)

また、オーバーレイネットワークとトランスポート層のマルチキャストとの併用もサポートされていて、これにより同一 LAN 内 (IP マルチキャスト可能な範囲) であれば、Flash Player だけで (サーバー無しで) P2P ネットワーク網を構築することができます。

RTMP と RTMFP

RTMP は Flash Player 6 からサポートされているリアルタイム通信用のプロトコルです。RTMP と RTMFP は名前こそ似ていますが (用途も一部被りますが)、かなり正確の異なるプロトコルです。

主な違いは、

  1. RTMP はクライアント/サーバー型、RTMFP は P2P 型
  2. RTMP は TCP ベース、RTMFP は UDP ベース
  3. RTMP は通信中の IP アドレスが固定、RTMFP は IP アドレスが変わっても継続して通信可 (IP モビリティを持つ)

などです。

以下それぞれもう少し詳しく説明します。

デバイス向けのコンテンツを開発するときは、少なくとも当面の間はデスクトップ向けのコンテンツよりも軽くする努力が必要になりそうです。その際、例えば:

  • フレームレートを出来るだけ遅くする
  • タイマーの多重利用を避ける
  • コールバックの処理は軽く
  • 可能なものは MovieClip ではなく Graphics にする

などは分かりやすい最適化かもしれませんが、

  • ベクター描画よりもビットマップ

は、今までの感覚とは違うところかもしれません。

(将来の Flash Player では新しい最適化機能 & API が提供されて、ベクターでも大丈夫ってことになるかもしれませんけれど)

DisplayObject.cacheAsBitmap を使った最適化

cacheAsBitmap に true を設定すると実行時に DisplayObject をビットマップ化することが出来ます。複雑なベクターデータの描画を纏められるため、複雑な図形ほど描画パフォーマンスを向上させることが出来ます。

デバイス上ではこれによる高速化は特に効いてくるところなのですが、

  • もし DisplayObject がそもそも変化しないものであれば、ビットマップデータを使用したほうがより効果的
  • 頻繁に変化する DisplayObject に対して cacheAsBitmap = true をセットすると、ビットマップ化のオーバーヘッドにより逆効果になることも

という点もあります。ご参考まで。

ビットマップの使用とミップマッピング

改めて書くほどのことでもないですけれど、ビットマップを使うときは、予め小さく軽くしたものを使用して、出来るだけ実行時に縮小するといったことの無いようにします。

もし、実行時にビットマップを縮小する必要がある場合は、可能であればビットマップの大きさをミットマッピングが出来る大きさにすることが望ましいとされています。ミットマッピングは Flash Player 9 から追加されている機能で、ビットマップを描画する際の品質とパフォーマンスを向上するものです。品質に関してはこちらのデモが分かりやすいかもです。

Flash Player に搭載されているミップマッピングは box filtering と言われる一番単純なものです。PNG, JPEG 等の静的なビットマップにのみ適用され、実行時に cacheAsBitmap の指定により作られるビットマップには適用されません。詳しくは ActionScript のヘルプをご覧ください。(Adobe ActionScript 3.0 * ミップマッピングの利用

Mip マップを有効に活用するには、画像の幅と高さを 2 で何回も割れる数値にします。例えば、512 × 256 は非常にミップマッピング向きですが、510 × 256 はそうでもありません (一度しか割れないので)。

デバイスは機種により PPI が大きく異なります。例えば Experia X10 のインチあたりのピクセル数は iPhone 3GS のほぼ倍、そのため同じ画像でも Experia X10 では iPhone 3GS の半分程度の大きさで表示されることになります。

デバイス向けコンテンツでは、同じ画像を縮小率を変えながら使いまわすケースも多くなるかもしれません。心に留めておくと少しは役に立つことがあるかもです。

引き続き Flash Player 10.1 のハードウェア描画機能の話題です。今回は GPU によるグラフィックス描画機能について。

Flash Player 10.1 は、OpenGL ES 2.0 をサポートする "デバイス" 上で、全てのグラフィック要素 (Pixel Bender シェーダを除く) を GPU を使って描画します。この機能はデバイス限定で、デスクトップ OS 用の Flash Player 10.1 は従来どおりソフトウェアによる描画処理を行います。将来はデスクトップでも GPU 描画がサポートされる予定です。

Flash Player 10 との違い

Flash Player 10 にも GPU を利用する機能があります。これは、Flash Player がソフトウェアにより個々のグラフィック要素の描画を行い、GPU がそれらを合成するというもので、wmode=gpu の指定をすると有効になります。パフォーマンスに関しては、早くなるケースがあれば遅くなるケースもあるという感じでした。

一方、Flash Player 10.1 での GPU サポートは、合成だけでなくグラフィックスの描画自体も GPU で行うものです (描画される対象は、ベクター・ビットマップ・ビデオ・テキスト・フィルター等全般)。 "最適化された" コンテンツであれば相当なパフォーマンスが改善が期待できることになっています。

Flash Player 10.1 の GPU 描画機能は、サポートされる環境であれば自動的にオンになるため、明示的に wmode=gpu を指定する必要はありません。但し、wmode=opaque や wmode=transparent を指定すると自動的に GPU 描画機能はオフになり、ソフトウェアによる描画が行われます。

GPU 描画の特徴について

ソフトウェアによる描画と違い、GPU による描画は 100% のピクセル精度を持っていません。これは、GPU がベクターグラフィックスの描画を行う際に、グラフィックの形状を小さな 3 角形のメッシュに分割 (テセレーション - tessellation: もともとはモザイク模様にするという意味 - と呼ばれる処理です) してから描画することによります。Flash Player 10.1 では、デスクトップでは引き続きソフトウェアによる描画が行われますので、デバイス用の Player が "公開されたら" 注意して比較してみてください。

それから、デバイス上では、パフォーマンス向上のため画質のデフォルト値が "中" になるようで、この点もテスト時には注意が必要そうです。一般的にデバイスはデスクトップ機のディスプレイよりもピクセル密度が高いため、"高" 画質でなくてもあまり気にならないことが多いのではないかと予測されます。iPad (Flash Player 載る予定無いみたいですけど Packager for iPhone があるのでいちおう) は ppi が低めなので辛いかもしれません。

あとは、GPU では忠実に再現されないブレンドモードがあります。細かい表示まで気にする場合は、"標準" と "アルファ" 以外は避けた方がよいようです。特に "レイヤー" はパフォーマンスにも影響します。

また、今回のバージョンでは Pixel Bender のハードウェアによる描画がサポートされないため、Pixel Bender で描いた領域が黒い四角になってしまったりとかするようです。これも将来の Flash Player 待ちということになっています。

。。。などなど、GPU 描画 (つまりデバイス上の描画) は、今まで見慣れていたものと違う箇所が散見されることになりそうです。従来のソフトウェア描画とはロジックがまったく異なるため、ある程度の割り切りは必要そうですね。

現在ベータ 3 が公開中の Flash Player 10.1 (Flash Player 10.1@Labs) ですが、新しく追加された機能の一つに 「ハードウェアを利用した描画処理」 があります。

これは、グラフィック描画関連処理の高速化と、必要なリソースや消費電力の削減を目的としたものです。具体的に、新しいハードウェアによる描画機能には、以下の 2 つ

  1. H.264 ビデオのハードウェアによるデコード
  2. GPU によるグラフィックスの描画

が含まれています。今回は 1 つ目の H.264 ビデオのデコード機能についてのまとめです。

従来、Flash ビデオにとって H.264 は品質が高い一方デコードが重たくなりがちという難点がありました。が、Flash Player 10.1 では GPU 等のハードウェア機能を使ったデコードができるため、CPU に負荷をかけず且つ高速に H.264 ビデオ再生が可能になるというものです。

スマートフォンやネットブックなどの非力な環境では特にありがたい機能になりそうです。

サポートされる環境

まず、ハードウェアを使った H.264 ビデオのデコードは全ての環境でサポートされるわけではありません。

特定のハードウェアに適切なドライバーが組み合わされた環境でのみ正しく動作します。サポートされるハードウェアのリストはベータ版のリリースノート (Flash Player 10.1 public beta release notes) をご覧ください。この記事の最後にもコピペしておきます。

ベータ版の Flash Player 10.1 はドライバーのバージョンチェックを行わない (つまりサポートされない環境でもハードウェアデコードを行ってしまう) ため、環境によっては Youtube を見ようとした瞬間にブラウザが落ちる、といったことが起きる可能性があります。その場合、そもそもハードウェアがサポートされない古い PC をお使いであれば、とりあえずコンテキストメニューから設定パネルを開いて "ディスプレイ" タブ内のチェックをオフにしておきましょう。

(Flash Player 10.1 の正規版では、正しいドライバがインストールされているかをちゃんと確認した後でハードウェアを使ったデコードを行うそうです。ですのでこの件はベータ版だけでの注意事項ということです)

一方、ハードウェアデコードがサポートされる環境のはずなのに再生された映像が怪しいという場合はバグかもしれません。こちらの PDF (Instructions for reporting video bugs) を参考にバグレポート (英語しか受け付けて貰えないようですが) を急いで送りましょう。

なお Flash Player 10.1 では、Mac OS X と Linux 版でのハードウェアデコードはサポートされません。Linux 上では必要な API の標準がまだ確立されていないため、OS X 上では必要な API の利用方法が公開されていないため、が理由との事。将来のバージョンでのサポートは引き続き検討される、だそうです。

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261