2012-10-01 3 views
6

Hey ragazzi Sto lavorando alla creazione di un gioco con libGDX e voglio davvero fare il thread in modo che eseguo un ciclo di paint e un loop logico su thread separati come se stessi facendo un semplice gioco di java swing con il ciclo paintComponent e il ciclo corsa eseguibilejava Threads in libGDX

ho esperienza con filettatura in c ma non tanto in java l'unico modo sono in grado di fare un filo era facendo una classe che estende fili e quindi creando la corsa loop in là

ma il punto di fare il ciclo di esecuzione era quello di consentire a ogni schermo di calcolare liberamente la logica in modo da finire per aver bisogno di una sorta di classe di abstractscreen che ha il Classe AD implementato

Im chiedendo se c'è un modo più semplice o più standard di thread di esecuzione per questa situazione

risposta

11

La libreria libGDX esegue già un thread di rendering separato per gli aggiornamenti del contesto OpenGL. Vedi http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

Abbiamo già imparato che il filo UI non viene eseguito in modo continuo ma solo pianificata l'esecuzione del sistema operativo se un evento deve essere spedito (approssimativamente: p). Ecco perché istanziamo un secondo thread che di solito chiamiamo thread di rendering. Questo thread è creato dal modulo Graphics che a sua volta viene istanziato dall'Applicazione all'avvio.

Il metodo ApplicationListener.render() sul vostro oggetto principale del gioco sarà invocato da questa discussione rendere una volta per ogni aggiornamento dello schermo (e quindi dovrebbe essere di circa 60 hz), quindi basta mettere il corpo del ciclo di rendering nell'implementazione di questo metodo .

È possibile creare un thread aggiuntivo di fondo (per esempio, per la logica di gioco) nel metodo di create tuo ApplicationListener (assicuratevi di ripulirlo nel metodo dispose). A parte il thread render, non penso che nessuno dei thread preesistenti sarebbe il posto giusto per la logica di gioco.

Per la comunicazione tra i thread, è possibile utilizzare uno qualsiasi degli approcci di sincronizzazione Java esistenti. Ho usato Java ArrayBlockingQueue<> per inviare richieste a un thread in background. E ho usato Gdx.app.postRunnable() per ottenere i miei thread in background per inviare dati al thread di rendering (tali Runnables vengono eseguiti sul frame successivo, prima che venga invocato render()).

+0

forse non ero chiaro Im consapevole che il rendering è un thread e scorre continuamente.ma stavo cercando di vedere se potevo avere un thread separato per la logica di gioco reale. se libGDX crea un nuovo thread per il rendering, come accedo al thread padre o all'origine? – Mintybacon

+0

@Mintybacon Ho aggiornato la mia risposta con ulteriori dettagli sulle opzioni di comunicazione tra thread. Spero che questo ti aiuti. –

0

Non sei sicuro di quello che vuoi dire, ma è normale che il disegno sullo schermo (riflettono le modifiche alla visualizzazione) è fatto da un thread dedicato dedicato (es vedi framework Swing). Questo perché è abbastanza difficile lasciare che più thread disegnino sullo schermo senza fare confusione - solo poche implementazioni lo fanno. Quindi, se si sta pianificando di implementare la struttura della GUI da soli, sarebbe consigliabile un approccio di disegno a thread singolo.

Per quanto riguarda la logica aziendale, dipende da molte cose. Un approccio molto semplice potrebbe infatti generare un nuovo thread per ogni attività. Questi thread possono quindi postare il risultato nella suddetta thread della GUI. Il problema con questo approccio è che la tua efficienza può diminuire in modo significativo se molte attività vengono eseguite simultaneamente nello stesso momento, perché in Java ogni thread si associa a un thread OS nativo. È possibile utilizzare i pool di thread per evitarlo. La libreria standard Java fornisce pool di thread come ThreadPoolExecutor o se si desidera un'astrazione leggermente più elevata, ExecutorService.

+0

Grazie Ill guardo nel ThreadPoolExecutor e torno a voi! – Mintybacon