Come sarebbe un piano di studio ideale per lo sviluppo di videogames?

N.B.: articolo WIP

Ciao a tutti, oggi si va a fare un enorme esperimento mentale.

Qualche tempo fa, basandomi sull’IGDA Curriculum Framework, ho provato a pensare: come si potrebbe comporre un piano di studi ideale di tre anni riguardante lo sviluppo di videogames?

Ovviamente si suppone che chi voglia fare un percorso del genere abbia una buona base sull’informatica e sulla programmazione in generale.

Il piano di studi da me ideato è diviso in corsi che vanno a identificare i seguenti sottopercorsi:

  • Game design
  • Computer science
  • Game development
  • Art skills
  • Game studies
  • Game production

Per ciascun corso, sarà presente una descrizione, un syllabus, o dei link a corsi di università reali che mostreranno informazioni a riguardo.

Prima di entrare nei dettagli, faccio una lista di quelli che a mio modesto parere sono i prerequisiti necessari per affrontare gli argomenti che poi seguono:

Matematica discreta

Libro: Discrete Mathematics with Applications – Susanna S.Epp

Algebra lineare

Libro: Linear Algebra – Lipschutz, Lipson

Algoritmi e strutture dati

Libro: Data structures using C – Reema

Architettura dei calcolatori

Libro: Structured Computer Organization – Tanenbaum

Analisi matematica

Libro: Calculus – Larson, Edwards

Programmazione

Libro: C How to program – Deitel, Deitel

Fondamenti di informatica

Libro: Computer science illuminated – Dale, Lewis

Sistemi operativi

Libro: Operating Systems Concepts – Silberschatz, Galvin, Gagne

Reti di calcolatori

Libro: Computer Networks – Tanenbaum, Wetherall

Ingegneria del software

Libro: Software engineering – Sommerville

Quella che segue è la struttura che mi è venuta in mente.

1° parte

Introduction to videogame studies

Introduzione allo studio del medium videogioco nella quale si esaminano le sue funzioni culturali, educazionali e sociali.

Syllabus

  1. Studio dei videogiochi
  2. L’industria
  3. Cos’è un gioco
  4. Storia
  5. Estetica del videogioco
  6. Cultura del videogioco
  7. Cultura del giocatore
  8. Narrativa
  9. Serious games
  10. Videogiochi e rischi

Libro

  • Understanding Video Games: The Essential Introduction

Game design 1

Corso di introduzione alla disciplina del game design. L’approccio è inizialmente analitico, diventa poi pratico con la prototipazione e con le tecniche di design iterativo. La parte finale è dedicata alla comprensione dell’integrazione del game design all’interno di un team di sviluppo reale.

Syllabus

  1. Basi di game design
    1. Il ruolo del game designer
    2. Struttura di un gioco
    3. Elementi formali
    4. Elementi drammatici
    5. Sistemi dinamici
  2. Progettare un gioco
    1. Concettualizzazione
    2. Prototipazione
    3. Prototipazione digitale
    4. Playtesting
    5. Funzionalità, completezza ed equilibrio
    6. Divertimento e accessibilità
  3. Lavorare come game designer
    1. Strutture di team
    2. Fasi di sviluppo
    3. Il documento di design
    4. Comprendere la game industry
    5. Vendere un’idea alla game industry

Libro

  • Game Design Workshop – A playcentric approach to creating innovative games

Practical game development 1

Corso di introduzione allo sviluppo di videogames 3D con l’utilizzo di Unity.
Si studiano e si applicano le tecniche basilari di sviluppo di videogiochi, incluse la gestione degli input, dei suoni, la fisica, le camere, l’intelligenza artificiale, le interfacce utente e qualche cenno sul multiplayer online.
L’approccio è molto incentrato sulla pratica su Unity e SDL, al termine è previsto un progetto nel quale si implementa un videogioco in 3 dimensioni.

 Syllabus

  1. Introduzione alla programmazione di giochi
  2. Oggetti di gioco e grafica 2D
  3. Vettori e fisica di base
  4. Intelligenza artificiale
  5. OpenGL
  6. Grafica 3D
  7. Audio
  8. Sistemi di input
  9. Camere
  10. Rilevamento collisioni
  11. Interfacce utente
  12. Animazione con scheletri
  13. Grafica intermedia
  14. File dei livelli e dati binari

Libri

  • Game programming algorithms and techniques – Sanjay Madhav
  • Game Programming in C++: Creating 3D Games – Sanjay Madhav
  • Unity in Action: Multiplatform Game Development in C# with Unity 5 – Joe Hocking

Computer graphics

Corso di introduzione alla computer grafica. Si svolge su due filoni, uno di teoria e uno pratico nel quale, utilizzando C++ e OpenGL, si mettono in pratica i concetti teorici.

Syllabus

  1. Matematica miscellanea
  2. Algoritmi di rasterizzazione
  3. Processamento del segnale
  4. Algebra lineare
  5. Matrici di trasformazione
  6. Viewing
  7. Eliminazione della superficie nascosta
  8. Shading
  9. Ray tracing
  10. Mappatura delle texture
  11. La pipeline grafica
  12. Strutture dati per grafica
  13. Sampling
  14. Curve
  15. Animazione
  16. Utilizzo dell’hardware grafico
  17. Costruzione di applicazioni grafiche interattive
  18. Luce
  19. Colore
  20. Percezione visuale
  21. Riproduzione del tono
  22. Illuminazione globale
  23. Modelli di riflessione
  24. Rendering image-based
  25. Visualizzazione

Libri

  • Fundamentals of computer graphics – Peter Shirley e altri
  • Learn OpenGL
  • OpenGL Programming guide – Shreiner e altri

2° parte

History of video games

Vabbè, abbastanza banale. Studiare la storia per poter guardare le cose in prospettiva. Utile approfondire l’evoluzione della tecnologia negli anni.

Libro

  • The Ultimate History of Video Games – Steven L. Kent

Level & world design

Corso utile a mettere in pratica i concetti visti in Game design 1 (design iterativo incluso) nella creazione di un livello, di un mondo o di un ambiente di gioco in generale.
L’approccio è sia teorico sia pratico, si vedrà come prototipare livelli usando AutoREALM e realizzarli effettivamente in Unity.
Si conclude con un progetto realizzato in Unity.

Syllabus

  1. Previsualizzazione
  2. Pianificazione e costruzione di livelli
  3. Illuminazione, texturing, particelle, effetti e audio
  4. Attori, oggetti di scena, item e dettagli sulla camera
  5. Design per genere
  6. Scripting
  7. QA e play-testing
  8. Considerazioni per gli MMOG

Libri

  • Designing virtual worlds – Richard A. Bartle (utile per approfondire)
  • Building levels in Unity – Volodymyr Gerasimov
  • Ultimate Game Design: Building Game Worlds – Tom Meigs

Game engine development 1

In questo corso si introduce dal punto di vista teorico e pratico l’architettura di un motore di gioco. Si affronta in dettaglio la struttura e lo sviluppo del motore di rendering in C++.

  1. Introduzione
    1. Fondamenti di ingegneria del software per giochi
    2. Matematica 3D
  2. Sistemi a basso livello
    1. Sistema di supporto
    2. Risorse e file system
    3. Game loop e simulazione real-time
    4. Human Interface Devices
    5. Strumenti per debug e sviluppo
  3. Grafica e moto
    1. Motore di rendering
    2. Sistemi di animazione
    3. Collisioni e dinamiche del corpo rigido

Libri

  • Game Engine Architecture – Jason Gregory
  • OpenGL Superbible: Comprehensive Tutorial and Reference – Sellers

Artificial intelligence

Corso che introduce tecniche di intelligenza artificiale utilizzate nell’industria videoludica. Le varie tecniche sono viste sia in teoria, sia in pratica (sempre con Unity).

Syllabus

  1. Tecniche
    1. Movimento
    2. Pathfinding
    3. Decision making
    4. Tattiche e strategie
    5. Apprendimento
    6. Giochi da tavolo
  2. Tecnologie di supporto
    1. Gestione dell’esecuzione
    2. Interfacciarsi col mondo
    3. Strumenti e creazione di contenuti
  3. Progettare IA di gioco
    1. Sparatutto
    2. Guida
    3. Strategico in tempo reale
    4. Sport
    5. Strategico a turni

Libro

  • Artificial Intelligence for Games – Ian Millington
  • Unity 2018 Artificial Intelligence Cookbook – Jorge Palacios

3° parte

Computer animation

Syllabus

  1. Background tecnico
  2. Interpolazione e tecniche di base
  3. Algoritmi avanzati
  4. Fenomeni naturali
  5. Modellare e animare figure articolate

Libro

  • Computer animation: algorithms and techniques

Advanced game mechanics design

In questo corso ci si affaccia alla progettazione di meccaniche di gioco complesse.

Syllabus

  1. Progettazione di meccaniche di gioco
  2. Emergenza e progressione
  3. Sistemi complessi e struttura dell’emergenza
  4. Economia interna
  5. “Machinations”
  6. Meccanismi comuni
  7. Design patterns
  8. Simulare ed equilibrare giochi
  9. Costruzione di economie
  10. Integrazione di level design e meccaniche
  11. Meccanismi di progressione
  12. Meccaniche significative

Libro

  • Game Mechanics: Advanced Game Design – Ernest Adams

Practical game development 2

Si raffinano le competenze acquisite in Practical game development 1 e si implementa un gioco che fa uso di meccaniche di gioco complesse, come ad esempio può essere un simulatore di macroeconomia. La complessità va gestita sia sul piano del design sia su quello dell’ingegneria del software. Il tutto, con l’utilizzo di Unity.

Syllabus

  1. Implementazione di meccaniche di gioco avanzate
  2. Ottimizzazioni Unity

Computational Geometry

4° parte

Game production

Corso introduttivo al processo di produzione di un gioco, si parla delle difficoltà intrinseche, dei vari componenti del team di sviluppo, delle documentazioni che è necessario produrre e delle varie fasi di sviluppo.
E’ evidente il legame di questa materia con l’ingegneria del software.

Syllabus

  1. Difficoltà dello sviluppo di giochi
  2. Componenti di un gioco
  3. Contesto di mercato
  4. Elementi di design chiave
  5. Documento di design del gioco
  6. Documento di design tecnico
  7. Piano di progetto
  8. Tracciare i task
  9. Strategie di outsourcing
  10. Pubblicazione del gioco

Game design 2

Si affrontano in maniera completa delle tecniche poco comuni di game design.

Syllabus

  1. Generazione procedurale
  2. Giochi pervasivi
  3. Gamification

Online game development

Syllabus

  1. Internet
  2. Sockets
  3. Serializzazione di oggetti
  4. Replicazione di oggetti
  5. Topologie di rete e giochi di esempio
  6. Latenza, jitter e affidabilità
  7. Gestione migliore della latenza
  8. Scalabilità
  9. Sicurezza
  10. Motori di gioco reali
  11. Servizi per giocatori
  12. Server di cloud hosting dedicati

Libro

  • Multiplayer game programming: architecting networked games – Glazer, Madhav

3D modeling

5° parte

Serious game design

Game engine development 2

Completamento di Game Engine Development 1.
Si prosegue lo sviluppo di un motore di gioco con la creazione di un sistema di gameplay.

  1. Introduzione ai sistemi di gameplay
  2. Comportamento a run-time

Audio design

6° parte

Game Company creation

Virtual reality design

Syllabus

  1. Introduzione e background
    1. Cenni storici
    2. Linee guida di design
  2. Percezione
    1. Realtà oggettiva e soggettiva
    2. Modelli e processi di percezione
    3. Modalità di percezione
    4. Percezione di spazio e tempo
    5. Stabilità percettiva, attenzione e azione
    6. Percezione: linee guida di design
  3. Effetti di salute collaterali
    1. Motion sickness
    2. Problemi alla vista
    3. Sfide hardware
    4. Latenza
    5. Misurare sickness
    6. Linee guida per ridurre effetti collaterali
  4. Creazione contenuti
    1. Concetti ad alto livello
    2. Design degli ambienti
    3. Condizionare il comportamento
    4. Transizione alla creazione di contenuti VR
    5. Linee guida di design
  5. Interazione
    1. Interazione human-centered
    2. Concetti di interazione in VR
    3. Dispositivi di input
    4. Pattern e tecniche di interazione
    5. Linee guida di interazione
  6. Design iterativo
    1. Filosofia del design iterativo
    2. Fase di definizione
    3. Fase di creazione
    4. Fase di apprendimento
    5. Linee guida di design iterativo
  7. Presente e futuro della realtà virtuale

Libro

  • The VR book: human-centered design for virtual reality – Jason Jerald

Un clone di Tetris realizzato su Unity

Scrivo questo post per mostrare un clone di Tetris realizzato dal sottoscritto in collaborazione con un amico.

Si tratta di un’implementazione che, dal punto di vista delle meccaniche di gioco, prova ad essere pulita e performante, si evita quindi di utilizzare raycast o elementi fisici, preferendo a questi le semplici trasformazioni geometriche in combinazione con una matrice per la gestione della griglia di gioco.

La cosa più interessante è la gestione della griglia di gioco, la quale avviene su due piani, quello grafico (posizioni dei pezzi, trasformazioni, ecc.) e quello “effettivo” (matrice di short che indica la presenza o meno di un cubo in ciascuna posizione).

E’ presente anche una banale interfaccia utente che sicuramente non rispetta i migliori criteri di usabilità ma fa il suo dovere. La sua aggiunta è stata una scusa per imparare il funzionamento delle interfacce utente su Unity3D, e sono certo che in un progetto futuro ci sarà maggiore attenzione e cura a riguardo.

Può essere utile a chi vuole imparare qualcosa di Unity.
Se invece si vuole semplicemente giocare, basta lanciare il file .exe presente nel repository.

LINK

Prego il Signore che The Tetris Company non mi faccia causa.

La progettazione di un motore di gioco è una cosa bella

A ogni pagina di Game Engine Architecture me ne rendo sempre più conto: realizzare un motore di gioco serio è un lavoro di una difficoltà estremamente elevata.

L’intenzione per la tesi di laurea (frequento il corso di Informatica presso Unica) sarebbe quella di riuscire nell’impresa, ma francamente sono sicuro che riuscirci anche solo in parte sarebbe un gran successo.

Se da una parte, quindi, mi accorgo che realizzare un motore di gioco diventa un sogno sempre meno raggiungibile (almeno in solitario e in soli 2 anni), d’altra parte proseguo nella lettura del libro Game Engine Architecture, per un motivo molto semplice.

E’ bello vedere, attraverso questo libro, come la creazione di un motore di gioco porti con sè delle necessità particolari, come ad esempio quelle di gestire delle risorse (audio, modelli 3D e molto altro), sfruttare al massimo l’hardware, semplificare il lavoro di un team e far comunicare tra loro delle componenti software ben separate ma interdipendenti (es. gestore della memoria, gestore della fisica, gestore del rendering…).

In ognuna di queste componenti, la natura (golosa di risorse) di un videogioco costringe a delle scelte che raramente diventano necessarie per un qualsiasi altro software.

Questo si ripercuote sulla scelta di alcune strutture dati, sulla particolare gestione della memoria e su molto altro. Facciamo alcuni esempi.

L’utilizzo di numerose malloc/new e free/delete in C/C++ rallenta tantissimo il programma perché a ogni chiamata si cambia la sua modalità di esecuzione (da user mode a kernel mode e viceversa).
Per ovviare a questo problema si evita assolutamente di allocare/deallocare memoria all’interno di cicli (verrebbe ripetuta più volte) e si cerca, invece, di prevedere già in anticipo quanta memoria verrà usata e allocarla una sola volta (es. prima di caricare un livello sappiamo più o meno quanta memoria verrà utilizzata) in modo da effettuare una sola volta il passaggio da user mode a kernel mode e viceversa. Una volta fatto ciò si effettuano operazioni sullo heap in modo tale che pesino il meno possibile e con un po’ di astuzia.

E a proposito del livello… spesso (anche in giochi abbastanza vecchiotti tra l’altro) si utilizzano strutture dati particolari per la sua gestione, vedi lo stack double-ended.

Da una parte si caricano le risorse utili per TUTTO il livello (o anche il gioco, dipende sempre dalle esigenze), dall’altra quelle che si utilizzano solo momentaneamente.

Non vengono utilizzati due stack separati perché ciò porterebbe ad effettuare operazioni sullo heap: la memoria necessaria allo stack double-ended è stata già allocata in precedenza, quindi occorre anche riscriversi a mano tutta la gestione delle operazioni su questo particolare stack, con un occhio di riguardo all’ottimizzazione.

Parlando di ottimizzazione… che dire dell’allineamento dei dati? In C e C++ è possibile ottimizzare al meglio l’esecuzione di certe istruzioni da parte della CPU allineando i dati in maniera tale che la CPU, appunto, utilizzi il più basso numero possibile di cicli.

La CPU accede in maniera più veloce ai dati se questi si trovano in un indirizzo di memoria divisibile per la dimensione della variabile, quindi vale la pena utilizzare un pochino di spazio in più per ogni variabile ma avere poi la certezza che questa sia allineata correttamente spostandola manualmente di qualche byte se necessario (si lavora sempre sulla memoria heap).

Due link per approfondimenti a riguardo:

  • https://en.wikipedia.org/wiki/Data_structure_alignment
  • http://www.agner.org/optimize/optimizing_cpp.pdf

Ma non finisce qui: siamo abituati a utilizzare Git o un altro software di controllo di versione per gestire del codice sorgente. Ciò viene comodo perché i sorgenti sono leggeri e, soprattutto, sono file di testo (e Git, si sa, fa miracoli con questi).

Potrebbe essere necessario, però, utilizzare un VCS per gestire delle risorse che, come si può immaginare, sono file binari e soprattutto sono pesanti. E qui i soliti VCS, sebbene sempre funzionali, potrebbero portare altri problemi che necessitano di essere risolti (più difficile l’utilizzo concorrente del VCS a causa dei file binari, file di dimensione maggiore comportano utilizzo maggiore della banda, ecc.).

Probabilmente aggiornerò questo articolo man mano che scopro cose interessanti riguardo alla progettazione di motori di gioco.

Registrare gameplay: ne vale ancora la pena?

C’è una cosa che appare su tutti i canali di videogame: i gameplay.

Il che è abbastanza normale, visto che il gameplay è l’essenza di ogni videogioco. E’ possibile, però, affermare che il classico videogameplay col tizio che si siede davanti a un PC, una XBOX o una Playstation (par condicio) con tanto di cuffie e microfono è una scena già vista troppe volte su Youtube.

E attenzione: anche io mi inserisco nel calderone, perché sono uno dei tanti che ha provato ad attirare qualcuno nel suo canale facendo ANCHE gameplay. Però ad un certo punto mi son chiesto: come si può pensare di ottenere iscrizioni al proprio canale facendo cose che tutti fanno?

Beh, un modo ci sarebbe, ovvero non fare cose che tutti fanno! Il che si traduce in fare giochi che nessuno fa, cosa che… è anch’essa abusata, visto che praticamente non esiste gioco che non abbia il suo videogameplay. E se esiste vuol dire che non rispetta il copyright di qualche software house.

Pure io ho provato a registrare OMSI ed Euro Truck Simulator, ma sicuramente con scarso successo.

Altro modo per dare un senso alla registrazione di un gameplay è sicuramente proporre un gioco in maniera diversa dal solito.
Sono pochi i giochi che permettono di uscire dai soliti schemi, e uno di questi è senza dubbio Minecraft, visto che è praticamente il gioco da Youtube per eccellenza grazie alle infinite possibilità che offre. Anche Minecraft, però, è stato visto in tutte le salse.

Suvvia, diciamocelo: i video di gameplay andavano bene qualche tempo fa, quando ancora ci si chiedeva “questo gioco è divertente, perché non registrare un video di gameplay?” invece che “quale video di gameplay non è stato ancora fatto?”. Quindi basta, basta davvero con ‘sti gameplay.

I videogiochi possono essere trattati in tantissimi altri modi, e non trovo produttivo fossilizzarsi su una sola tipologia di video, in primis perché questo atteggiamento rende Youtube un immondezzaio di gameplay, e in secundis perché tutti (e mi ci metto anch’io) abbiamo rinunciato alla nostra originalità solo per provare a prendere qualche visualizzazione in più.

Cosa che poi nemmeno avviene.