OpenGL ES / ios Jean-Philippe Farrugia Jean-Philippe.Farrugia@univ-lyon1.fr
Sources «Developing Apps for ios», Paul Hagerty, Stanford university. Disponible sur ituneu. developer.apple.com Sources web diverses.
ios? Système des appareils mobiles Apple iphone, ipod touch, ipad. Base BSD. Très fortement orienté objet : Héritage direct de Nextstep... Langage standard : Objective C
Développement ios Ventes 4eme trimestre 2011 : 37.04 millions! Marché colossal...
Développement ios Mobile!= Machine «classique». Mémoire limitée. Display de petite taille. Interface(s) utilisateur différentes. Contraintes de design.
Hardware iphone 5 : CPU : custom ARM v7 GPU : PowerVR SGX 543. Intégrés sur un SOC Apple A6. 1Go de mémoire centrale.
Plan Développer pour ios. Le patron Modèle Vue Contrôleur. Objective C. Une application ios OpenGL ES 2.0 Inputs et capteurs.
Plan Développer pour ios. Le patron Modèle Vue Contrôleur. Objective C. Une application ios OpenGL ES 2.0 Inputs et capteurs.
Outils nécessaires Un mac...... ou un PC avec osx installé... ios SDK. Gratuit. Un iphone, ipad ou ipod touch. Une licence de développement. Uniquement pour tester et distribuer les applications sur les appareils physiques.
Composants logiciels Objective C : L autre langage C orienté objet. Philosophie totalement différente du C++. Runtime complexe. Multiples mécanismes de communication entre objets. Sur-ensemble de C et C++.
Composants logiciels Xcode : Environnement de développement privilégié pour osx et ios. Conseillé, mais pas obligatoire. Interface builder : Construction interactive d interfaces graphiques.
Composants logiciels UIKit / CocoaTouch Framework Apple pour le développement d applications ios. Très complet : Accès au périphériques. Accès aux médias. Multi-programmation (Threads).... Philosophie Modèle Vue Contrôleur.
Plan Développer pour ios. Le patron Modèle Vue Contrôleur. Objective C. Une application ios OpenGL ES 2.0 Inputs et capteurs.
Le MVC Patron de conception classique. Très utilisé : Frameworks pour applications graphiques : Swing, OpenStep, GTK... Webkits : CakePHP, Codeigniter... Indispensable pour la programmation ios.
Philosophie générale Fonctionnement et interaction des entités : L utilisateur interagit avec la vue et envoie un message. Le contrôleur intercepte ce message. Il le convertit en action interprétable par le modèle. Le modèle agit sur les données et effectue l action attendue. Le contrôleur détecte cette action et affecte les vues en fonction.
Organisation Les objets de l application sont partagés en trois «camps» : Le modèle : représentation des données et des traitements applicables sur ces données. La vue : Eléments constitutifs de l interface graphique. Le contrôleur : contrôle la manière dont le modèle est affiché dans la vue. Construire une application : choisir dans quel «camp» sont les objets créés.
Organisation Communications entre les trois groupes limitées : Plus facile à concevoir et à débuguer.? Contrôleur? Indépendance : le modèle et la vue sont totalement indépendants. Modèle Vue ie : ils ne communiquent pas directement!
Communications Contrôleur Outlet OK Modèle OK Vue Depuis le contrôleur?
Communications Contrôleur? Modèle NON! Depuis la vue? Vue
Communications Communications Vue -> Contrôleur. Importation des méthodes du contrôleur? Non : les vues sont génériques. Deux mécanismes principaux : Target Action : la vue envoie un message ciblé au contrôleur, sans connaitre son interface. En gros : définition d un callback. Delegation : un certain nombre de fonctions (protocole) de la vue sont «déléguées» au contrôleur. Un seul délégué par vue.
Remarques Une vue ne possède pas les données qu elle affiche. ie. les données affichées ne sont pas directement accessibles! Pourquoi? Généricité, encore... Performances : une vue n affiche qu une petite partie des données. Accès via une «data source» (protocole).
Communications Contrôleur Délégation Target action Modèle Vue Depuis la vue
Communications Contrôleur? Modèle NON! Depuis le modèle? Vue
Communications Communications Modèle -> Contrôleur : Importation des méthodes du contrôleur? Non : le modèle est indépendant de l interface. Mécanismes de communication : Notifications et Key Value Observing : messages broadcast émis par le modèle.
Communications Key Value Observing Contrôleur Notification Modèle Vue Depuis le modèle
Remarque Une application ios plus complexe : Plusieurs MVC reliés entre eux. Partages (total ou partiel) des vues. Partage (total ou partiel) des modèles. Plusieurs contrôleurs : Ex : un pour iphone, un pour ipad. Règle d or : limiter les connexions inter- MVCs au minimum. Peut vite devenir illisible...
Exercice 0 Considérons un jeu de bataille navale. Dans quel «camp» placez-vous les entités suivantes? La grille de jeu (dimensions 16x16, couleur bleue). La fonction «update» qui met à jour les positions de jeu. La fenêtre de visualisation (3D avec OpenGL). Le maillage 3D des navires. Le bouton «Feu!». La fonction «tirer sur la case (x,y)».
Plan Développer pour ios. Le patron Modèle Vue Contrôleur. Objective C. Une application ios OpenGL ES 2.0 Inputs et capteurs.
Présentation Langage de programmation objet. Composé d extensions du langage C. Sur-ensemble de C et C++. Basé sur SmallTalk. Runtime complexe : Beaucoup d opérations sont reportées au runtime.
Approche Objet Principale différence entre C++ et Objective C : C++ : Principalement basée sur une hiérarchie de classe. Communication entre classes = héritage. Statique! Objective C : protocoles, messages, notifications, délégation, typage dynamique... Communications statiques ET dynamiques.
Objets Données + opérations sur ces données. En Objective C : Données : variables d instance. Opérations : méthodes. Type générique pour les objets : id. Variable générique pour tous les objets : isa Pour connaitre la classe d appartenance d une instance.
Classes : déclaration Extensions des fichiers :.h inclusion avec #import Typage fort ou faible : MyClass *myobject1; // typage fort id myobject2; // typage faible
Classes : implémentation Déclaration et implémentation des méthodes : Extension du fichier :.m ou.mm Deux types de méthodes : classe et instance. Paramètres «entrelacés» : Plus intuitif pour la lecture.
Classes : messaging Appel d une méthode = envoi d un message. Notation «bracket». Messaging multiple possible. [myarray insertobject:anobject atindex:0]; [[myappobject thearray] insertobject:[myappobject objecttoinsert] atindex:0];
Exemple @implementation MyClass - (id)initwithstring:(nsstring *)aname { self = [super init]; if (self) { } name = [aname copy]; } return self; + (MyClass *)createmyclasswithstring: (NSString *)aname { return [[[self alloc] initwithstring:aname] autorelease]; } @end
Classes : Properties Génération automatique des accesseurs. Dans la déclaration : @property BOOL flag; @property (copy) NSString *nameobject; @property (readonly) UIView *rootview; Dans l'implémentation : @synthesize flag; @synthesize nameobject; @synthesize rootview; Utilisation : avec les messages «get» et «set» ou avec «.»
Protocoles Déclaration d une interface : Ensemble de méthodes implémentables par n importe quelle classe. Utile pour la délégation. Déclaration similaire à une classe, mais : Pas de variable d instance. Pas d implémentation. @protocol UISomeClassDelegate - (void)someprotocolmethod; @end Protocole implémenté @interface MyClass : NSObject <UISomeClassDelegate>
Demo Une application ios minimale : Un modèle de bateau de guerre. Un contrôleur pour le contrôler. Une vue pour l afficher.
Plan Développer pour ios. Le patron Modèle Vue Contrôleur. Objective C. Une application ios OpenGL ES 2.0. Inputs et capteurs.
OpenGL ES Version mobile d OpenGL. Deux versions disponible dans ios SDK : OpenGL ES 1.0 (iphone 1 / 3G). OpenGL ES 2.0 (iphone 3GS/4/ ipad). Basés sur les correspondants Open GL «classique».
OpenGL ES OpenGL ES 1.0 : Pipeline fixe uniquement. OpenGL ES 2.0 : Plus de pipeline fixe. Shaders! en GLSL. Utilisation en Langage C Inclus dans une vue Objective C.
OpenGL ES 1.0 Différences principales avec OpenGL : Pas de mode immédiat. Vertex Array obligatoire. Mais supporte quand même quelques instructions pour fixer l état courant : glnormal, glcolor, glmultitexcoord. Certaines primitives n existent plus : QUADS, QUADS_STRIP, POLYGON. Textures 2D uniquement, sans mipmap.
OpenGL ES 2.0 Mipmap disponible Framebuffer objects. Shaders. Plus de pipeline fixe. Incompatible avec OpenGL ES 1.0!
OpenGL ES 3.0 Très récent (Aout 2012) Proche d OpenGL 3.0 : Multiple render target. Transform feedback. Textures 3D Instanciation. NB : Aucun device GLES 3.0 à l heure actuelle...
Les vues Open GL ES EAGLView Vue OpenGL de base. Utilisation complexe. GLKView et GLKViewController Partie de GLkit : Ensemble de fonctions permettant une utilisation plus simple de GL ES 2.0. Permet la création d un vue GL très simplement. Peut remplacer (presque) toutes les fonctions du pipeline fixe.
Exercice 1 Examinez le code donné en exemple. Où sont la vue, le contrôleur et le modèle? Le modèle MVC est il scrupuleusement respecté? Si ce n est pas le cas, corrigez! Repérez le mécanisme de délégation. Faites un affichage un peu plus joli... Faites tourner l objet avec des boutons. Peut-on afficher deux vues GL?
Plan Développer pour ios. Le patron Modèle Vue Contrôleur. Objective C. Une application ios OpenGL ES 2.0. Inputs et capteurs.
Multitouch Périphériques d entrée / sortie : différent. Ecran capacitif multi-touch : Détecte les contacts sur l écran. Capacitif : électricité statique... Ne marche pas avec un stylet ou autre.
Multitouch Accès et utilisation : Quand l utilisateur touche l écran, l application délivre un évenement à la vue. Nécessite l implémentation de fonctions de réponse (héritage de UIResponder) : - (void) touchesbegan:(nsset*)touches withevent:(uievent*)event - (void) touchesmoved:(nsset*)touches withevent:(uievent*)event {! UITouch *touch = [touches anyobject];! CGPoint tappoint = [touch locationinview:vueconcernée];! } - (void) touchesended:(nsset*)touches withevent:(uievent*)event
Motion events Détection de mouvements. Deux périphériques concernés : Acceleromètre. Gyroscope (ios > 4 uniquement). Accéléromètre : mesure l accélération! Intégration double nécessaire pour la position. Très peu précis...
Motion events Accès et utilisation Fonctionne par délégation de la classe UIAccelerometer UIAccelerometerDelegate Objet partagé : sharedaccelerometer. Fonction du protocole à implémenter : - (void)accelerometer:(uiaccelerometer*)accelerometer didaccelerate!!!!! :(UIAcceleration*)acceleration Nécessite une initialisation :! //Configure and start accelerometer! [[UIAccelerometer sharedaccelerometer] setupdateinterval:(1.0 / Frequency)];! [[UIAccelerometer sharedaccelerometer] setdelegate:self];
Motion events Plus pratique : CoreMotion. Donne des informations de mouvement en fusionnant les informations de tous les capteurs. gravity, user acceleration, rotations... Initialisation : CMMotionManager* mymotionmanager; mymotionmanager = [[CMMotionManager alloc] init]; mymotionmanager.devicemotionupdateinterval = 1.0/30; if (mymotionmanager.isdevicemotionavailable) [mymotionmanager startdevicemotionupdates];
Exercice 2 Ajouter la gestion tactile de votre application. Ajouter une détection de mouvement dans votre application. Pour ceux qui ont un device... Faites tourner l objet en penchant l appareil. Avec l accéléromètre. Avec CoreMotion.