SlideShare a Scribd company logo
1 of 60
The Next Step in 
AS3 Framework 
Evolution
02.2013
About me
Senior AS3 Developer
Working with Flash from 2001
Author of open source AS3 framework – mvcExpress
Twitter : @Deril
About this presentation
● AS3 framework evolution
● Modular programming in mvcExpress
● mvcExpress live
AS3 framework 
evolution
AS3 framework history
●
PureMVC (2006)
●
Cairngorm (2007?) [flex only]
●
Springactionscript (2007)
●
Parsley(2008)
●
Mate(2008) [flex only]
●
Robotlegs(2009)
●
Swiz(2009) [flex only]
●
MvcExpress(2012)
●
Robotlegs 2 (2012) (in beta)
(ActionScript 3.0 released in 2006)
AS3 framework history
●
PureMVC (2006)
●
Cairngorm (2007?) [flex only]
●
Springactionscript (2007)
●
Parsley(2008)
●
Mate(2008) [flex only]
●
Robotlegs(2009)
●
Swiz(2009) [flex only]
●
MvcExpress(2012)
●
Robotlegs 2 (2012) (in beta)
(ActionScript 3.0 released in 2006)
PureMVC
●
Organize your code is small units
●
Let those units communication
●
Standardize your code
●
Focus on app instead of
architecture
●
Ported to many languages
●
Slightly hurts performance
●
Built on static classes
●
Lot of boilerplate code
Can't it be done simpler?
The good The bad
The good The bad
robotlegs
●
All PureMVC goodness.
●
Removed most boilerplate
code
●
Introduces dependency
injection
●
Hurts performance a lot!
Can't it be done simpler...
and run fast?
The good The bad
robotlegs 2 (beta)
●
Highly configurable
●
Modular
●
Guards ,hooks, rules.
●
Adds some boilerplate code
●
Code less standardized
●
Hurts performance a lot
(and more)
I meant faster! Not slower...
The good The bad
mvcExpress
●
All PureMVC and robotlegs
goodness.
●
Focus on modular
development
●
Simplifies code even more
●
Hurts performance the least
●
Young framework
Simplest and fastest MVC framework!
package {
public class PureMvcMediator extends Mediator implements IMediator {
public static const NAME:String = "PureMvcMediator";
public function PureMvcMediator(initViewComponent:ViewComponent) {
super(NAME, initViewComponent);
}
// cast view for convenient local use.
public function get view():ViewComponent {
return super.getViewComponent() as ViewComponent;
}
// listen for framework notices
override public function listNotificationInterests():Array {
return [ //
DataNote.STUFF_DONE //
];
}
// handle framework events
override public function handleNotification(notice:INotification):void {
switch (notice.getName()) {
case DataNote.STUFF_DONE:
// do stuff…
break;
}
}}
pureMVC mediator
package {
public class PureMvcMediator extends Mediator implements IMediator {
public static const NAME:String = "PureMvcMediator";
public function PureMvcMediator(initViewComponent:ViewComponent) {
super(NAME, initViewComponent);
}
// cast view for convenient local use.
public function get view():ViewComponent {
return super.getViewComponent() as ViewComponent;
}
// listen for framework notices
override public function listNotificationInterests():Array {
return [ //
DataNote.STUFF_DONE //
];
}
// handle framework events
override public function handleNotification(notice:INotification):void {
switch (notice.getName()) {
case DataNote.STUFF_DONE:
// do stuff…
break;
}
}}
pureMVC mediator
package {
public class PureMvcMediator extends Mediator implements IMediator {
public static const NAME:String = "PureMvcMediator";
public function PureMvcMediator(initViewComponent:ViewComponent) {
super(NAME, initViewComponent);
}
// cast view for convenient local use.
public function get view():ViewComponent {
return super.getViewComponent() as ViewComponent;
}
// listen for framework notices
override public function listNotificationInterests():Array {
return [ //
DataNote.STUFF_DONE //
];
}
// handle framework events
override public function handleNotification(notice:INotification):void {
switch (notice.getName()) {
case DataNote.STUFF_DONE:
// do stuff…
break;
}
}}
pureMVC mediator
package {
public class PureMvcMediator extends Mediator implements IMediator {
public static const NAME:String = "PureMvcMediator";
public function PureMvcMediator(initViewComponent:ViewComponent) {
super(NAME, initViewComponent);
}
// cast view for convenient local use.
public function get view():ViewComponent {
return super.getViewComponent() as ViewComponent;
}
// listen for framework notices
override public function listNotificationInterests():Array {
return [ //
DataNote.STUFF_DONE //
];
}
// handle framework events
override public function handleNotification(notice:INotification):void {
switch (notice.getName()) {
case DataNote.STUFF_DONE:
// do stuff…
break;
}
}}
pureMVC mediator
package {
public class MvcExpressMediator extends Mediator {
[Inject]
public var view:ViewComponent;
override public function onRegister():void {
// listen for framework events
addHandler(DataMessage.STUFF_DONE, handleStuffDone);
}
// handle framework events
private function handleStuffDone(params:DataChangeParamsVO):void {
view.showStuff(params.dataParam1);
}
}}
mvcExress mediator
package {
public class MvcExpressMediator extends Mediator {
[Inject]
public var view:ViewComponent;
override public function onRegister():void {
// listen for framework events
addHandler(DataMessage.STUFF_DONE, handleStuffDone);
}
// handle framework events
private function handleStuffDone(params:DataChangeParamsVO):void {
view.showStuff(params.dataParam1);
}
}}
mvcExress mediator
package {
public class MvcExpressMediator extends Mediator {
[Inject]
public var view:ViewComponent;
override public function onRegister():void {
// listen for framework events
addHandler(DataMessage.STUFF_DONE, handleStuffDone);
}
// handle framework events
private function handleStuffDone(params:DataChangeParamsVO):void {
view.showStuff(params.dataParam1);
}
}}
mvcExress mediator
package {
public class MvcExpressMediator extends Mediator {
[Inject]
public var view:ViewComponent;
override public function onRegister():void {
// listen for framework events
addHandler(DataMessage.STUFF_DONE, handleStuffDone);
}
// handle framework events
private function handleStuffDone(params:DataChangeParamsVO):void {
view.showStuff(params.dataParam1);
}
}}
mvcExress mediator
Speed test data
mvcExpress pureMVC robotlegs robotlegs 2
Command creation and execution: 0.00087 0.00219 0.00866 0.01894
Proxy inject into command: 0.00037 0.00024 0.00491 0.00247
Mediator create: 0.02100 0.02100 0.05100 0.13600
Mediator remove: 0.01700 0.10300 0.01850 0.05550
Communication 1 to 1: 0.00030 0.00060 0.00153 0.00141
Communication 1 to 10: 0.00073 0.00788 0.00670 0.00629
Communication 1 to 100: 0.00480 0.06897 0.05746 0.05071
1.0 /2.5 /10.0 /21.8
1.0 /0.7 /13.2 /6.6
1.0 /1.0 /2.4 /6.5
1.0 /6.1 /1.1 /3.3
1.0 /2.0 /5.0 /4.6
1.0 /10.9 /9.2 /8.7
1.0 /14.4 /12.0 /10.6
https://github.com/MindScriptAct/as3-mvcFramework-performanceTest
https://github.com/MindScriptAct/as3-mvcFramework-performanceTest
Command runs /1ms
pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress
(pooled)
Command with nothing: 495.0 109.3 55.3 1010.1 1754.4
Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9
Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1
Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3
Command performance
Command runs /1ms
pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress
(pooled)
Command with nothing: 495.0 109.3 55.3 1010.1 1754.4
Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9
Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1
Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3
Command performance
Command runs /1ms
pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress
(pooled)
Command with nothing: 495.0 109.3 55.3 1010.1 1754.4
Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9
Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1
Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3
Command performance
Command runs /1ms
pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress
(pooled)
Command with nothing: 495.0 109.3 55.3 1010.1 1754.4
Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9
Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1
Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3
Command performance
Command runs /1ms
pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress
(pooled)
Command with nothing: 495.0 109.3 55.3 1010.1 1754.4
Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9
Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1
Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3
Command performance
Command runs /1ms
pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress
(pooled)
Command with nothing: 495.0 109.3 55.3 1010.1 1754.4
Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9
Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1
Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3
Command performance
Communication performance
Direct communication:
Indirect communication:
Communication performance
Direct communication:
Indirect communication:
Overview
Overview
Overview
Modular programming in 
mvcExpress
Modular programming
features
●
Aggregation
●
Communication
●
Dependencies(data)
●
Permission control (v1.4)
Aggregation
mediatorMap.mediate(moduleB);
var moduleB:ModuleB = new ModuleB();
view.addChild(moduleB);
Module communication
Module communication
Module communication
sendScopeMessage("scopeName", "messageType", new ParamObject());
addScopeHandler("scopeName", "messageType", scopedMessageHandrlerFunction);
Module data sharing
(data dependencies)
Module data sharing
(data dependencies)
Module data sharing
(data dependencies)
proxyMap.scopeMap("scopeName", myProxyObject);
[Inject(scope="scopeName")]
public var myProxy:MyProxy;
Scope permissions
registerScope(scopeName:String,
messageSending:Boolean = true,
messageReceiving:Boolean = true,
proxieMapping:Boolean = false
):void
Dungeon viewer example
Modular programming
pitfalls
●
Planning is needed
●
Good module should be able to stand
as application on its own
– Chat window
– Stand alone tutorial
●
Worst case scenario: extracting
module/reintegrating module refactoring.
MvcExpress live
mvcExpress live
●
mvcExpress live = mvcExpress + game engine
– Continuous logic execution
– Dynamic animations
– Breaking execution in parts. (batching)
●
Compatible with mvcExpress
mvcExress live diagram
mvcExress live diagram
mvcExress live diagram
mvcExress live diagram
mvcExress live diagram
mvcExress live diagram
mvcExress live diagram
Process examplepackage com.mindscriptact.testProject.engine {
public class GameEngineProcess extends Process {
override protected function onRegister():void {
addTask(MoveHeroTask);
addTask(MoveEnemiesTask);
addTask(HeroCollideEnemiesTask);
addTask(EnemySpawnTask);
addTask(ShowHeroTask);
addTask(ShowEnemiesTask);
addHandler(Message.PAUSE_GAME, handleGamePause);
}
private function handleGamePause(isPaused:Boolean):void {
if (isPaused) {
disableTask(MoveHeroTask);
disableTask(MoveEnemiesTask);
} else {
enableTask(MoveHeroTask);
enableTask(MoveEnemiesTask);
}
}
}}
Task example
package com.mindscriptact.testProject.engine.tasks {
public class ShowEnemiesTask extends Task {
[Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_DATAS")]
public var enemyDatas:Vector.<EnemyVO>;
[Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_VIEWS")]
public var enemyImages:Vector.<EnemySprite>;
override public function run():void {
for (var i:int = 0; i < enemyDatas.length; i++) {
enemyImages[i].x = enemyDatas[i].x;
enemyImages[i].y = enemyDatas[i].y;
enemyImages[i].rotation = enemyDatas[i].rotations;
}
}
}}
mvcExpress live testing
package com.mindscriptact.testProject.engine.tasks {
public class ShowEnemiesTask extends Task {
[Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_DATAS")]
public var enemyDatas:Vector.<EnemyVO>;
[Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_VIEWS")]
public var enemyImages:Vector.<EnemySprite>;
override public function run():void {
for (var i:int = 0; i < enemyDatas.length; i++) {
enemyImages[i].x = enemyDatas[i].x;
enemyImages[i].y = enemyDatas[i].y;
enemyImages[i].rotation = enemyDatas[i].rotations;
}
}
}}
[Test]
public function showEnemiesTask_enemyViewAndDataCount_isEqual():void {
assert.equals(enemyDatas.length, enemyImages.length, "Enemies data and view count must be the same!");
}
[Test(delay="500")]
public function showEnemiesTask_enemyViewAndDataPosition_isEqual():void {
for (var i:int = 0; i < enemyDatas.length; i++) {
assert.equals(enemyImages[i].x, enemyDatas[i].x, "Enemy x is damaged. enemyId:" + enemyDatas[i].id);
assert.equals(enemyImages[i].y, enemyDatas[i].y, "Enemy y is damaged. enemyId:" + enemyDatas[i].id);
}
}
Process run speed
●
Best case:
– Runs 1000000 empty Task's in 17 ms
– 58823 empty tasks in 1 ms
●
Worst case:
– 13300 empty tasks in 1 ms
MvcExpress live overview
●
Designed with games in mind but can be used in any
application than has repeating logic to run.
●
Processes and Task's are decoupled
●
Convenient communication with MVC
●
It is possible to break Model and View decoupling
rules, but gives tools to detect it.
●
It is fast!
●
It just works!
On learning 
curve
On learning curve
●
MVC framework initial learning curve is steep...
●
But if you learned one – learning another is easy!
http://mvcexpress.org/documentation/
https://github.com/MindScriptAct/mvcExpress-examples
Also I do workshops.
http://mvcexpress.org/documentation/
https://github.com/MindScriptAct/mvcExpress-examples
Also I do workshops.
MvcExpress logger
Links
http://mvcexpress.org/
https://github.com/MindScriptAct/mvcExpress-framework
https://github.com/MindScriptAct/mvcExpress-examples
https://github.com/MindScriptAct/mvcExpress-downloads
http://puremvc.org/
http://www.robotlegs.org/
Twitter : @Deril
Thank you for your time!
http://mvcexpress.org/
https://github.com/MindScriptAct/mvcExpress-framework
https://github.com/MindScriptAct/mvcExpress-examples
https://github.com/MindScriptAct/mvcExpress-downloads
http://puremvc.org/
http://www.robotlegs.org/
Twitter : @Deril

More Related Content

What's hot

Spring 4 advanced final_xtr_presentation
Spring 4 advanced final_xtr_presentationSpring 4 advanced final_xtr_presentation
Spring 4 advanced final_xtr_presentationsourabh aggarwal
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02rhemsolutions
 
Java util concurrent
Java util concurrentJava util concurrent
Java util concurrentRoger Xia
 
Java Concurrency and Asynchronous
Java Concurrency and AsynchronousJava Concurrency and Asynchronous
Java Concurrency and AsynchronousLifan Yang
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsYauheni Akhotnikau
 
Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy
Se lancer dans l'aventure microservices avec Spring Cloud - Julien RoySe lancer dans l'aventure microservices avec Spring Cloud - Julien Roy
Se lancer dans l'aventure microservices avec Spring Cloud - Julien Royekino
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flexprideconan
 
Java Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and TrendsJava Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and TrendsCarol McDonald
 
In the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleIn the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleSkills Matter
 
Other Approaches (Concurrency)
Other Approaches (Concurrency)Other Approaches (Concurrency)
Other Approaches (Concurrency)Sri Prasanna
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
 
Qt test framework
Qt test frameworkQt test framework
Qt test frameworkICS
 
Spring vs. Java EE QConSP 2012
Spring vs. Java EE QConSP 2012Spring vs. Java EE QConSP 2012
Spring vs. Java EE QConSP 2012Guilherme Moreira
 
Java New Evolution
Java New EvolutionJava New Evolution
Java New EvolutionAllan Huang
 

What's hot (20)

Spring 4 advanced final_xtr_presentation
Spring 4 advanced final_xtr_presentationSpring 4 advanced final_xtr_presentation
Spring 4 advanced final_xtr_presentation
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02
 
Java util concurrent
Java util concurrentJava util concurrent
Java util concurrent
 
Java Concurrency and Asynchronous
Java Concurrency and AsynchronousJava Concurrency and Asynchronous
Java Concurrency and Asynchronous
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message Chains
 
Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy
Se lancer dans l'aventure microservices avec Spring Cloud - Julien RoySe lancer dans l'aventure microservices avec Spring Cloud - Julien Roy
Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy
 
Vue next
Vue nextVue next
Vue next
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
 
Java Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and TrendsJava Concurrency, Memory Model, and Trends
Java Concurrency, Memory Model, and Trends
 
In the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleIn the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: Gradle
 
Other Approaches (Concurrency)
Other Approaches (Concurrency)Other Approaches (Concurrency)
Other Approaches (Concurrency)
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
 
Qt test framework
Qt test frameworkQt test framework
Qt test framework
 
JEE.next()
JEE.next()JEE.next()
JEE.next()
 
drmaatutggf12
drmaatutggf12drmaatutggf12
drmaatutggf12
 
Byte code field report
Byte code field reportByte code field report
Byte code field report
 
angular2.0
angular2.0angular2.0
angular2.0
 
The Java memory model made easy
The Java memory model made easyThe Java memory model made easy
The Java memory model made easy
 
Spring vs. Java EE QConSP 2012
Spring vs. Java EE QConSP 2012Spring vs. Java EE QConSP 2012
Spring vs. Java EE QConSP 2012
 
Java New Evolution
Java New EvolutionJava New Evolution
Java New Evolution
 

Similar to The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013

Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Architecting ActionScript 3 applications using PureMVC
Architecting ActionScript 3 applications using PureMVCArchitecting ActionScript 3 applications using PureMVC
Architecting ActionScript 3 applications using PureMVCmarcocasario
 
Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and FriendsYun Zhi Lin
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard IntroductionAnthony Chen
 
Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6William Marques
 
Jdk Tools For Performance Diagnostics
Jdk Tools For Performance DiagnosticsJdk Tools For Performance Diagnostics
Jdk Tools For Performance DiagnosticsDror Bereznitsky
 
Daggerate your code - Write your own annotation processor
Daggerate your code - Write your own annotation processorDaggerate your code - Write your own annotation processor
Daggerate your code - Write your own annotation processorBartosz Kosarzycki
 
Spring mvc my Faviourite Slide
Spring mvc my Faviourite SlideSpring mvc my Faviourite Slide
Spring mvc my Faviourite SlideDaniel Adenew
 
Foomo / Zugspitze Presentation
Foomo / Zugspitze PresentationFoomo / Zugspitze Presentation
Foomo / Zugspitze Presentationweareinteractive
 
What's new in asp.net mvc 4
What's new in asp.net mvc 4What's new in asp.net mvc 4
What's new in asp.net mvc 4Simone Chiaretta
 
Building resilient scheduling in distributed systems with Spring
Building resilient scheduling in distributed systems with SpringBuilding resilient scheduling in distributed systems with Spring
Building resilient scheduling in distributed systems with SpringMarek Jeszka
 
Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVMSylvain Wallez
 
Omnia App With Samsung Sdk
Omnia App With Samsung SdkOmnia App With Samsung Sdk
Omnia App With Samsung Sdksheon shin
 
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...Codemotion
 
ASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline InternalsASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline InternalsLukasz Lysik
 

Similar to The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013 (20)

Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Architecting ActionScript 3 applications using PureMVC
Architecting ActionScript 3 applications using PureMVCArchitecting ActionScript 3 applications using PureMVC
Architecting ActionScript 3 applications using PureMVC
 
C#on linux
C#on linuxC#on linux
C#on linux
 
Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and Friends
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6
 
Jdk Tools For Performance Diagnostics
Jdk Tools For Performance DiagnosticsJdk Tools For Performance Diagnostics
Jdk Tools For Performance Diagnostics
 
Daggerate your code - Write your own annotation processor
Daggerate your code - Write your own annotation processorDaggerate your code - Write your own annotation processor
Daggerate your code - Write your own annotation processor
 
Spring mvc my Faviourite Slide
Spring mvc my Faviourite SlideSpring mvc my Faviourite Slide
Spring mvc my Faviourite Slide
 
Rcp by example
Rcp by exampleRcp by example
Rcp by example
 
Foomo / Zugspitze Presentation
Foomo / Zugspitze PresentationFoomo / Zugspitze Presentation
Foomo / Zugspitze Presentation
 
What's new in asp.net mvc 4
What's new in asp.net mvc 4What's new in asp.net mvc 4
What's new in asp.net mvc 4
 
Building resilient scheduling in distributed systems with Spring
Building resilient scheduling in distributed systems with SpringBuilding resilient scheduling in distributed systems with Spring
Building resilient scheduling in distributed systems with Spring
 
Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Omnia App With Samsung Sdk
Omnia App With Samsung SdkOmnia App With Samsung Sdk
Omnia App With Samsung Sdk
 
Griffon Presentation
Griffon PresentationGriffon Presentation
Griffon Presentation
 
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
 
ASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline InternalsASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline Internals
 
Asp Net Architecture
Asp Net ArchitectureAsp Net Architecture
Asp Net Architecture
 

Recently uploaded

Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2Hyundai Motor Group
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 

Recently uploaded (20)

Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 

The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013

  • 2. About me Senior AS3 Developer Working with Flash from 2001 Author of open source AS3 framework – mvcExpress Twitter : @Deril
  • 3. About this presentation ● AS3 framework evolution ● Modular programming in mvcExpress ● mvcExpress live
  • 5. AS3 framework history ● PureMVC (2006) ● Cairngorm (2007?) [flex only] ● Springactionscript (2007) ● Parsley(2008) ● Mate(2008) [flex only] ● Robotlegs(2009) ● Swiz(2009) [flex only] ● MvcExpress(2012) ● Robotlegs 2 (2012) (in beta) (ActionScript 3.0 released in 2006)
  • 6. AS3 framework history ● PureMVC (2006) ● Cairngorm (2007?) [flex only] ● Springactionscript (2007) ● Parsley(2008) ● Mate(2008) [flex only] ● Robotlegs(2009) ● Swiz(2009) [flex only] ● MvcExpress(2012) ● Robotlegs 2 (2012) (in beta) (ActionScript 3.0 released in 2006)
  • 7. PureMVC ● Organize your code is small units ● Let those units communication ● Standardize your code ● Focus on app instead of architecture ● Ported to many languages ● Slightly hurts performance ● Built on static classes ● Lot of boilerplate code Can't it be done simpler? The good The bad
  • 8. The good The bad robotlegs ● All PureMVC goodness. ● Removed most boilerplate code ● Introduces dependency injection ● Hurts performance a lot! Can't it be done simpler... and run fast?
  • 9. The good The bad robotlegs 2 (beta) ● Highly configurable ● Modular ● Guards ,hooks, rules. ● Adds some boilerplate code ● Code less standardized ● Hurts performance a lot (and more) I meant faster! Not slower...
  • 10. The good The bad mvcExpress ● All PureMVC and robotlegs goodness. ● Focus on modular development ● Simplifies code even more ● Hurts performance the least ● Young framework Simplest and fastest MVC framework!
  • 11. package { public class PureMvcMediator extends Mediator implements IMediator { public static const NAME:String = "PureMvcMediator"; public function PureMvcMediator(initViewComponent:ViewComponent) { super(NAME, initViewComponent); } // cast view for convenient local use. public function get view():ViewComponent { return super.getViewComponent() as ViewComponent; } // listen for framework notices override public function listNotificationInterests():Array { return [ // DataNote.STUFF_DONE // ]; } // handle framework events override public function handleNotification(notice:INotification):void { switch (notice.getName()) { case DataNote.STUFF_DONE: // do stuff… break; } }} pureMVC mediator
  • 12. package { public class PureMvcMediator extends Mediator implements IMediator { public static const NAME:String = "PureMvcMediator"; public function PureMvcMediator(initViewComponent:ViewComponent) { super(NAME, initViewComponent); } // cast view for convenient local use. public function get view():ViewComponent { return super.getViewComponent() as ViewComponent; } // listen for framework notices override public function listNotificationInterests():Array { return [ // DataNote.STUFF_DONE // ]; } // handle framework events override public function handleNotification(notice:INotification):void { switch (notice.getName()) { case DataNote.STUFF_DONE: // do stuff… break; } }} pureMVC mediator
  • 13. package { public class PureMvcMediator extends Mediator implements IMediator { public static const NAME:String = "PureMvcMediator"; public function PureMvcMediator(initViewComponent:ViewComponent) { super(NAME, initViewComponent); } // cast view for convenient local use. public function get view():ViewComponent { return super.getViewComponent() as ViewComponent; } // listen for framework notices override public function listNotificationInterests():Array { return [ // DataNote.STUFF_DONE // ]; } // handle framework events override public function handleNotification(notice:INotification):void { switch (notice.getName()) { case DataNote.STUFF_DONE: // do stuff… break; } }} pureMVC mediator
  • 14. package { public class PureMvcMediator extends Mediator implements IMediator { public static const NAME:String = "PureMvcMediator"; public function PureMvcMediator(initViewComponent:ViewComponent) { super(NAME, initViewComponent); } // cast view for convenient local use. public function get view():ViewComponent { return super.getViewComponent() as ViewComponent; } // listen for framework notices override public function listNotificationInterests():Array { return [ // DataNote.STUFF_DONE // ]; } // handle framework events override public function handleNotification(notice:INotification):void { switch (notice.getName()) { case DataNote.STUFF_DONE: // do stuff… break; } }} pureMVC mediator
  • 15. package { public class MvcExpressMediator extends Mediator { [Inject] public var view:ViewComponent; override public function onRegister():void { // listen for framework events addHandler(DataMessage.STUFF_DONE, handleStuffDone); } // handle framework events private function handleStuffDone(params:DataChangeParamsVO):void { view.showStuff(params.dataParam1); } }} mvcExress mediator
  • 16. package { public class MvcExpressMediator extends Mediator { [Inject] public var view:ViewComponent; override public function onRegister():void { // listen for framework events addHandler(DataMessage.STUFF_DONE, handleStuffDone); } // handle framework events private function handleStuffDone(params:DataChangeParamsVO):void { view.showStuff(params.dataParam1); } }} mvcExress mediator
  • 17. package { public class MvcExpressMediator extends Mediator { [Inject] public var view:ViewComponent; override public function onRegister():void { // listen for framework events addHandler(DataMessage.STUFF_DONE, handleStuffDone); } // handle framework events private function handleStuffDone(params:DataChangeParamsVO):void { view.showStuff(params.dataParam1); } }} mvcExress mediator
  • 18. package { public class MvcExpressMediator extends Mediator { [Inject] public var view:ViewComponent; override public function onRegister():void { // listen for framework events addHandler(DataMessage.STUFF_DONE, handleStuffDone); } // handle framework events private function handleStuffDone(params:DataChangeParamsVO):void { view.showStuff(params.dataParam1); } }} mvcExress mediator
  • 19. Speed test data mvcExpress pureMVC robotlegs robotlegs 2 Command creation and execution: 0.00087 0.00219 0.00866 0.01894 Proxy inject into command: 0.00037 0.00024 0.00491 0.00247 Mediator create: 0.02100 0.02100 0.05100 0.13600 Mediator remove: 0.01700 0.10300 0.01850 0.05550 Communication 1 to 1: 0.00030 0.00060 0.00153 0.00141 Communication 1 to 10: 0.00073 0.00788 0.00670 0.00629 Communication 1 to 100: 0.00480 0.06897 0.05746 0.05071 1.0 /2.5 /10.0 /21.8 1.0 /0.7 /13.2 /6.6 1.0 /1.0 /2.4 /6.5 1.0 /6.1 /1.1 /3.3 1.0 /2.0 /5.0 /4.6 1.0 /10.9 /9.2 /8.7 1.0 /14.4 /12.0 /10.6 https://github.com/MindScriptAct/as3-mvcFramework-performanceTest https://github.com/MindScriptAct/as3-mvcFramework-performanceTest
  • 20. Command runs /1ms pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress (pooled) Command with nothing: 495.0 109.3 55.3 1010.1 1754.4 Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9 Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1 Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3 Command performance
  • 21. Command runs /1ms pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress (pooled) Command with nothing: 495.0 109.3 55.3 1010.1 1754.4 Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9 Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1 Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3 Command performance
  • 22. Command runs /1ms pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress (pooled) Command with nothing: 495.0 109.3 55.3 1010.1 1754.4 Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9 Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1 Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3 Command performance
  • 23. Command runs /1ms pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress (pooled) Command with nothing: 495.0 109.3 55.3 1010.1 1754.4 Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9 Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1 Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3 Command performance
  • 24. Command runs /1ms pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress (pooled) Command with nothing: 495.0 109.3 55.3 1010.1 1754.4 Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9 Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1 Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3 Command performance
  • 25. Command runs /1ms pureMVC robotlegs robotlegs 2 mvcExpress mvcExpress (pooled) Command with nothing: 495.0 109.3 55.3 1010.1 1754.4 Command with 1 inject: 487.5 70.4 49.6 961.5 1694.9 Command with 2 injects: 458.7 58.6 47.2 724.6 1724.1 Command with 4 injects: 340.1 44.1 42.7 480.8 1783.3 Command performance
  • 33. Aggregation mediatorMap.mediate(moduleB); var moduleB:ModuleB = new ModuleB(); view.addChild(moduleB);
  • 36. Module communication sendScopeMessage("scopeName", "messageType", new ParamObject()); addScopeHandler("scopeName", "messageType", scopedMessageHandrlerFunction);
  • 37. Module data sharing (data dependencies)
  • 38. Module data sharing (data dependencies)
  • 39. Module data sharing (data dependencies) proxyMap.scopeMap("scopeName", myProxyObject); [Inject(scope="scopeName")] public var myProxy:MyProxy;
  • 40. Scope permissions registerScope(scopeName:String, messageSending:Boolean = true, messageReceiving:Boolean = true, proxieMapping:Boolean = false ):void
  • 42. Modular programming pitfalls ● Planning is needed ● Good module should be able to stand as application on its own – Chat window – Stand alone tutorial ● Worst case scenario: extracting module/reintegrating module refactoring.
  • 44. mvcExpress live ● mvcExpress live = mvcExpress + game engine – Continuous logic execution – Dynamic animations – Breaking execution in parts. (batching) ● Compatible with mvcExpress
  • 52. Process examplepackage com.mindscriptact.testProject.engine { public class GameEngineProcess extends Process { override protected function onRegister():void { addTask(MoveHeroTask); addTask(MoveEnemiesTask); addTask(HeroCollideEnemiesTask); addTask(EnemySpawnTask); addTask(ShowHeroTask); addTask(ShowEnemiesTask); addHandler(Message.PAUSE_GAME, handleGamePause); } private function handleGamePause(isPaused:Boolean):void { if (isPaused) { disableTask(MoveHeroTask); disableTask(MoveEnemiesTask); } else { enableTask(MoveHeroTask); enableTask(MoveEnemiesTask); } } }}
  • 53. Task example package com.mindscriptact.testProject.engine.tasks { public class ShowEnemiesTask extends Task { [Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_DATAS")] public var enemyDatas:Vector.<EnemyVO>; [Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_VIEWS")] public var enemyImages:Vector.<EnemySprite>; override public function run():void { for (var i:int = 0; i < enemyDatas.length; i++) { enemyImages[i].x = enemyDatas[i].x; enemyImages[i].y = enemyDatas[i].y; enemyImages[i].rotation = enemyDatas[i].rotations; } } }}
  • 54. mvcExpress live testing package com.mindscriptact.testProject.engine.tasks { public class ShowEnemiesTask extends Task { [Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_DATAS")] public var enemyDatas:Vector.<EnemyVO>; [Inject(constName="com.mindscriptact.testProject.constants.ProvideIds.ENEMY_VIEWS")] public var enemyImages:Vector.<EnemySprite>; override public function run():void { for (var i:int = 0; i < enemyDatas.length; i++) { enemyImages[i].x = enemyDatas[i].x; enemyImages[i].y = enemyDatas[i].y; enemyImages[i].rotation = enemyDatas[i].rotations; } } }} [Test] public function showEnemiesTask_enemyViewAndDataCount_isEqual():void { assert.equals(enemyDatas.length, enemyImages.length, "Enemies data and view count must be the same!"); } [Test(delay="500")] public function showEnemiesTask_enemyViewAndDataPosition_isEqual():void { for (var i:int = 0; i < enemyDatas.length; i++) { assert.equals(enemyImages[i].x, enemyDatas[i].x, "Enemy x is damaged. enemyId:" + enemyDatas[i].id); assert.equals(enemyImages[i].y, enemyDatas[i].y, "Enemy y is damaged. enemyId:" + enemyDatas[i].id); } }
  • 55. Process run speed ● Best case: – Runs 1000000 empty Task's in 17 ms – 58823 empty tasks in 1 ms ● Worst case: – 13300 empty tasks in 1 ms
  • 56. MvcExpress live overview ● Designed with games in mind but can be used in any application than has repeating logic to run. ● Processes and Task's are decoupled ● Convenient communication with MVC ● It is possible to break Model and View decoupling rules, but gives tools to detect it. ● It is fast! ● It just works!
  • 58. On learning curve ● MVC framework initial learning curve is steep... ● But if you learned one – learning another is easy! http://mvcexpress.org/documentation/ https://github.com/MindScriptAct/mvcExpress-examples Also I do workshops. http://mvcexpress.org/documentation/ https://github.com/MindScriptAct/mvcExpress-examples Also I do workshops.
  • 60. Links http://mvcexpress.org/ https://github.com/MindScriptAct/mvcExpress-framework https://github.com/MindScriptAct/mvcExpress-examples https://github.com/MindScriptAct/mvcExpress-downloads http://puremvc.org/ http://www.robotlegs.org/ Twitter : @Deril Thank you for your time! http://mvcexpress.org/ https://github.com/MindScriptAct/mvcExpress-framework https://github.com/MindScriptAct/mvcExpress-examples https://github.com/MindScriptAct/mvcExpress-downloads http://puremvc.org/ http://www.robotlegs.org/ Twitter : @Deril