“单播”、“组播”和“多播”

摘自”百度了然”,我不清楚!

布朗(布朗)运动:

 

varnumDots:uint=50;
varfriction:Number=0.9;
vardots:Array;
varlife:uint=0;

functioninit(){
    graphics.lineStyle(0,0xffffff,.5);
    dots=newArray();
    for(vari:uint=0;i<numDots;i++){
        vardot:Ball=newBall(2,0x00ff00);
        dot.x=Math.random()*stage.stageWidth;
        dot.y=Math.random()*stage.stageHeight;
        dot.vx=0;
        dot.vy=0;
        dots.push(dot);
        addChild(dot);
        checkBound(dot);
    }
    addEventListener(Event.ENTER_FRAME,enterFrameHandler);
}

//检查边界
functioncheckBound(b:Ball){
    if(b.x<b.width/2){
        b.x=b.width/2;
    }
    elseif(b.x>stage.stageWidth-b.width/2){
        b.x=stage.stageWidth-b.width/2;
    }
    if(b.y<b.height/2){
        b.y=b.height/2;
    }
    elseif(b.y>stage.stageHeight-b.height/2){
        b.y=stage.stageHeight-b.height/2;
    }
}

functionenterFrameHandler(e:Event):void{
    //trace(life);
    if(life>=200){
        graphics.clear();
        graphics.lineStyle(0,0xffffff,.5);
        life=0;
    }
    for(vari:uint=0;i<numDots;i++){
        vardot:Ball=dots[i];
        graphics.moveTo(dot.x,dot.y);
        dot.vx+=Math.random()-0.5;
        dot.vy+=Math.random()-0.5;
        dot.x+=dot.vx;
        dot.y+=dot.vy;
        dot.vx*=friction;
        dot.vy*=friction;
        checkBound(dot);
        graphics.lineTo(dot.x,dot.y);
    }
    life++;
}

init();

现阶段的网络中有两种简报形式:单播、广播、组播(多播),其中的组播现身时间最晚但同时具备单播和播放的长处,最富有发展前景。

矩形分布:

一、单播:

vardotNumber:uint=500;
vardots:Array;
varcenterX:uint=stage.stageWidth/2;
varcenterY:uint=stage.stageHeight/2;
varlimitX:uint=50;
varlimitY:uint=100;

functioninit():void{
    dots=newArray();    
    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=newBall(3*Math.random(),0x00ff00);
        dot.x=centerX+(Math.random()*2-1)*limitX;
        dot.y=centerY+(Math.random()*2-1)*limitY;
        addChild(dot);      
        dots.push(dot);
    }
    addEventListener(Event.ENTER_FRAME,enterframeHandler);
}

functionenterframeHandler(e:Event):void{
    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=dots[i];
        dot.x=centerX+(Math.random()*2-1)*limitX;
        dot.y=centerY+(Math.random()*2-1)*limitY;       
        /*varix:Number=dot.x;
        variy:Number=dot.y;
        dot.y=ix;
        dot.x=iy*/
    }
}

init();

长机之间“一对一”的电视公布情势,网络中的调换机和路由器对数码只进行转载不开展复制。

圆形随机分布:

即使10个客户机必要一致的数码,则服务器要求各样传送,重复10次相同的干活。

vardotNumber:uint=500;
vardots:Array;
varcenterX:uint=stage.stageWidth/2;
varcenterY:uint=stage.stageHeight/2;
varradius:uint=75;

functioninit():void{
    dots=newArray();
    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=newBall(3*Math.random(),0x00ff00);
        varangle:Number=2*Math.random()*Math.PI;
        varr:Number=Math.random()*radius;
        dot.x=centerX+r*Math.cos(angle);
        dot.y=centerY+r*Math.sin(angle);
        addChild(dot);
        dots.push(dot);
    }
    addEventListener(Event.ENTER_FRAME,enterframeHandler);
}

functionenterframeHandler(e:Event):void{
    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=dots[i];
        varangle:Number=2*Math.random()*Math.PI;
        varr:Number=Math.random()*radius;
        dot.x=centerX+r*Math.cos(angle);
        dot.y=centerY+r*Math.sin(angle);
    }
}

init();

但鉴于其可以针对各种客户的当下响应,所以现在的网页浏览全部都是选取IP单播协议。

更均匀的圆形随机分布:

网络中的路由器和互换机根据其目的地方选取传输路径,将IP单播数据传送到其指定的目标地。

vardotNumber:uint=200;

varcenterX:uint=stage.stageWidth/2;
varcenterY:uint=100;
varradius:uint=50;

functioninit():void{

    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=newBall(2,0x00ff00);
        varangle:Number=2*Math.random()*Math.PI;        
        varr:Number=Math.random()*radius;
        dot.x=centerX+r*Math.cos(angle);
        dot.y=centerY+r*Math.sin(angle);
        addChild(dot);

    }

    //更均匀的随机分布
    for(i=0;i<dotNumber;i++){
        vardot1:Ball=newBall(2,0x00ff00);
        varangle1:Number=2*Math.random()*Math.PI;
        varr1:Number=Math.sqrt(Math.random())*radius;//关键在这里,对Math.random()取平方根后,分布变得更均匀了
        dot1.x=centerX+r1*Math.cos(angle1);
        dot1.y=centerY+200+r1*Math.sin(angle1);
        addChild(dot1);

    }

}


init();

单播的长处:

偏向分布:(即在指定的区域内,要旨岗位分布最密集,离为主越远,分布越稀疏)

  1. 服务器及时响应客户机的呼吁

  2. 服务器针对每个客户不通的请求发送不通的多寡,容易完毕个性化服务。

vardotNumber:uint=600;
varcenterX:uint=stage.stageWidth/2;
varmaxWidth:uint=75;
varballs:Array=newArray();

functioninit():void{

    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=newBall(2,0x00ff00);

        //在y轴方向上随便取二个值,然后计算平均值做为y坐标
        vary1=stage.stageHeight*Math.random();
        vary2=stage.stageHeight*Math.random();

        varty=(y1+y2)/2;

        //x轴做类似的处理
        varx1=centerX+(Math.random()*2-1)*maxWidth;
        varx2=centerX+(Math.random()*2-1)*maxWidth;

        vartx=(x1+x2)/2;


        dot.x=tx;
        dot.y=ty;

        addChild(dot);

        balls.push(dot);
    }
    stage.frameRate=1;
    addEventListener(Event.ENTER_FRAME,enterFrameHandler);
}

init();


functionenterFrameHandler(e:Event){
    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=balls[i];


        vary1=stage.stageHeight*Math.random();
        vary2=stage.stageHeight*Math.random();

        varty=(y1+y2)/2;


        varx1=centerX+(Math.random()*2-1)*maxWidth;
        varx2=centerX+(Math.random()*2-1)*maxWidth;

        vartx=(x1+x2)/2;


        dot.x=tx;
        dot.y=ty;


    }
}

单播的败笔:

反复迭代的偏袒分布(类似星云分布)

1.
服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。

vardotNumber:uint=100;
variterations:uint=6;
varballs:Array=newArray();

functioninit():void{

    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=newBall(2,0x00ff00);

        varxpos:Number=0;
        varypos:Number=0;
        for(varj:uint=0;j<iterations;j++){
            xpos+=stage.stageWidth*Math.random();
            ypos+=stage.stageHeight*Math.random();
        }

        dot.x=xpos/iterations;
        dot.y=ypos/iterations;

        addChild(dot);

        balls.push(dot);
    }

    stage.frameRate=1;
    addEventListener(Event.ENTER_FRAME,enterFrameHandler);
}

init();


functionenterFrameHandler(e:Event){
    for(vari:uint=0;i<dotNumber;i++){
        vardot:Ball=balls[i];


        varxpos:Number=0;
        varypos:Number=0;
        for(varj:uint=0;j<iterations;j++){
            xpos+=stage.stageWidth*Math.random();
            ypos+=stage.stageHeight*Math.random();
        }

        dot.x=xpos/iterations;
        dot.y=ypos/iterations;


    }
}

2.
现有的网络带宽是金字塔结构,城际省际主干带宽唯有相当于其所有用户带宽之和的5%。如若所有选取单播协议,将招致网络主干不堪重负。

提姆(Tim)er类的重绘设置:

现在的P2P应用就曾经使基本日常堵塞,只要有5%的客户在连忙使用网络,其余人就无须玩了。而将着力扩充20倍几乎是不容许。

varball:Ball=newBall();
varvx:Number=5;
vartimer=newTimer(20);

stage.frameRate=1;//设置flash动画的帧数为1帧/秒

ball.y=stage.stageHeight/2;
ball.vx=5;
addChild(ball);

timer.addEventListener(TimerEvent.TIMER,TimerHandler);

functionTimerHandler(e:TimerEvent):void{
    ball.x+=ball.vx;
    if(ball.x>stage.stageWidth+ball.width/2){
        ball.x=-ball.width/2;
    }
    e.updateAfterEvent();//事件触发后,重绘整个stage(建议大家去掉这一行,再看看效果)
}

timer.start();

 

专注:timer类的计时并不象c#中那样精确,因为跟帧速有涉嫌。

二、 广播:

 

主机之间“一对具备”的报纸发表格局,网络对其中每一台主机发出的信号都进展义诊复制并转化,所有主机都足以接过到具有音讯(不管您是或不是需求),由于其不用路径选用,所以其网络花费可以很公道。

据悉时间的动画片:

有线TV网就是名列前茅的广播型网络,大家的电视实际上是接受到拥有频道的信号,但只将一个频段的信号还原成画面。

Flash动画是依照帧的(即每进入一帧时,舞台上的靶子才会重绘,并触发Enter_Frame事件),那跟Silverlight是依照时间的陈设完全分裂。一般景色下,那也不是怎么样问题,可是那样会在不一样安顿的机械上或许爆发不一样等的播放效果,比如“一个简短的小球从左运动到右”的简易动画,即使在ENTER_FRAME事件中,用ball.x+=ball.vx来处理,在外公机上,可能swf动画只好达到每秒10帧的播放速度,而在4核的高配置机器上,能达标每秒100帧的广播速度。
问题就来了:如果ball.vx为5,则在曾祖父机上,小球最后每秒移动了5*10=50像素,而在高配置机器上,小球每秒移动了5*100=500像素,那与开发者期望的并不等同,上面的代码演示了哪些制作基于时间的卡通,最后让小球在差别配置的机器上活动速度达到相同。(注:在那或多或少上,不得不认同Silverlight的规划要优于Flash)

在数据网络中也允许广播的留存,但其被限制在二层互换机的局域网范围内,禁止广播数据通过路由器,幸免广播数据影响周边的主机。

varball:Ball=newBall();
varvx:Number=5;

stage.frameRate=100;//通常在基于时间的动画中,帧数可以设置得高一点(尽管机器最终可能达不到这个帧数.)

ball.y=stage.stageHeight/2;
ball.vx=10;
addChild(ball);

vartimer=getTimer();

addEventListener(Event.ENTER_FRAME,enterFrameHandler);

functionenterFrameHandler(e:Event):void{
    varelapsed:Number=getTimer()-timer;//计算每帧之间间隔的时间差(以毫秒为单位)

    ball.x+=(ball.vx*elapsed/1000);//将毫秒换算成秒,再乘“速度”,最终的效果即:如果帧数低,动画播放得太慢,则一次多移动一些距离;反之则少移动一些距离,起到了动态调整的目的.
    if(ball.x>stage.stageWidth+ball.width/2){
        ball.x=-ball.width/2;
    }   

    timer=getTimer();
}

播音的亮点:

世家可以尝试把上边的帧数设置,改成200或50,然后再测试下播放效果,会意识小球的移位速度是一模一样的,不受帧数的影响。(但帧数提议并非低于10,因为人眼的视觉暂留极限大约是0.1秒,低于那么些值动画看起来会很卡)

  1. 网络设施简单,维护不难,布网开支低廉

  2. 鉴于服务器不用向种种客户机单独发送数据,所以服务器流量负载极低。

除此以外,那里相比给出Silverlight的比较代码:

播音的老毛病:

usingSystem;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Interop;
usingSystem.Windows.Threading;

namespaceSilverlightApplication1
{
publicpartialclassMainPage:UserControl
{
DispatcherTimertmr;
Ballb;

publicMainPage()
{
InitializeComponent();
this.Loaded+=newRoutedEventHandler(MainPage_Loaded);
}

voidMainPage_Loaded(objectsender,RoutedEventArgse)
{
Settingssettings=Application.Current.Host.Settings;
settings.EnableFrameRateCounter=true;
settings.MaxFrameRate=1;

b=newBall();//ball是一个自定义控件,里面就一个圆
c.Children.Add(b);
b.SetValue(Canvas.LeftProperty,c.Width/2);
b.SetValue(Canvas.TopProperty,c.Height/2);

tmr=newDispatcherTimer();
tmr.Interval=newTimeSpan(0,0,0,0,20);
tmr.Tick+=newEventHandler(tmr_Tick);
tmr.Start();
}

voidtmr_Tick(objectsender,EventArgse)
{
double_left=(double)b.GetValue(Canvas.LeftProperty);
b.SetValue(Canvas.LeftProperty,_left+5);
}
}
}

1.不能针对每个客户的须求和时间及时提供个性化服务。

一律质量的小球碰撞:

  1. 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。

Flash/Flex学习笔记(43):动量守恒与能量守恒 里,大家学习了何等用AS3.0来模拟小球的运量守恒,但计算也是很复杂的,对于同一质地的碰撞,其实可以完成得更简短一些。基本原理是,五个物体沿着碰撞的线路互换它们的快慢(想追究的同窗们,可以自己去解方程验证)。那样我们在拍卖这种特殊情形时,就足以简化一部分划算,完整代码如下:(注意加★的有的)

比如无线电视机的客户端的路线扶助100个频道(假若选用数字压缩技术,理论上可以提供500个频道),固然服务商有更大的资金安顿越来越多的出殡设备、改成光纤主干,也不知所可逾越此极限。

package{

    importflash.display.Sprite;
    importflash.events.Event;
    importflash.geom.Point;

    publicclassSameMassextendsSprite{

        privatevarballs:Array;
        privatevarnumBalls:uint=8;
        privatevarbounce:Number=-1.0;

        publicfunctionSameMass(){
            init();
        }

        privatefunctioninit():void{
            balls=newArray();
            for(vari:uint=0;i<numBalls;i++){
                //varradius:Number=Math.random()*40+10;
                varradius:Number=20;//★★★★★把所有质量强制为相同
                varball:Ball=newBall(radius,Math.random()*0xffffff);
                ball.mass=radius;
                ball.x=i*100;
                ball.y=i*50;
                ball.vx=Math.random()*10-5;
                ball.vy=Math.random()*10-5;
                addChild(ball);
                balls.push(ball);
            }
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }

        privatefunctiononEnterFrame(event:Event):void{
            for(vari:uint=0;i<numBalls;i++){
                varball:Ball=balls[i];
                ball.x+=ball.vx;
                ball.y+=ball.vy;
                checkWalls(ball);
            }

            for(i=0;i<numBalls-1;i++){
                varballA:Ball=balls[i];
                for(varj:Number=i+1;j<numBalls;j++){
                    varballB:Ball=balls[j];
                    checkCollision(ballA,ballB);
                }
            }
        }


        //舞台边界检测
        functioncheckWalls(b:Ball){
            if(b.x<b.radius){
                b.x=b.radius;
                b.vx*=bounce;
            }
            elseif(b.x>stage.stageWidth-b.radius){
                b.x=stage.stageWidth-b.radius;
                b.vx*=bounce;
            }
            if(b.y<b.radius){
                b.y=b.radius;
                b.vy*=bounce;
            }
            elseif(b.y>stage.stageHeight-b.radius){
                b.y=stage.stageHeight-b.radius;
                b.vy*=bounce;
            }
        }

        privatefunctionrotate(x:Number,y:Number,sin:Number,cos:Number,reverse:Boolean):Point{
            varresult:Point=newPoint();
            if(reverse){
                result.x=x*cos+y*sin;
                result.y=y*cos-x*sin;
            }
            else{
                result.x=x*cos-y*sin;
                result.y=y*cos+x*sin;
            }
            returnresult;
        }

        privatefunctioncheckCollision(ball0:Ball,ball1:Ball):void{
            vardx:Number=ball1.x-ball0.x;
            vardy:Number=ball1.y-ball0.y;
            vardist:Number=Math.sqrt(dx*dx+dy*dy);
            if(dist<ball0.radius+ball1.radius){
                //计算角度和正余弦值
                varangle:Number=Math.atan2(dy,dx);
                varsin:Number=Math.sin(angle);
                varcos:Number=Math.cos(angle);
                //旋转ball0的位置
                varpos0:Point=newPoint(0,0);
                //旋转ball1的速度
                varpos1:Point=rotate(dx,dy,sin,cos,true);
                //旋转ball0的速度
                varvel0:Point=rotate(ball0.vx,ball0.vy,sin,cos,true);
                //旋转ball1的速度
                varvel1:Point=rotate(ball1.vx,ball1.vy,sin,cos,true);
                /*//碰撞的作用力
                varvxTotal:Number=vel0.x-vel1.x;
                vel0.x=((ball0.mass-ball1.mass)*vel0.x+2*ball1.mass*vel1.x)/(ball0.mass+ball1.mass);
                vel1.x=vxTotal+vel0.x;*/
                //★★★★★改成速度交换★★★★★
                vartemp:Point=vel0;
                vel0=vel1;
                vel1=temp;

                //更新位置
                varabsV:Number=Math.abs(vel0.x)+Math.abs(vel1.x);
                varoverlap:Number=(ball0.radius+ball1.radius)-Math.abs(pos0.x-pos1.x);
                pos0.x+=vel0.x/absV*overlap;
                pos1.x+=vel1.x/absV*overlap;
                //将位置旋转回来
                varpos0F:Object=rotate(pos0.x,pos0.y,sin,cos,false);
                varpos1F:Object=rotate(pos1.x,pos1.y,sin,cos,false);
                //将位置调整为屏幕的实际位置
                ball1.x=ball0.x+pos1F.x;
                ball1.y=ball0.y+pos1F.y;
                ball0.x=ball0.x+pos0F.x;
                ball0.y=ball0.y+pos0F.y;
                //将速度旋转回来
                varvel0F:Object=rotate(vel0.x,vel0.y,sin,cos,false);
                varvel1F:Object=rotate(vel1.x,vel1.y,sin,cos,false);
                ball0.vx=vel0F.x;
                ball0.vy=vel0F.y;
                ball1.vx=vel1F.x;
                ball1.vy=vel1F.y;
            }
        }
    }
}

也就是说无法向广大客户提供愈来愈多样化、越发个性化的劳务。

响声的接纳:

  1. 广播禁止在Internet宽带网上传输。(杨过注:那或多或少应有是本着有线电视机而言的吗?)

动静的利用其实没什么特其他,跟图片,视频等其余资源都差不多.

 

图片 1

三、组播:

如上图,在导入一个声响时,可以指定一个类名,然后在代码中,就足以new一个此类的实例了。除此之外,还是可以直接加载远程声音,完整代码如下:

长机之间“一对一组”的报导情势,也就是加盟了同一个组的主机可以承受到此组内的富有数据,网络中的沟通机和路由器只向有须要者复制并转化其所需数据。

varbgMusic=newSound(newURLRequest("http://210.51.38.234/music/sophie_zelmani_Going_Home.mp3"));
varstf:SoundTransform=newSoundTransform();
stf.volume=0.3;
bgMusic.play(0,0,stf);

varbing:Bing=newBing();
varball:Ball=newBall(30);
ball.vx=5;
ball.vy=5;
ball.x=stage.stageWidth/2;
ball.y=stage.stageHeight/2;
addChild(ball);

addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

functionEnterFrameHandler(e:Event):void{
    ball.x+=ball.vx;
    ball.y+=ball.vy;

    if(ball.x>=stage.stageWidth-ball.radius){
        ball.x=stage.stageWidth-ball.radius;
        ball.vx*=-1;
        bing.play();
    }
    elseif(ball.x<=ball.radius){
        ball.x=ball.radius;
        ball.vx*=-1;
        bing.play();
    }

    if(ball.y>=stage.stageHeight-ball.radius){
        ball.y=stage.stageHeight-ball.radius;
        ball.vy*=-1;
        bing.play();
    }
    elseif(ball.y<=ball.radius){
        ball.y=ball.radius;
        ball.vy*=-1;
        bing.play();
    }
}

主机可以向路由器请求进入或剥离某个组,网络中的路由器和交流机有采用的复制并传输数据,即只将组内数据传输给那一个参加组的主机。

AnimationinActionScript3.0/MakingThingsMove!一书终于全部啃完了,感谢小编“KeithPeters”大师写出那般好的书,感谢[FL基理文]历时六个月的用功翻译!强烈推荐给想商讨Silverlight/Flash动画的爱人们,里面的众多心想和处理格局都是卡通片编程通用的,并不局限于某一种特定的言语!“师傅领进门,修行在每人”,未来在动画编程的道路上能走多少距离,就只可以看自己的造化了。

那般既能一遍将数据传输给几个有亟待(参与组)的主机,又能确保不影响其余不须求(未加入组)的主机的别样通讯。

组播的长处:

1.
索要平等数据流的客户端插手相同的组共享一条数据流,节省了服务器的负载。具备广播所持有的长处。

2.
出于组播协议是基于接受者的内需对数码流举行复制转载,所以服务端的劳动总带宽不受客户接入端带宽的限定。

IP协议允许有2亿6千多万个(268435456)组播,所以其提供的劳务可以非凡丰盛。

  1. 此协议和单播协议一样允许在Internet宽带网上传输。

组播的毛病:

1.与单播协议比较没有纠错机制,发生丢包错包后麻烦弥补,但足以因此一定的容错机制和QOS加以弥补。

2.现行网络即便都辅助组播的传导,但在客户认证、QOS等地点还索要完善,这个弱点在争鸣上都有成熟的缓解方案,只是须要逐步推广应用到现存网络当中。