Użycie modułu cieniującego w trybie autonomicznym

Flash Player 10 i nowsze wersje, Adobe AIR 1.5 i nowsze wersje

Jeśli moduł cieniujący jest używany w trybie autonomicznym, wówczas przetwarzanie modułu cieniującego działa niezależnie od przeznaczenia wyniku działania modułu cieniującego. Należy określić moduł cieniujący do uruchomienia, ustawić dane wejściowe i wartości parametrów, a następnie wyznaczyć obiekt, do którego zostaną wstawione dane wynikowe. Moduł cieniujący może być używany w trybie autonomicznym z dwóch powodów:

  • Przetwarzanie danych nieobrazowych: w trybie autonomicznym użytkownik wybiera dowolne dane binarne lub liczbowe, które są przekazywane do modułu cieniującego zamiast danych bitmapy. Wynik działania modułu cieniującego może zostać zwrócony jako dane binarne lub dane liczbowe, a także jako dane bitmapy.

  • Przetwarzanie w tle: po uruchomieniu modułu cieniującego w trybie autonomicznym domyślnie moduł działa w sposób asynchroniczny. Oznacza to, że moduł działa w tle, a aplikacja nie przerywa działania — kod zostaje powiadomiony o zakończeniu przetwarzania przez moduł cieniujący. Możliwe jest korzystanie z modułu cieniującego, którego działanie trwa długo, ale nie spowoduje to zawieszenia interfejsu aplikacji użytkownika ani innych operacji przetwarzania podczas działania modułu cieniującego.

W celu uruchomienia modułu cieniującego w trybie autonomicznym należy użyć klasy ShaderJob. Najpierw należy użyć obiektu ShaderJob i połączyć go z obiektem Shader reprezentującym moduł cieniujący przeznaczony do uruchomienia:

var job:ShaderJob = new ShaderJob(myShader);

Następnie należy ustawić dowolne wartości wejściowe lub wartości parametrów, jakich oczekuje moduł cieniujący. Jeśli moduł cieniujący jest uruchamiany w tle, można również zarejestrować detektor dla zdarzenia complete obiektu ShaderJob. Detektor zostanie wywołany, gdy moduł cieniujący zakończy pracę:

function completeHandler(event:ShaderEvent):void 
{ 
    // do something with the shader result 
} 
 
job.addEventListener(ShaderEvent.COMPLETE, completeHandler);

Następnie należy utworzyć obiekt, do którego po zakończeniu operacji zostanie zapisany wynik działania modułu cieniującego. Obiekt ten należy przypisać do właściwości target obiektu ShaderJob.

var jobResult:BitmapData = new BitmapData(100, 75); 
job.target = jobResult;

Jeśli do przetwarzania obrazu jest stosowana klasa ShaderJob, należy przypisać wystąpienie klasy BitmapData do właściwości target . Jeśli przetwarzane są dane binarne lub liczbowe, należy przypisać obiekt ByteArray lub wystąpienie klasy Vector.<Number> do właściwości target . W takim przypadku należy ustawić właściwości width i height obiektu ShaderJob w celu określenia ilości danych, jakie zostaną przekazane na wyjściu do obiektu target .

Uwaga: Właściwości shader , target , width i height obiektu ShaderJob można ustawić w jednym kroku, przekazując argumenty do konstruktora ShaderJob() na przykład za pomocą kodu var zadanie:ShaderJob = new ShaderJob(modul_cieniujacy, element_docelowy, szerokosc, wysokosc); .

Po przygotowaniu uruchomienia modułu cieniującego należy wywołać metodę start() obiektu ShaderJob.

job.start();

Domyślnie wywołanie metody start() powoduje, że obiekt ShaderJob działa asynchronicznie. W takim przypadku wykonywanie programu jest kontynuowane bezpośrednio z kolejnym wierszem kodu — program nie oczekuje na zakończenie działania modułu cieniującego. Po zakończeniu działania modułu cieniującego obiekt ShaderJob wywołuje jego detektory zdarzenia complete , powiadamiając je o zakończeniu. W tym punkcie (w treści detektora zdarzenia complete ) obiekt target zawiera wynik działania modułu cieniującego.

Uwaga: Zamiast korzystać z właściwości target obiektu, można pobrać wynik działania modułu cieniującego bezpośrednio z obiektu zdarzenia, który został przekazany do metody detektora. Obiekt zdarzenia jest wystąpieniem klasy ShaderEvent. Obiekt ShaderEvent ma trzy właściwości, za pomocą których można uzyskać dostęp do wyniku — w zależności od typu danych obiektu ustawionego jako właściwość target : ShaderEvent.bitmapData , ShaderEvent.byteArray i ShaderEvent.vector .

Innym rozwiązaniem jest przekazanie argumentu true do metody start() . W tym przypadku moduł cieniujący będzie działał w sposób synchroniczny. Wykonywanie całego kodu (łącznie z interakcjami z interfejsem użytkownika i innymi zdarzeniami) zostaje wstrzymane podczas działania modułu cieniującego. Po zakończeniu działania modułu cieniującego obiekt target zawiera wynik działania modułu, a działanie programu jest kontynuowane od następnego wiersza kodu.

job.start(true);