RTMFPChat(NetGroup.sendToAllNeighbors) のSpeed Test

NetGroupではpostよりsend系の方が早いよ、という話を聞いたので試してみた。
sendToAllNeighbors編

2012/05/26にRTMFP野郎の会 その1 【ハンズオンあり】があった。主催のakabanaさんのに教えてもらった。

RTMFPのNetGroupではpostでメッセージを送ることもできるが、それ以外にもsendToAllNeighbors()
sendToNearest()sendToNeighbor()がある。それぞれRTMFPの仕組みに最適化した使い分けあるみたいだけれども、とりあえず一対一での送受信に関してはどれも同じように使える。

RTMFPChat(sendToAllNeighbors) with Speed Test – wonderfl build flash online

同じLANに繋がっているPCで、同時に立ち上げてSpeed Testすると、往復の時間がわかるはず。
制作環境だと、450msec前後かかる。postだと同じ環境で1000msec以上かかるので、半分の速度になった。すぐ隣にPCを置いて動作確認をしても、「体感としてほぼ同時」と言える速度になった。

◆使い方。

0:動作確認するのは、かならず1種類ずつ(sendToAllNeighbors同士など)。
1:同じLANに繋がった、二台のPCでこのページを開く。
2:ピアアシスト設定のダイアログが出るので、二台とも許可をクリック。
3:両方のStart Connectボタンを押す。
4:自動的に、お互いを見つけに行く。接続完了。
5:どちらかのPCのSpeed Testボタンを押すと数字がでる。
この数字が、往復のミリ秒。

参考

Adobe MAX2011でRTMFPのセミナーがある。ちゃんと理解できればもっと早くする方法がわかる、かも。

Directed Routing Explained in Flash 10.1 P2P
http://www.flashrealtime.com/directed-routing-explained-flash-p2p/

RTMFP Lab に大幅に遅刻したボクが RTMFP Lab 関連のツイートをまとめてみた。
http://togetter.com/li/310222

RTMFP野郎の会行ってきた – 俺の成長日記
http://d.hatena.ne.jp/katsuren/20120527/1338072055

[sourcecode language=”as3″]
// forked from umhr’s RTMFPChat with Speed Test
package {
import com.bit101.components.*;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
import flash.net.GroupSpecifier;
import flash.net.NetConnection;
import flash.net.NetGroup;

[SWF(width = "465", height = "465", backgroundColor = "0", frameRate = "60")]
public class RTMFPChat extends Sprite{
private const GROUP_NAME:String = "RTMFPChat/SpeedTest";
private var _netConnection:NetConnection;
private var _netGroup:NetGroup;
private var _groupSpecifier:GroupSpecifier;
private var _messageTextArea:TextArea;
private var _inputTxt:InputText;
private var _speedTxt:InputText;
private var _startScreen:StartScreen;
private var _time:Number;
private var _numericStepper:NumericStepper;

public function RTMFPChat() {
//
Style.embedFonts = false;
Style.fontName = "_typewriter";
Style.fontSize = 12;
new PushButton(this, 359, 20, "Send Message", sendMsg);
_messageTextArea = new TextArea(this, 10, 50);
_messageTextArea.width = 448;
_messageTextArea.height = 250;
_inputTxt = new InputText(this, 10, 20);
_inputTxt.width = 340;
_inputTxt.height = 20;
new Label(this, 10, 0, "Send Message");

// Speed Test
new PushButton(this, 10, 310, "Speed Test", speedTest);
_speedTxt = new InputText(this, 114, 310);
_speedTxt.width = 100;
_speedTxt.height = 20;
new Label(this, 220, 310, "msec");

setFPSStepper();

// Start Screen
_startScreen = new StartScreen();
_startScreen.pushButton.addEventListener(MouseEvent.CLICK, doConnect);
addChild(_startScreen);

}

private function speedTest(event:MouseEvent):void
{
_time = new Date().time;
_netGroup.sendToAllNeighbors( { mode:"echoRequest", time:_time } );
}

private function doConnect(event:MouseEvent):void {
_startScreen.pushButton.removeEventListener(MouseEvent.CLICK, doConnect);
removeChild(_startScreen);
//
_netConnection = new NetConnection();
_netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
_netConnection.connect("rtmfp:");
}

private function netStatusHandler(event:NetStatusEvent):void {

if (event.info.code == "NetGroup.Posting.Notify" || event.info.code == "NetGroup.SendTo.Notify") {
if(event.info.message.mode == "echoRequest") {
_netGroup.post( { mode:"echoReply", time:new Date().time } );
return;
}else if (event.info.message.mode == "echoReply") {
_speedTxt.text = String(new Date().time – _time);
return;
}
}

//trace(e.target, e.info.code);
_messageTextArea.text = event.info.code + "\n" + _messageTextArea.text;
switch(event.info.code){
case "NetConnection.Connect.Success":
addNetGroup()
break;
case "NetGroup.Connect.Success":
break;
case "NetStream.Connect.Success":
break;
case "NetStream.Publish.Start":
break;
case "NetGroup.Posting.Notify":
case "NetGroup.SendTo.Notify":
_messageTextArea.text = event.info.message.text + "\n\n" +_messageTextArea.text;
break;
}
}

// NetGroup
private function addNetGroup():void{
_groupSpecifier = new GroupSpecifier(GROUP_NAME);
_groupSpecifier.routingEnabled = true;
_groupSpecifier.postingEnabled = true;
_groupSpecifier.ipMulticastMemberUpdatesEnabled = true;
_groupSpecifier.addIPMulticastAddress("225.225.0.1:30303");
_netGroup = new NetGroup(_netConnection, _groupSpecifier.groupspecWithAuthorizations());
_netGroup.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}

private function sendMsg(event:MouseEvent):void{
var message:Object = new Object();
message.text = _inputTxt.text;
message.sender = _netGroup.convertPeerIDToGroupAddress(_netConnection.nearID);
_netGroup.sendToAllNeighbors(message);
}

private function setFPSStepper():void
{
new Label(this, 320, 440, "FPS:");
_numericStepper = new NumericStepper(this, 350, 440, onNumericStepper);
_numericStepper.minimum = 1;
_numericStepper.maximum = 120;
_numericStepper.value = 60;
}

private function onNumericStepper(event:Event):void
{
stage.frameRate = int(_numericStepper.value);
}
}
}

import com.bit101.components.*;
import flash.display.Sprite;
class StartScreen extends Sprite{
public var pushButton:PushButton;
public function StartScreen(){
graphics.beginFill(0, .7);
graphics.drawRect(0, 0, 465, 465);
pushButton = new PushButton(this, 180, 230, "Start Connect", null);
new Label(this, 95, 260, "To begin, please click the connections");
}
}
[/sourcecode]

2 Comments

Comments are closed.