piątek, 6 listopada 2009

Chmury nad Flash'em

Kiedy zaczynałem, 7 lat temu, zajmować się tą technologią, czułem, że jest to przyszłość. Cały czas Macromedia/Adobe świetnie wyczuwało intencję runku, ale ostatnio pierwszy raz złapała mnie myśl, że technologię flash czeka niedługo odwrót.

Przesłanki?

HTML 5
Podobno HTML 5 ma mieć wbudowane mechanizmy odtwarzania video. Flash wyparł bardzo skutecznie QuickTime'a i RealPlayer'a z przeglądarek. Streaming (RTMP/RTMPT) świetnie się sprawdził, a możliwości H.264 dają doskonałe efekty przy jakości HD. Czego więcej chcieć? Flash przetarł ścieżki i teraz producenci przeglądarek mogą spokojnie go zastąpić włanymi player'ami.

A poza tym HTML5 ma mieć wsparcie dla OpenGL.

GRY/3D
Flash rządzi tu niepodzielnie, ale doszedł już do granicy, poza którą nie może odwlekać decyzji o wsparciu dla 3D. Biblioteki 3D w AS3, czy nawet połączenie z Alchemy, to cały czas obciążenie dla procesora. Wykorzystanie pełniejszej akceleracji sprzętowej, będzie krokiem w kierunku scalania się ze stacją użytkownika. Jak dotąd, siłą Flash'a był fakt, że 98% komputerów na świecie może go odtworzyć - nie zależnie, czy jest to MacOS, Windows, Linux.

Podobno wersja Flash Player'a 10.1 ma mieć wsparcie ze strony producenta NVIDIA. Oznaczałoby to podjęcie decyzji w kierunku wsparcia akceleracji sprzętowej, ale na to może być już za późno ... nadchodzi Unity3D.

Unity3D
Unity3D jest technologią dającą potężne narzędzie do budowanie webowych gier 3D. Środowisko graficzno-programistyczne trąci blenderem i wczesnym IDE Flash'a. Coraz więcej Flash Developerów jednak interesuje się tą technologią (zwłaszcza że SDK od niedawana jest do pobrania w wersji darmowej).

No i programuje się w C#.....

C#
AS3, mimo, że podobny do Javy, trzeba się jednak nauczyć. Dla programistów Jav'a składnia jest oczywista, a dla .Net'ow'ca.... jest Silverlight (dla aplikacji RIA) i Unity3D (dla gier).

Microsoft, na wariackich papierach, podbija kolejne numerki wersji Silverlight'a (jakby sztucznie chciał dogonić Adobe). Z drugiej strony dzięki braku zaszłości (playery flash są cały czas kompatybilne z poprzednimi wersjami), nie są obarczone ciężarem naleciałości w architekturze rozwiązania.

Szybkość łącza
W ciągu ostatnich lat szybkość łącz w naszych domach wzrosła kilkukrotnie. Szerokopasmowy internet na zachodzie jest już normą. Skompilowane pliki flash zajmują kliobajty, jednak teraz to przestaje mieć już tak duże znacznie.

Kilka lat temu Macromedia miała swoje podejście z wprowadzeniem 3D do przeglądarek. Pobranie plugina'a do Unity3D nie szokuje dziś tak, jak ściągnięcie kilka lat temu "ciężkiego" plugina do Maromedia Director'a.

10.1
Rzadko która technologia dożywa wersji 10. Pod koniec roku ma być 10.1 ... trąci to nieco myszką.

Ucieczka do przodu
Adobe wyciągnęło już asy z rękawa.
  • Flex został puszczony jako open source,
  • Technologia serwerowa LCDS (BlazeDS) dostępna jest również za darmo.
  • Alchemy i inne projekty z lab'ów dają nadzieję
  • AIR + SQLite+ PDF + WebKit (strzał w dziesiątkę),
  • Synergia produktów Adobe (CS x) - (to akurat mi się nie podoba)
  • technologie mobilne
Myślę, że coraz mocniej będzie stawiany nacisk na technologie serwerowe LiveCycle. Tu konkurencji nie widać, choć zahaczenie o produkty typu BPM, może nie być trafionym pomysłem (IBM czy RedHat mają dużo dojrzalsze rozwiązania w tej materii).

czwartek, 8 października 2009

Cairngorm 3

Czyli reanimacja trupa

Ostatnio przeczytałem o kolejnym wydaniu Cairngoma. Reanimacja ma być przeprowadzona do końca roku. Podobno zmiany mają być gruntowne i pójść w kierunku IoC.

Szkoda, że Adobe odpuściło sobie temat frameworków we Flex'ie. Temat (na szczęście) z powodzeniem podchwycili inni.

Jeśli, ktoś chce więcej o tym przeczytać, odsyłam na stronę Adobe.

niedziela, 4 października 2009

Rock&Glob


Podczas studiów współtworzyłem portal studentów Politechniki Gdańskiej "SzPieG". Inicjatywa działała bardzo sprawnie i już w niedługim czasie doczekaliśmy się 100 000 odwiedzin.


Lata studenckie

Było to jakieś 8 lat temu. Macromedia Flash była dostępna już w wersji 5, a tak okrągła rocznica nie mogła się obyć bez fajnego bajeru. Zrealizowałem wówczas intro..., ale o tym może przy innej okazji.



Jednym z elementów intro, była kula ziemska. Oczywiście wówczas nie można było mówić o obróceniu globu. Duch był w prawdzie ochoczy, ale API słabe.

Era Papervision i Jiglib'a

Od jakiegoś czasu próbuję zmierzyć się z pewnym tematem 3D. Teoretycznie wszystko jest realizowalne, ale wciąż największym wrogiem przekształceń 3D we flash'u jest CPU.

Dla relaksu postanowiłem zająć się na chwilę czymś innym. Przypomniał mi się wówczas wspomniany motyw sprzed lat. Po chwili nostalgii i radosnego tworzenia, powstało coś takiego.



Dla dociekliwych załączam źródła w pliku spaceRock.zip (model skały w blednerze, tekstury i kod).

Poniżej kod w AS3.




package pl.snickers.raceGame
{
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.core.proto.LightObject3D;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.events.FileLoadEvent;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.shaders.GouraudShader;
import org.papervision3d.materials.shaders.ShadedMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.parsers.DAE;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
import org.papervision3d.view.stats.StatsView;

/**
* ...
* @author Wojciech Asztemborski
*/
public class MainView4 extends BasicView
{

// ================ PV3D

[Embed(source="/3d/gniot2.dae", mimeType="application/octet-stream")]
private var gniotAsset:Class;


[Embed(source="/3d/granit.jpeg")]
private var granitClass:Class;

[Embed(source="/3d/earthTexture512.jpg")]
private var earthClass:Class;

private var gniot:DAE;
private var glob:DisplayObject3D;
private var light:LightObject3D;



public function MainView4()
{
super(640, 480, true);

gniot = new DAE();
gniot.addEventListener(FileLoadEvent.LOAD_COMPLETE, function(e:FileLoadEvent):void {

initPv3d();
});


var ml:MaterialsList = new MaterialsList();
ml.addMaterial(new BitmapMaterial(new granitClass().bitmapData), "granit_jpeg");
gniot.load("http://wojciech.asztemborski.googlepages.com/gniot2.dae",ml);
}

private function initPv3d():void {

addChild(new StatsView(renderer));
light = new PointLight3D(true);

var shader:GouraudShader = new GouraudShader(light, 0xffffff, 0x000000, 10);

//--- earth
var bmat:BitmapMaterial = new BitmapMaterial(new earthClass().bitmapData);
var mat:MaterialObject3D;
//mat = new BitmapMaterial(new earthClass().bitmapData);
mat = new ShadedMaterial(bmat, shader);

glob = new Sphere(mat, 200, 20, 20);
scene.addChild(glob);

//--- rock
var mat2:BitmapMaterial = new BitmapMaterial(gniot.getMaterialByName("granit_jpeg").bitmap);
gniot.replaceMaterialByName( new ShadedMaterial(mat2, shader), "granit_jpeg");
gniot.z = 600;
scene.addChild(gniot);

//--- camera
camera.target = glob;

stage.addEventListener(MouseEvent.MOUSE_DOWN, function (e:MouseEvent):void {

camera.target = glob;
camera.position = new Number3D(gniot.position.x, gniot.position.y+100, gniot.position.z +200);
});

stage.addEventListener(MouseEvent.MOUSE_UP, function (e:MouseEvent):void {

camera.target = gniot;
camera.position = new Number3D(400,400,400);
});


startRendering();
}


override protected function onRenderTick(event:Event=null):void
{
super.onRenderTick(event);

light.x = (stage.mouseX-stage.stageWidth/2);
light.y = (stage.mouseY-stage.stageHeight/2);
light.z = gniot.position.z;

gniot.yaw(1);
gniot.moveBackward(20);

glob.yaw(1);
}
}
}