Post mortem Porter Quell Memento sur la PlayStation Vita

Daniel Schuller et moi avons formé Bigyama en 2012, après avoir travaillé sur de nombreux titres tels que Magic the Gathering: Duel of the Planeswalkers et Star Wars: Battlefront. La société a débuté par un saut intempestif dans PlayStation Home et par un déménagement en Écosse, avant un retour à Nottingham et un recentrage sur nos principaux talents: la programmation et la réalisation de grands jeux! Notre première étape a été de fournir les outils techniques nécessaires pour aider Fallen Tree Games à amener Quell Memento sur la PlayStation Vita..


Cet article explique comment, chez Bigyama, nous avons porté Quell Memento sur Vita. Si vous souhaitez en savoir plus sur le design de Quell, veuillez consulter l'article de Fallen Tree, The Making of Quell.


Commencer

Memento est le troisième jeu de la série Quell; les jeux précédents avaient très bien fonctionné sur mobile et je connaissais Joe et Lewis chez FTG depuis un certain temps, ayant déjà travaillé avec eux chez Free Radical Design avant sa disparition. C'était génial d'avoir la chance de retravailler avec eux et de pouvoir travailler sur une nouvelle plate-forme..

Il y a quelque temps, j'avais rencontré l'équipe de Honeyslug, les développeurs du succès des Mini Kahoots pour PSP, qui avaient ensuite développé le titre de lancement de Vita, Frobisher Says. Ils nous ont mis en contact avec l'équipe des relations avec les développeurs de SCEE (Sony Computer Entertainment Europe)..

Nous sommes allés au studio SCEE de Londres et avons discuté des options - PSP Mini, PlayStation Mobile ou PlayStation Vita - qui donnent chacune aux développeurs un accès à Vita avec différents degrés de fonctionnalité. Après quelques échanges, nous avons décidé que la meilleure option pour Quell était de créer un jeu Vita natif, nous donnant un accès complet à la puissance de Vita et à toutes les fonctionnalités du PSN, telles que les classements et les trophées..



S'attaquer au port

Moteurs

Lors de la création d’un jeu, la première tâche consiste souvent à choisir le moteur à utiliser. Il existe un certain nombre de moteurs disponibles sur la Vita, mais la plupart sont excessivement complexes du point de vue technique et tout simplement irréalisables du point de vue financier pour un projet de cette taille..

Il existe également PhyreEngine, développé par Sony et que les développeurs enregistrés PlayStation peuvent utiliser librement. Il a été utilisé pour développer des jeux allant de Demon Souls à Colin McRae: Dirt et Journey. Encore une fois, comme vous pouvez probablement l’imaginer, c’était bien plus que ce dont nous avions vraiment besoin, comme essayer de casser une noix avec un marteau.

Quell Memento a commodément utilisé le propre moteur de Fallen Tree Games. Le code du moteur et celui du jeu ont été écrits à l'aide de C. C et ses variantes constituent le langage standard utilisé pour créer des jeux. Si vous développez un jeu sur de nombreuses plates-formes différentes, vous vraiment ne devrait pas aller avec autre chose.

Cela a rendu notre décision évidente: nous voudrions que le moteur de Fallen Tree Game soit lui-même intégré à la Vita. C’était gratuit, il a été spécialement conçu pour exécuter les jeux Quell et c’était une belle base de code.

Cela peut sembler contre-intuitif d'ignorer tous les moteurs qui fonctionnent déjà sur Vita et de choisir un moteur qui ne le fait pas, mais déplacer un jeu sur un nouveau moteur peut signifier recréer le jeu entier pour ce moteur car il fonctionne de manière très différente. . Le portage du moteur répond à la racine du problème. Vous n'avez pas à vous soucier de recréer chaque fonctionnalité de jeu individuelle - vous devez simplement recréer la fonctionnalité sur laquelle elles reposent toutes..

Si vous avez de la chance, un port peut vous fournir l'occasion de développer votre propre technologie pour une nouvelle plate-forme tout en étant payé pour le faire. Bigyama a son propre moteur interne et, si Quell Memento avait été construit sur un moteur sans accès au code source, tel que UDK ou Unity, cela aurait valu la peine d'être envisagé..

Zones-clés

La beauté de développer un port est que vous avez un objectif clair de viser.

La beauté de développer un port est que vous avez un objectif clair de viser.

Cela peut sembler décourageant au début, mais il peut être divisé en plusieurs domaines clés: graphiques, saisie utilisateur, audio, réseau et sauvegarde des jeux..

Comme je l'ai déjà mentionné, le portage du moteur signifiait qu'il n'y avait pas de code de jeu important à écrire ou à réécrire; Dans cette situation, faire fonctionner ces zones clés devrait signifier que le jeu se prend en charge tout seul. Les premières étapes de la création d'un jeu sont un jeu d'enfant pour trouver le plaisir de jouer, mais avec un port, c'est un jeu d'enfant d'être assez opérationnel pour comprendre où il est cassé..

Graphique

Lorsque vous faites un port, commencez par les graphiques.


C'est le meilleur endroit pour commencer - si vous ne pouvez rien afficher à l'écran, il vous sera très difficile de savoir si vous faites des progrès. Nous avons commencé les graphismes avant même de mettre la main sur une Vita. L'API graphique de la Vita est très similaire à OpenGL et Quell Memento utilisait déjà OpenGL.

Quell a utilisé un pipeline de fonctions fixes (ce qui signifie que l'utilisateur ne peut configurer que les étapes du processus de rendu via un ensemble de fonctions fixe), mais la Vita a utilisé un pipeline programmable (les programmes de shader permettent de programmer des étapes du processus de rendu précédemment fixées). comme l'utilisateur le souhaite).

Nous avions peu de temps entre devenir des développeurs agréés et recevoir les kits de développement. C'est pourquoi, dans notre propre moteur (qui utilisait Lua / C ++ / OpenGL), nous avions imité le comportement de la pile matricielle OpenGL en utilisant des shaders et peu de code personnalisé. Cela signifiait que tout le code Quell existant - basé sur le pipeline de fonctions fixes traditionnel - pouvait rester en grande partie intact.

 // Une partie de notre wrapper pour émuler la pile matricielle OpenGL // Vous pouvez trouver le fichier complet ici: https://github.com/balaam/glfacade Matrix4 glfCalcProjMatrix () Matrix4 mat; mat = mat.identity (); pour (int i = 0; i < (int)g_glFacade.projectStack.size(); i++)  mat = mat * g_glFacade.projectStack[i];  return mat; 

Une fois que nous avions des kits, nous avions rapidement quelque chose en place. Il y avait un peu de travail à faire, comme convertir le format de couleur des sommets en celui attendu par le shader et reconditionner les données de sommet de plusieurs tampons séparés, chacun contenant des attributs de sommet distincts - position, UV, etc. - en un seul fichier. tampon entrelacé comme indiqué dans le diagramme ci-dessous:


Avec l’ajout d’un shader très basique, nous avons rapidement mis en place notre écran de démarrage sur le kit… en quelque sorte:


Utiliser la couleur de vertex est un bon moyen de vous assurer que votre jeu fonctionne réellement et que le rendu de la géométrie est correct avant de vous préoccuper des textures.

Avec l'ajout d'un shader simple pour appliquer des textures, cela est vite devenu ceci:


Comme je l'ai mentionné, Quell utilisait le pipeline de fonctions fixes et le Vita était programmable, ce qui signifie que tous les rendus devaient être convertis de manière à utiliser des shaders plutôt que la fonction des fonctions fixes consistant à définir une multitude d'états de rendu pour obtenir un effet donné..

Il existe plusieurs écoles de pensée concernant la gestion de vos shaders. L'une consiste à créer un shader séparé pour chaque matériau ou effet; l'autre est l'approche "uber-shader", un énorme shader utilisant des définitions de pré-processeur pour produire les variantes nécessaires au moment de la compilation. Chacun a ses propres avantages et inconvénients:

Shaders individuels - Avantages:

  • Plus facile à optimiser
  • Plus facile à lire et à comprendre

Shaders individuels - Inconvénients:

  • Difficile à gérer car le nombre de shaders requis peut augmenter incroyablement rapidement
  • Nécessitera souvent une intervention du programmeur à chaque fois qu'un artiste souhaite utiliser une nouvelle combinaison d'effets

Uber-shader - Avantages:

  • Moins de soutien du codeur requis par les artistes (après le travail initial)
  • Un nombre de fichiers beaucoup plus gérable

Uber-shader - Inconvénients:

  • Plus difficile à déboguer et à optimiser
  • Augmentation des temps de compilation

En réalité, la plupart des projets utiliseront probablement une combinaison des deux approches. Pour notre port Quell, nous avons choisi d’adopter entièrement l’approche de shader individuel, car nos exigences étaient si simples et fixes..

Le jeu repose sur relativement peu de combinaisons différentes des états de rendu OpenGL. Pour vous donner une idée de la simplicité de nos exigences en matière de shader, j'ai ajouté ici le plus complexe:

 Vous devez avoir la même chose que moi. ) float4 texResult2 = tex2D (testTex1, vTexCoord1); float4 texResult3 = tex2D (testTex2, vTexCoord2); float4 currentCol = texResult; currentCol [0] = texResult3 [0] * vColor [0]; currentCol [1] = texResult3 [1] * vColor [1]; currentCol [2] = texResult3 [2] * vColor [2]; currentCol [3] = ((texResult2 [3]) * (texResult [3])) * vColor [3]; return currentCol; 

Le code Quell Vita avait un total de 13 shaders: huit programmes de shader (un shaders de vertex et sept fragments), combinés à des modes de fusion spécifiques. Il était assez facile de remplacer le code dans le moteur Quell qui configurait toutes les variables OpenGL avec des appels pour définir un shader à la place:

 rlSetBlend (RL_BLEND_RGBA); rlSetMultiTexture (0, rlGetTexture (quellGame_getAtlasImage (QUELLATLAS_SURROUND, true))); rlsetMultiTexBlend (0, RL_TEXBLEND_MODULATE_PASS_INV_ALPHA_TO_NEXT); rlSetMultiTexture (1, rlGetTexture (paneDesatTexture)); rlsetMultiTexBlend (1, RL_TEXBLEND_PREVIOUS_ALPHA_WITH_TEX_ALPHA);

est devenu:

 rlSetShader (RL_SHADER_BLEND_RGBA_4);
le rl Les fonctions (couche de rendu) constituent un ensemble de fonctions englobant la fonctionnalité OpenGL; la 4 dans RL_SHADER_BLEND_RGBA_4 indique simplement qu'il s'agit de notre quatrième variante de ce shader RGBA - avec si peu de shaders, nous n'avons pas eu besoin d'une convention de nommage particulièrement descriptive..

Celles-ci rl Des fonctions existaient déjà dans le moteur Quell, mais si le jeu à porter n'utilise pas ce type d'abstraction, c'est quelque chose que vous voudrez ajouter plus tôt. Il permet d'extraire le code de rendu de manière à pouvoir effectuer des modifications spécifiques à la plate-forme sans affecter le code du jeu..

L'idéaliste en moi aurait vraiment aimé avoir mis en place un système basé sur uber-shader. Cependant, cela aurait été excessif et nécessiterait un travail de soutien de la part des membres de la FTG, un objectif que nous avons travaillé dur pour le minimiser. Le portage n'est pas différent de toute autre tâche de programmation, en ce sens que vous allez toujours peser "faire le travail" par rapport à votre vision idéalisée de la façon dont elle fonctionne. devrait être terminé.

Au final, très peu de maux de tête ont été rencontrés lors de la mise en route du jeu graphique, bien que nous ayons perdu un peu de temps frustrant à retrouver ce que je pensais être un écrasement de la mémoire dans le code de rendu. C’était un moment avant que je réalise que, contrairement à des appels tels que glDrawArrays Dans OpenGL, où votre tableau est copié lorsque vous passez l'appel, les appels de dessin de la Vita ne le sont pas. Autrement dit, vous ne pouvez pas réutiliser le tampon de vertex que vous transmettez aux appels de dessin de la Vita tant que le dessin n'est pas terminé. Comme vous pouvez le voir sur la capture d'écran ci-dessous, cela peut causer des dégâts.


Les résultats de la réutilisation prématurée de la mémoire tampon de vertex ont… … Parfois ressemblait un peu plus à cela, souvent pour une seule image.

La solution à cela était simplement d’utiliser les fonctionnalités existantes de l’API pour attendre que le tampon soit terminé, mais c’était un rappel opportun des dangers de faire des suppositions sur la façon dont les choses fonctionnent sur une nouvelle plate-forme (et aussi quel est votre problème). peut être, sur n'importe quelle plate-forme).

Entrée utilisateur

Nous avons eu de la chance car les jeux précédents étaient déjà sortis sur le Sony Xperia Play, ce qui signifie que très peu de travail est nécessaire pour que les boutons fonctionnent, de nombreux contrôles physiques existants sur la Vita existent sur le Xperia et le fonctionnalité connexe était déjà en place.


Le smartphone Xperia Play présente une disposition de manette de jeu similaire à celle de la PS Vita. Image de Sony Mobile.

Cela signifiait qu'il ne s'agissait en réalité que de mapper les clés matérielles sur les clés logicielles et de passer le bouton "enfoncé" et "relâché" au code de traitement des entrées existant..


La PS Vita est dotée d’un pavé tactile arrière. Photo de popculturegeek.

Comme le jeu avait été créé sur un appareil mobile, il en était de même pour l’écran tactile avant. L’écran tactile arrière nécessitait un peu d’affinage, le problème évident étant que vous ne pouvez pas simplement insérer ces deux éléments dans le même flux d’entrées, car si un joueur touche les deux écrans et libère l’avant, le jeu peut vouloir l’enregistrer comme équivalent de libérer le dos ou il peut ne pas.

Il y avait aussi un peu de travail à faire en sorte que les entrées du panneau arrière (qui n’ont pas la même taille que l’écran) donnent l’impression qu’elles correspondent correctement à l’écran avant. Ceci a été réalisé en ignorant une bordure de zone morte autour du bord du panneau arrière et en redimensionnant les entrées à l'intérieur de cette zone pour les mapper à l'écran.

 // les entrées arrière ne semblent pas correspondre complètement à la plage de l'écran avant, donc étirez le code // ce sont des valeurs qui semblaient être facilement accessibles define REAR_STRETCH_Y 544 statique vec2 vitaMapRearInputToScreen (int inputX, int inputY) vec2 stretchedInput; stretchedInput.x = (inputX-REAR_DEADZONE_MIN_X) * REAR_STRETCH_X / (REAR_DEADZONE_MAX_X-REAR_DEADZONE_MIN_X); stretchedInput.x = clampf (stretchedInput.x, 0, REAR_STRETCH_X); stretchedInput.y = (inputY-REAR_DEADZONE_MIN_Y) * REAR_STRETCH_Y / (REAR_DEADZONE_MAX_Y-REAR_DEADZONE_MIN_Y); stretchedInput.y = clampf (stretchedInput.y, 0, REAR_STRETCH_Y); return stretchedInput; 

Dans l’ensemble, je pense que nous nous sommes assez mal entendus ici, en partie à cause de la façon dont le jeu repose entièrement sur un simple geste de balayage. Porter sur des interfaces radicalement différentes peut être un véritable casse-tête et, mal fait, risque de paralyser un excellent jeu. Si nous avions porté un jeu d'action à la troisième personne sur la Wii, cette section aurait été considérablement plus longue.

l'audio

Je ne vais pas mentir; J'ai une vraie relation amour / haine avec l'audio. Pendant mon séjour à Free Radical Design, j'ai passé beaucoup de temps à travailler avec les ingénieurs du son de l'équipe des moteurs et des concepteurs sonores pour pouvoir intégrer l'audio au jeu et l'apprécier énormément. Audio soulève vraiment un jeu et lui donne vie.

Malheureusement, le plus bas niveau des choses, avec son cocktail de formats de fichiers, de taux d'échantillonnage, de compression, de voix, de bus, de transmission de fichiers en continu, etc., ne m'a jamais vraiment enthousiasmé de la même manière. Nous avons donc abordé cette tâche avec une certaine appréhension.

Heureusement, le SDK Vita est rempli d'exemples (mis à jour régulièrement) qui couvrent en détail toutes les manières d'utiliser l'API audio. Le minimum que vous souhaiterez, même dans le plus simple des jeux 2D, est de pouvoir jouer des sons uniques (les effets sonores du jeu) et de diffuser du son (musique et autres fichiers volumineux trop volumineux pour garder en mémoire tout le temps). Dans de nombreux jeux en 2D, vous pouvez probablement même choisir de vous limiter au mono et d’économiser un peu de mémoire, voire même d’éviter toute diffusion en continu..

Avec une bonne référence pour travailler dans les échantillons, nous avons tout l’audio opérationnel en quelques jours. Le seul autre travail majeur sur l'audio était un passage tardif du format audio de VAG à un format propriétaire avec un niveau de compression beaucoup plus élevé, ce qui a réduit notre utilisation de la mémoire audio à environ 30% de ce qu'elle était auparavant..

En fin de compte, le processus de mise en œuvre de l'audio a été une expérience beaucoup moins pénible que ce que je craignais.

Réseau

Quell Memento est un jeu à joueur unique, sans gameplay en réseau et avec des fonctionnalités en ligne limitées. Donc, théoriquement, cela aurait dû être l’un des domaines les plus simples. La réalité met bien en évidence l'un des défis du transfert sur une plate-forme PlayStation: les TRC redoutés (liste de contrôle des exigences techniques - une liste de choses à faire et à ne pas faire que les développeurs doivent remplir pour réussir le contrôle qualité)..

Je devrais souligner que Sony n'est pas unique ici; Microsoft et Nintendo ont leurs équivalents. Contrairement au mobile, où la fonctionnalité en ligne est souvent fournie par une solution multiplate-forme tierce, ou un PC, où la seule personne qui juge de votre mise en œuvre sera l'utilisateur final, sur les consoles, ce domaine a tendance à faire l'objet d'un examen minutieux. Cela consiste en partie à garantir que la fonctionnalité fournie par un service tel que PSN se comporte de manière cohérente d’un titre à l’autre et que les verrous parentaux, les classes d’âge, etc., soient respectés..

Par conséquent, si vous effectuez un portage sur une console, même pour un jeu avec des fonctionnalités en ligne relativement simples, cela peut prendre plus de temps que prévu. Pour un port, le respect des CRT peut être l’une des tâches les plus intrusives du travail à effectuer. Des exigences spécifiques concernant la gestion d'événements tels que la perte de connexion ou le refus d'accès à des fonctionnalités en raison d'un verrouillage parental, ainsi que le moment et la manière dont vous devez relayer ces informations à l'utilisateur peuvent nécessiter un certain degré de réciprocité. composants de jeu et de réseau qui n'existaient tout simplement pas dans le jeu d'origine.

Nous avons utilisé une bibliothèque fournie par Sony qui résume toute la configuration de bas niveau et le démantèlement des tâches PSN et en ligne dans une interface assez simple, fournissant des rappels pour toutes les tâches asynchrones. Les appels du jeu dans la fonctionnalité en ligne pourraient être réduits à quelques groupes distincts - connexion, magasin et classements - chacun avec quelques paramètres pour spécifier les détails..

Tout cela signifiait qu'une requête en ligne pouvait être déclenchée avec seulement quelques lignes de code et nous nous sommes retrouvés avec probablement pas plus de cinq ou six fonctions différentes appelées depuis le jeu pour prendre en charge les fonctionnalités en ligne..

Les rappels du Sony wrapper fournissent des détails assez détaillés sur tout ce qui ne va pas, mais ils pourraient généralement être simplement classés comme un succès ou un échec et le rappel approprié au jeu déclenché. Cela signifiait que nous pouvions également réduire les rappels du moteur au jeu en quelques appels similaires..

Les états d'échec ont été traités autant que possible dans le code moteur. Cela signifiait que les gars de Fallen Tree pouvaient continuer à développer Quell sans s'inquiéter des états d'échec spécifiques à Vita..

Par exemple, si une fonction de moteur avait un appel de prérequis susceptible d’échouer, plutôt que d’obliger le jeu à appeler des prérequis et puis Pour sa demande, nous appellerions les conditions préalables silencieusement, en mettant en cache la demande réelle. Si les conditions préalables échouaient, nous vidions la demande et informions le jeu par le rappel normal, en invoquant la boîte de dialogue du côté moteur. En cas de succès, la demande sera exécutée comme prévu..


Cela a généralement bien fonctionné. comme pour tout système ajouté plus tard et faisant de son mieux pour ne pas être intrusif, il y avait un ou deux morceaux de code moins qu'élégants, mais cela a fonctionné.

Sauvegarder des jeux

Il convient de mentionner les sauvegardes de jeux, car, comme pour la fonctionnalité de réseau ci-dessus, elles sont soumises à un contrôle minutieux en termes de TRC. Les parties sauvegardées sont sujettes à deux erreurs principales: manque de stockage de fichiers ou de quota d'enregistrement.

(J'ai exclu la corruption de sauvegarde car il n'y a pas grand chose que vous puissiez faire à propos d'une sauvegarde corrompue; le système vous en avertit et vous pouvez en informer l'utilisateur, mais tout ce que vous pouvez faire est de le supprimer et de passer à autre chose. … Et peut-être avoir un petit cri tranquille à toutes ces heures perdues.)

Manquer de stockage dans le système de fichiers est assez explicite: il n’ya tout simplement pas assez d’espace pour enregistrer ce que vous voulez. Le quota de sauvegarde est défini lors du développement de votre jeu. il s'agit essentiellement d'une limite auto-déclarée sur la quantité de mémoire dont votre application aura besoin pour sauvegarder les données de jeu. Ce quota n'est pas tout attribué lors de l'installation de votre jeu - il n'est pas garanti d'exister.

En manipulant chacun de ceux-ci vous avez vraiment deux options.

Si le jeu manque de stockage dans le système de fichiers, vous pouvez:

  1. Alerte l'utilisateur mais permet à l'application de continuer, ou
  2. Empêcher l'avancement de l'application.

En ce qui concerne le dépassement du quota de sauvegarde, vous pouvez:

  1. Prendre des dispositions pour écraser ou supprimer des données sauvegardées, ou
  2. Assurez-vous que cela n'arrive jamais!

La nature de Quell nous a permis de traiter cette question de manière assez concise en choisissant les options 2 et 1, respectivement. Quell n'est pas un jeu dans lequel vous voudrez peut-être revenir à votre sauvegarde d'il y a cinq minutes. Une seule sauvegarde est donc requise. Cette sauvegarde est créée automatiquement, enregistrée et chargée. Le contenu et donc la taille de la sauvegarde sont assez prévisibles.

Lors de la première lecture, notre système de sauvegarde tentera d’allouer la quantité maximale de mémoire dont il aura besoin pour votre fichier de sauvegarde. S'il ne peut pas le faire - c'est-à-dire si le système de fichiers est déjà insuffisamment stocké - le message standard ci-dessous s'affichera:


Le lecteur n'est pas autorisé à continuer tant qu'il n'a pas résolu le problème lui-même (en réduisant ou en fermant l'application et en supprimant certaines données). Une fois qu'ils ont appuyé sur OK, ils essaieront à nouveau d'allouer la mémoire. Une fois que cette sauvegarde initiale a été créée avec succès, il est prudent de supposer qu’une pénurie dans le système de fichiers et un quota de sauvegarde ne se produira jamais..


autres considérations

CVR et soumission

J'ai déjà brièvement mentionné les CVR (liste de contrôle des exigences techniques) et, à titre de non-responsabilité, je suis heureux que les CVR existent; En tant que joueur, les choses telles que le PSN sont devenues une partie intégrante de l'expérience. J'apprécie de savoir que je peux m'attendre à un certain degré de cohérence dans le comportement des jeux..

Cela dit, en tant que développeur, ils sont pénibles. Nous avons eu de la chance que le jeu soit relativement simple et qu’à ce titre, de nombreux CRT pourraient tout simplement être ignorés car ils ne s’appliquent pas. Même si vous travaillez à apporter un jeu relativement simple à l’une des consoles, je vous conseillerais vivement de vous familiariser avec les règles de cette plate-forme. de bonne heure et se référer à eux souvent. Ce qui aurait pu être acceptable sur une plate-forme peut ne pas voler sur une autre, et vous ne voulez pas attendre d'avoir une longue liste de raisons pour lesquelles vous avez échoué à l'assurance de la qualité et vous avez réalisé que vous le faisiez mal..

Pour une petite équipe sans département d’assurance qualité dédié, cela peut sembler une tâche très ardue, mais un peu de bon sens et de planification peut faire toute la différence..

Premièrement, beaucoup d'exigences ne sont qu'un moyen spécifique de vous demander de ne pas faire de bêtises que vous ne voulez probablement pas faire de toute façon - heureusement, les gars de la FTG avaient déjà évité de faire quelque chose de stupide, alors c'était un bon début.

Deuxièmement, nous avons conservé une feuille de calcul de toutes les exigences et si elles répondaient, échouaient, ne pouvaient pas encore être testées ou n'étaient tout simplement pas applicables. Au fur et à mesure que les fonctionnalités clés sont entrées dans le jeu, nous pourrions faire un balayage de cette liste pour mettre à jour le statut de chaque exigence et en même temps nous rafraîchir la mémoire sur les restrictions appliquées..

Au moment où nous avons atteint notre phase d’assurance qualité, nous avions une idée assez claire de notre position en ce qui concerne les CRT et nous n’avons pas eu la moindre surprise..

Portage d'une cible mobile

Assurez-vous que vous avez clairement convenu des délais et des objectifs. C’est plus un problème commercial que technique mais crucial si vous portez un jeu pour quelqu'un d'autre, même s'il ne s'agit que d'un projet de loisir entre amis. (Vous voulez rester amis, non?!)

Quand nous avons commencé à travailler sur Quell Memento, ce n’était pas fini et, même s’il y avait un sentiment général quant à la date d’arrivée, rien n’était figé dans la pierre. Finalement, tout le projet a pris plus de temps que prévu.


Avec le recul, il aurait été préférable d’attendre que le jeu soit complètement terminé - ou du moins beaucoup plus complet - avant de commencer notre port. Comme nous portions le moteur, il était rarement affecté par le nouveau gameplay et le nouveau contenu, mais il y avait des occasions où des fonctionnalités nécessitaient des changements de moteur. Il y avait aussi des moments où la progression du portage du moteur était bloquée alors que nous attendions de nouvelles fonctionnalités à ajouter.

Nous entretenons d'excellentes relations avec les gars de FTG et avons eu la chance, dans ces situations, d'avoir la possibilité de basculer vers nos propres projets pour ces périodes (notamment d'enquêter sur certaines des caractéristiques les plus uniques de la Vita, telles que la réalité augmentée), mais comme tout le monde qui a déjà essayé un peu de multitâche devrait savoir, ce n’est pas la façon la plus efficace de travailler.


Choses que nous avons apprises

Il est difficile de citer des leçons singulières exceptionnelles que nous avons apprises; nous avons acquis une plus grande accumulation de connaissances sur les nouveaux outils, API et processus.

À l'avenir, nous serions peut-être plus audacieux pour imposer (ou tout au moins suggérer) des modifications du code du jeu lorsque cela nous semblait raisonnable - nous avons peut-être rendu certaines tâches plus difficiles que ce qu'elles auraient dû être cette fois-ci. Mais la définition de «raisonnable» variera toujours énormément d’un projet à l’autre..

De plus, nous attendrions probablement qu'un jeu soit plus complet avant de commencer à travailler sur un port à l'avenir, car plus de gens travailleraient dessus plus rapidement. Encore une fois, la faisabilité de ceci pourrait varier énormément entre les projets en fonction du calendrier de publication. Après l'avoir fait une fois, cependant, nous pouvons maintenant beaucoup mieux estimer combien de temps nous pourrions.

Plus important encore, nous avons acquis des mois d’expérience précieuse sur une nouvelle plate-forme, y compris son processus de soumission. Nous avons même eu la possibilité d’examiner certaines de ses caractéristiques uniques. Pour une équipe qui repose largement sur le travail à contrat et le travail à contrat. revenu, la valeur de ceci ne peut pas être sous-estimée.


Conclusion

Mon conseil pour ceux d'entre vous qui envisagent un port pour Vita serait de lui donner une chance. Je pense qu'il y a une certaine mystique entourant le développement de la console; nous avons eu la chance d’avoir de l’expérience dans ce domaine, mais même sans cela, vous ne devriez pas être rebutés.

Sony est très accueillant pour les développeurs indépendants et les petits développeurs (ce qui, à mon avis, est en train de devenir évident pour la communauté des développeurs de jeux) et, si vous avez une connaissance technique suffisante du développement de jeux, vous ne devriez ne rencontrez aucun défi insurmontable.

Quell Memento for Vita est maintenant disponible dans SCEA et SCEE.