Pagine    Articoli    Prodotti    Forum    Cerca  
Nickname

Password


Non sei registrato?
Registrati a GPI qui!

Puoi anche attivare un vecchio utente GPI e chiedere una nuova password.
I Team

Mappa Team
I nostri utenti

Mappa Utenti
  LibGDX: un framework cross-platform per lo sviluppo di videogames
Pubblicato da Davide Sessi il 2014-05-20 17:52:30

 

 

 

 

Cos'è LibGDX

Libgdx è sostanzialmente un framework (non un engine, come vedremo) open source per lo sviluppo cross-platform di giochi (ma non solo) su tecnologia Java.
È un prodotto particolarmente indicato agli sviluppatori indie, in quanto 100% free, ma anche grosse aziende come Google, Glu, Kiwi Inc, Peak Games lo utilizzano o lo hanno utilizzato recentemente nei loro progetti. Giusto per citarne uno, Ingress è un gioco basato sulla realtà aumentata fatto da Google con LibGDX.
Si è detto che LibGDX "gira" su tecnologia Java, ma in realtà dietro le quinte, il framework usa pesantamente il linguaggio C sia per effetture quei task che sono tipicamente critici per le performance sia per incorporare librerie C di terze parti che forniscono features avanzate e/o tool di supporto.
Più importante ancora è il fatto che il framework fornisce una API comune che astrae completamente i dettagli implementativi delle varie piattaforme supportate (si pensi ad esempio alla perdita del contesto OpenGL su Android quando l'utente manda la app in background col tasto Home e alla ricreazione del contesto quando la app viene riportata in forground; tutto questo viene fatto in maniera trasparente dal framework). Le piattaforme supportate, anche note come back-end, sono:

 

  • Desktop (leggasi Window, Linux e MAC OS X)

  • Android

  • iOS

  • HTML5/GWT

Nella sostanza la tipica applicazione LibGDX è costituita da N progetti, di cui un progetto core che sfrutta le common API e contiene il 99.9% del codice e N-1 micro-progetti (uno per back-end supportato) che contengono il restante 0.1% del codice per l'avvio dell'applicazione (parliamo letteralmente di 5-10 righe di codice). È chiaro che qualora ci fosse l'esigenza di utilizzare API native dei vari backend (ad esempio lo stack protocollare bluetooth che come saprete non è un vero e proprio standard) questo resta possibile e va fatto nei rispettivi progetti, possibilmente definendo nel progetto core un layer di astrazione (il classico approccio OOP, per intendersi).

Uno dei principali punti di forza di LibGDX è la possibilità di eseguire e debuggare il codice su desktop come una normale applicazione Java. Questo ha il duplice vantaggio di:

  1. consentire l'utilizzo di tutti gli strumenti e le funzionalità supportati dalla JVM (es: Code Hot Swapping che permette di vedere immediatamente a run-time l'effetto delle modifiche apportate al codice)

  2. ridurre sensibilmente i tempi di sviluppo/debug. Scordatevi i tempi bibblici dell'emulatore Android così come la necessità di intallare l'applicazione su un device (tranne in rarissimi casi per esigenze estremamente specifiche).

 

Un altro aspetto importante è che Libgdx è un framework, non un game engine. Tipicamente i game engine si portano appresso una pletora di tool (es: editor di livelli) che vincolano lo sviluppatore e talvolta anche l'artist ad un workflow predefinito, spesso con un limitato margine di azione. La natura di framework tipica di LibGDX si rivela invece un punto di forza che permette di agire in totale libertà, senza imporre limiti alle idee o alla fantasia dello sviluppatore/artist, fino ad arrivare ad operazioni di basso livello (es: chiamate OpenGL, shader e così via) qualora fosse necessario. Ciò non toglie che nella stragrande maggioranza dei casi il framework offre una ricca gamma di features e strumenti che permettono di lavorare a più alto livello.

In fine, non è da sottovalutare la natura open source del progetto. Per apprendere più a fondo, più in fretta e ampliare i propri orizzonti non c`è niente di meglio che avere accesso ai sorgenti. Pensate alle migliaia di persone col rispettivo know-how e sparse per il mondo che quotidiamente ispezionano, correggono e ottimizzano lo stesso progetto. Una immensa base di conoscenza da cui poter attingere gratuitamente, e pechè no, a cui poter dare anche il proprio contributo. Io stesso negli ultimi mesi ho contribuito non poco al progetto fixando bug, implementando nuove feature o semplicemente condividendo le mie idee. È sicuramente un'esperienza che porta con se anche una crescita professionale, non ho dubbi.
Insomma, per farla breve, se avete talento, fantasia, passione e odiate l'idea di sentirvi con le mani legate LibGDX è lo strumento per voi. Se invece siete più prigri, meno curiosi o semplicemente pensate che un guscio vi dia più sicurezza, beh... esistono valide alternative la fuori. Ma il mio consiglio è di buttare lo stesso un occhio a LibGDX, chissà che anche voi non impariate a apprezzarlo, magari per ragioni completamente diverse dalle mie.  

 

Documentazione

Fino a qualche mese fa la documentazione online era un po'il punto debole di LibGDX. Infatti, in molti casi javadoc e tutorial erano carenti o addirittura obsoleti perchè nel frattempo il framework si evolveva vertiginosamente e le API sono cambiate (in alcuni casi anche pesantemente, ma comunque sempre in meglio).
Ma grazie allo sforzo di una community in continua espansione oggi la situazione è migliorata sensibilmente. Certo, la documentazione non è ancora perfetta ma è totalmente fruibile e il livello è sicuramente buono.
Laddove la documentazione presenta ancora dei buchi si può agevolmente rimediare ricorrendo al forum e al canale irc ufficiali, frequentati assiduamente da persone competenti (anche professionisti del settore) pronti a indirizzarti nella giusta direzione. Basti pensare che sul canale irc non ci sono mai meno di 100 utenti online. Ovviamente l'inglese è d'obbligo, ma al giorno d'oggi dove non lo è?
Per chi si avvicina per la prima volta a LibGDX suggerisco inoltre di leggere il libro Learning Libgdx Game Development, piuttosto ben fatto e interessante.
Qualora non si avessero le basi su OpenGL suggerisco di iniziare con Beginning Android Games dello stesso autore di LibGDX, Mario che a dispetto del nome è austriaco e fosse per me in quanto a disponibilità e competenze ribattezzerei in SuperMario. Fico
Quest'ultimo libro, pur non trattando nello specifico di LibGDX, è perfetto per acquisire i concetti base di OpenGL che saranno poi indispensabili per lavorare con LibGDX: texture, atlas, matrici di trasformazione, frustum, camera, ecc...
Chiaramente per chi parte da zero su OpenGL la curva di apprendimento di LibGDX non è trascurabile, ma se avete un po' di tempo e tanta voglia non ve ne pentirete. Occhiolino

Funzionalità

LibGDX offre completo supporto per i giochi 2D, ma grazie al lavoro di Xoppa e della community anche il supporto 3D inizia ad essere molto interessante.
Oltre a dare accesso a tutte (o quasi) le funzionalità di OpenGL in maniera cross-platform, il framework mette a disposizione il package scene2d che permette di costruire agevolmente interfacce GUI / HUD anche piuttosto complesse.
Certo se dovete fare una applicazione gui-intensive forse LibGDX non è la scelta migliore, ma è perfetta ad esempio per i setting dei giochi o per il tipico inventario degli RPG. Anzi, a dire il vero, le potenzialità di scene2d vanno ben oltre gli esempi appena citati.
Sempre scene2d si rivela un ottimo strumento per lo sviluppo di alcune tipologie di giochi 2d, in particolare per i cosiddetti board-games.
Ancora, LibGDX supporta nativamente e in maniera cross-platform le png nine-patch tanto care a chi arriva dal mondo Android.
Inoltre le action di scene2d permettono di creare animazioni complesse in maniera intuitiva e con poche righe di codice. L'utilizzo di scene2d non è comunque obbligatorio, ma completamente a vostra discrezione.
Con LibGdx è inoltre disponibile una serie di tool di supporto quali ad esempio particle editor, texture packer/unpacker, bitmap font generator, ecc...
Il framework offre anche le cosiddette extension, componenti aggiuntive opzionali che tipicamente sono wrapper JNI di librerie C di terze parti come ad esempio Box2D e Bullet (2 noti physics engine).
Sono presenti moltissime altre features, come ad esempio il supporto alle tile map o all'internazionalizzazione/localizzazione completamente cross-platform (quest'ultimo sviluppato dal sottoscritto ed attualmente presente solo nelle nightly builds), ma queste sono quelle che più mi hanno colpito, trattandosi di una framework nato inizialmente come wrapper OpenGL.
Sul sito ufficiale potete trovare un elenco più completo delle funzionalità offerte da LibGDX.

Limitazioni

Sono ben poche le limitazioni di LibGDX, soprattutto se il vostro focus è sul 2D.
Probabilmente la più grande pecca (comunque trascurabile per la stragrande maggioranza delle applicazioni) è il supporto al rendering dei sistemi di scrittura complessi come l'arabo e il cinese (feature per altro mancante in molti, se non tutti, i framework/engine concorrenti).
Questo in certi casi potrebbe limitare l'internazionalizzazione e quindi in parte la diffusione della app, ma sono comunque supportate lingue come il coreano e il giapponese. Tuttavia qualcosa si sta muovendo, non mi sorprenderei di vedere queste lingue supportate nel giro di qualche mese.
Purtroppo a causa delle limitazioni intrinseche di HTML5 (JavaScript in particolare) alcune funzionalità non sono disponibili per questo back-end, una su tutte il multi-threading. Tuttavia è possibile avviare l'applicazione come Applet senza particolari limitazioni. Ebbene sì, ho detto applet... non guardatemi storto per favore. Linguaccia
Un'altra questione ricorrente è la migrazione alle nuove versioni del framework. Il team di sviluppo non si fa molti scrupoli a rompere la retrocompatibilità o ad abbandonare il pregresso se questo comporta benefici quali efficienza, pulizia delle API, funzionalità, nuove e più avanzate tecnologie. Se da un lato questo non è solitamente ben visto dagli sviluppatori, dall'altro ha il vantaggio di offrire un prodotto sempre migliore ma soprattutto ti contringe a restare al passo coi tempi così contribuendo alla tua crescita professionale, anche al di là del mondo puramente videoludico. Nonostante io non sia il tipo che si fossilizza facilmente, credo di poter affermare che ho imparato di più negli ultimi mesi lavorando su LibGDX di quanto non abbia imparato nei precedenti 3 anni.

Stabilità

La stabilità del framework è notevole. Certo i bug non mancano, ma l'attività sul progetto è fervida e la community molto attiva, col risultato che i bug vengono prontamente risolti e i fix resi immediatamente disponibili nelle nightly builds.
Io stesso ho contributo al fix di alcuni bug sul backend Android e nel core.
Inoltre, vista la velocità con cui sta evolvendo il progetto, LibGDX ha recentemente adottato un piano di rilascio che prevede l'uscita di nuove release stabili ogni 2 settimane circa. Questo dovrebbe contenere in buona parte il problema della migrazione alle nuove versioni del framework in quanto i cambiamenti delle API sono ora più progressivi essendo frazionati su rilasci successivi. Anzi, finalmente iniziano ad uscire versioni retrocompatibili grazie anche al fatto che il progetto ha raggiunto una sua maturità e le API principali sono ormai consolidate.

Supporto iOS

Grazie al recente utilizzo di RoboVM (un one-man-project che ha dell'incredibile, davvero!!!) e al grande lavoro di integrazione da parte della community LibGDX, il backend iOS è pienamente funzionante e sull'app-store di Apple esistono già una cinquantina di applicazioni praticamente tutte sviluppate con LibGDX e il loro numero cresce rapidamente. Per una lista delle app andate al fondo della home page.
A proposito del problema "retrocompatibilità" menzionato in precedenza vale la pena citare il fatto che fino a pochi mesi fa era comunque possibile portare le app LibGDX su iOS (e lo è ancora se si usano vecchie versioni del framework), ma solo tramite Xamarin che prevede una licenza a pagamento e inoltre il giro da fare per effettuare il porting, la cosiddetta tool-chain, era piuttosto lento e perverso: sorgente Java -> sorgente C# -> codice ARM.
Anche le prestazioni in esecuzione erano piuttosto scarse, con un sensibile crollo del frame rate (che nei giochi è vitale).
Ora con RoboVM, che è 100% free, si è persa completamente la retrocompatibilità  ma le prestazioni a tempo di compilazione e soprattutto di esecuzione sono nettamente migliori e la tool-chain è molto più "sana", in quanto il byte code Java viene tradotto direttamente in codice ARM (per chi non lo sapesse l'ARM è il processore equipaggiato dai dipositivi iOS e dalla maggioranza dei dispositivi Android, e sempre tra parentesi ha uno degli assembler in assoluto più belli che io abbia mai visto. Anche nella console Wii uno dei 2 processori è un ARM e disassemblarne il sistema operativo, patcharlo e fargli avviare i giochi da HD USB è stata una vera libidine, lo giuro. Per chi ha una Wii e conosce il cIOS d2x io, insieme a chi mi ha preceduto, ne sono l'autore: davebaol). Chiusa parentesi. Santarellino
Ma torniamo a bomba su RoboVM, per dare un'idea grossolana delle sue prestazioni basti pensare che test fatti su Mac confrontando una applicazione in Java puro e la stessa applicazione compilata con RoboVM risulta che quest'ultima è più lenta del 30-40%.
A qualcuno potrà sembrare un risultato deludente ma in realtà è fenomenale se si pensa che la JVM è un progetto ottimizzato da centinaia di persone nel corso degli utlimi 15-20 anni, mentre RoboVM è sviluppato da una sola persona (ora mantenuto a livello open source) ed è piuttosto recente avendo meno di un anno di vita.
È ovvio quindi che ci siano ancora ampi margini di miglioramento. Se per assurdo fosse stato possibile impiegare su RoboVM lo stesso effort impiegato sulla JVM quasi certamente il rapporto sarebbe ribaltato.
Altri test di confronto effettuati su dispositivi Android e iOS con hardware paragonabile riportano che con la dovuta attenzione in fase di programmazione il frame rate (AKA FPS) resta invariato o quasi.
Inoltre, i test menzionati risalgono ormai a qualche mese fa e bisogna considerare che le recenti versioni di RoboVM hanno apportato molte migliorie contenendo il più possibile l'allocazione interna di oggetti per limitare l'innesco del garbage collector, particolarmente gravoso per i dispositivi mobili.
Una piccola curiosità: RoboVM include nella app buona parte del runtime Java (anche questo compilato in ARM ovviamente). Questo significa che una app che su backend Android/Desktop pesa X MB cuberà circa (X + 40) MB su backend iOS. Un piccolo scotto da pagare certo, ma volete mettere la figata?!? Sorpreso

Conclusioni

Esistono dei competitor di LibGdx, alcuni molto validi, come ad esempio Unity, ma la maggior parte di essi non sono free e/o sono framework/engine che per come sono concepiti rischiano di limitare pesantemente la libertà di azione dello sviluppatore.
Io ad esempio tendo a sentirmi legato mani e piedi con certi engine, perchè funzionano alla grande finchè stai nei binari ma appena devi fare qualcosa di nuovo, un po'fuori dagli schemi o comunque non previsto a priori dagli autori sei fregato.
LibGDX, no, dopo mesi di utilizzo intensivo non mi ha mai dato questa sensazione. Anzi, ogni volta che dovevo affrontare un problema nuovo e pensavo di dover scrivere tonnellate di codice, dopo una breve ispezione ai sorgenti o una domada mirata sul canale irc, scoprivo con gioia che bastava estendere una classe o nel peggiore dei casi modificare un paio di classi del framework e integrarle nei miei sorgenti.
In conclusione, se avete intenzione di iniziare a sviluppare un game oppure un live wallpaper cross-platform senza costi di licenze e con un buon supporto tecnico la mia risposta è sicuramente LibGdx.


Ci sarebbe sicuramente molto altro da dire, ma il tempo a mia disposizione purtroppo è quello che è., soprattutto se voglio evitare che mia moglie mi sbatta fuori di casa a pedate nel... Bocca sigillata
Quindi se avete delle domande mirate sarò ben lieto di rispondere, nei limiti delle mie competenze.

Campagne crowfunding

Just One Line
Siamo presenti su

     
Copyright ©2016 - Manifesto - Privacy - Termini di Servizio - Community - Collaboratori - Contattaci