Uso di uno shader in modalità autonoma

Flash Player 10 e versioni successive, Adobe AIR 1.5 e versioni successive

Quando usate uno shader in modalità autonoma, l'elaborazione dello shader avviene in modo indipendente da come prevedete di sfruttare l'output. Specificate uno shader da eseguire, impostate i valori di input e dei parametri e progettate un oggetto in cui devono essere inseriti i dati risultanti. Potete utilizzare uno shader in modalità autonoma per due motivi:

  • Elaborazione di dati non di immagine: in modalità autonoma, potete scegliere di passare allo shader dati binari o numerici arbitrari, anziché dati di un'immagine bitmap. Potete scegliere di restituire il risultato dello shader come dati binari o numerici oltre che come dati di un'immagine bitmap.

  • Elaborazione in background: quando eseguite uno shader in modalità autonoma, per impostazione predefinita lo shader viene eseguito in modo asincrono, ovvero viene eseguito in background mentre l'applicazione continua a funzionare. Al termine dell'elaborazione dello shader viene inviata notifica al codice. Potete utilizzare uno shader che richiede un tempo di esecuzione prolungato senza bloccare l'interfaccia utente dell'applicazione o eventuali altri processi di elaborazione eseguiti contemporaneamente allo shader.

Potete usare un oggetto ShaderJob per eseguire uno shader in modalità autonoma. In primo luogo create l'oggetto ShaderJob e lo collegate all'oggetto Shader che rappresenta lo shader da eseguire:

var job:ShaderJob = new ShaderJob(myShader);

Quindi, impostate i valori di input o dei parametri previsti dallo shader. Se eseguite lo shader in background, registrate inoltre un listener per l'evento complete dell'oggetto Shader che viene chiamato al termine dell'elaborazione dello shader:

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

Create quindi un oggetto in cui deve essere scritto il risultato dell'operazione dello shader al termine dell'operazione. Assegnate questo oggetto alla proprietà target dell'oggetto ShaderJob:

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

Assegnate un'istanza di BitmapData alla proprietà target se utilizzate l'oggetto ShaderJob per eseguire l'elaborazione di immagini. Se invece elaborate dati binari o numerici, assegnate un oggetto BitArray o un'istanza di Vector.<numero> alla proprietà target. In questo caso, dovete impostare le proprietà width e height dell'oggetto ShaderJob per specificare la quantità di dati da restituire all'oggetto target.

Nota: potete impostare le proprietà shader, target, width e height dell'oggetto ShaderJob in un solo passaggio passando argomenti al costruttore ShaderJob() in questo modo: var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight);

Quando siete pronti a eseguire lo shader, chiamate il metodo start() dell'oggetto ShaderJob:

job.start();

Per impostazione predefinita, la chiamata a start() causa l'esecuzione asincrona di ShaderJob, pertanto l'esecuzione del programma continua subito con la riga successiva di codice e non viene atteso il completamento dell'esecuzione dello shader. Al termine dell'esecuzione dello shader, l'oggetto ShaderJob chiama i listener dell'evento complete per notificare il termine dell'esecuzione. A questo punto, ovvero nel corpo del listener dell'evento complete, l'oggetto target contiene il risultato dell'operazione dello shader.

Nota: anziché utilizzare l'oggetto proprietà target, potete recuperare il risultato dello shader direttamente dall'oggetto evento che viene passato al metodo del listener. L'oggetto evento è un'istanza di ShaderEvent. L'oggetto ShaderEvent dispone di tre proprietà che possono essere utilizzate per accedere al risultato, in base al tipo di dati dell'oggetto che impostate come proprietà target: ShaderEvent.bitmapData, ShaderEvent.byteArray e ShaderEvent.vector.

In alternativa, potete passare un argomento true al metodo start() affinché il funzionamento dello shader avvenga in modo sincrono. Tutto il codice, compresa l'interazione con l'interfaccia utente e altri eventi, verrà interrotto temporaneamente durante l'esecuzione dello shader. Al termine dell'esecuzione dello shader, l'oggetto target contiene il risultato dello shader e il programma continua con la riga di codice successiva.

job.start(true);