Post Mortem Trasladar el recuerdo a la PlayStation Vita

Daniel Schuller y yo formamos Bigyama en 2012, después de haber trabajado en numerosos títulos como Magic the Gathering: Duel of the Planeswalkers y Star Wars: Battlefront. La compañía comenzó con un salto inoportuno a PlayStation Home y un traslado a Escocia, antes de regresar a Nottingham y reenfocarse en nuestros talentos principales: ¡programar y hacer juegos geniales! Nuestro primer paso fue proporcionar las chuletas técnicas para ayudar a Fallen Tree Games a llevar Quell Memento a la PlayStation Vita..


Este artículo explica cómo en Bigyama portamos Quell Memento a Vita. Si desea obtener más información sobre el diseño de Quell, consulte el artículo de Fallen Tree, The Making of Quell.


Empezando

Memento es el tercer juego de la serie Quell; Los juegos anteriores habían funcionado muy bien en dispositivos móviles y había conocido a Joe y Lewis en FTG durante algún tiempo, habiendo trabajado con ellos en Free Radical Design antes de su desaparición. Fue genial tener la oportunidad de trabajar con ellos nuevamente y tener la oportunidad de trabajar en una nueva plataforma.

Hace algún tiempo conocí al equipo de Honeyslug, desarrolladores de la exitosa Mini Kahoots de PSP, quienes luego desarrollaron el título de lanzamiento de Vita, Frobisher Says. Nos pusieron en contacto con el equipo de relaciones con los desarrolladores en SCEE (Sony Computer Entertainment Europe).

Fuimos al estudio SCEE en Londres y discutimos las opciones, PSP Mini, PlayStation Mobile o PlayStation Vita, que brindan a los desarrolladores acceso a Vita con diversos grados de funcionalidad. Después de unos cuantos correos electrónicos de ida y vuelta, decidimos que la mejor opción para Quell era hacer un juego nativo de Vita, lo que nos da acceso completo al poder de Vita y todas las características de PSN, como tablas de clasificación y trofeos..



Abordando el puerto

Los motores

A menudo, la primera tarea en la creación de un juego es decidir qué motor usar. Hay una serie de motores disponibles en el Vita, pero la mayoría son una exageración completa desde una perspectiva técnica y no son factibles desde una perspectiva financiera para un proyecto de este tamaño..

También se encuentra el PhyreEngine, que a menudo se pasa por alto, desarrollado por los mismos Sony y de uso gratuito para los desarrolladores registrados de PlayStation; se ha utilizado para desarrollar juegos de Demon Souls a Colin McRae: Dirt and Journey. Una vez más, como probablemente puedas imaginar, esto fue mucho más de lo que realmente necesitábamos, como intentar romper una tuerca con un martillo.

Convenientemente, Quell Memento usó el propio motor de Fallen Tree Games, y tanto el motor como el código del juego fueron escritos usando C. C y sus variantes son el lenguaje estándar usado para hacer juegos y si está desarrollando un juego para lanzar en muchas plataformas diferentes Realmente no debería ir con nada más.

Esto hizo que nuestra decisión fuera obvia: llevaríamos el motor de Fallen Tree Game a la Vita. Fue gratis, fue construido específicamente para ejecutar los juegos de Quell y fue una buena base de código.

Puede parecer contra-intuitivo ignorar todos los motores que ya funcionan con Vita y elegir un motor que no lo haga, pero mover un juego a un nuevo motor puede significar recrear todo el juego para ese motor porque funciona de una manera muy diferente . Portar el motor aborda la raíz del problema. No tiene que preocuparse por recrear cada función de juego individual, solo tiene que recrear la funcionalidad que todos ellos tienen encima..

Si tiene suerte, un puerto puede brindarle la oportunidad de desarrollar su propia tecnología para una nueva plataforma mientras se le paga para hacerlo. Bigyama tiene su propio motor interno y, si se hubiera construido Quell Memento en un motor sin acceso a código fuente, como UDK o Unity, habría valido la pena considerarlo..

Areas clave

La belleza de desarrollar un puerto es que usted tiene un objetivo claro para alcanzar.

La belleza de desarrollar un puerto es que usted tiene un objetivo claro para alcanzar.

Esto puede parecer desalentador al principio, pero se puede dividir en algunas áreas clave: gráficos, entradas de usuarios, audio, redes y juegos guardados..

Como ya he mencionado, portar el motor significaba que no había ningún código de juego significativo para escribir o reescribir; En esta situación, conseguir que estas áreas clave funcionen debe significar que el juego en gran medida se cuida a sí mismo. Las primeras etapas de la creación de un juego es un guión para encontrar la diversión en el juego, pero con un puerto es un guión para poner en marcha lo suficiente como para descubrir dónde está roto.

Gráficos

Al hacer un puerto, comienza con los gráficos..


Es el mejor lugar para comenzar: si no puede mostrar nada en la pantalla, será muy difícil saber si está progresando. Comenzamos con los gráficos incluso antes de tener en nuestras manos una Vita. La API gráfica de Vita es muy similar a OpenGL y Quell Memento ya estaba usando OpenGL.

Quell usó una canalización de función fija (lo que significa que el usuario solo puede configurar etapas del proceso de representación a través de un conjunto fijo de funciones), pero Vita usó una tubería programable (los programas de sombreado permiten que se programen etapas del proceso de representación que se arreglaron previamente) como el usuario lo desee).

Tuvimos un breve período entre convertirnos en desarrolladores con licencia y recibir los kits de desarrollo, por lo que en nuestro propio motor (que usaba Lua / C ++ / OpenGL) emulamos el comportamiento de la pila de matrices de OpenGL usando sombreadores y poco código personalizado. Esto significaba que todo el código de Quell existente, que se basaba en el sistema tradicional de funciones fijas, podría permanecer prácticamente intacto..

 // Parte de nuestro contenedor para emular la pila de matriz OpenGL // Puede encontrar el archivo completo aquí: https://github.com/balaam/glfacade Matrix4 glfCalcProjMatrix () Matrix4 mat; mat = mat.identity (); para (int i = 0; i < (int)g_glFacade.projectStack.size(); i++)  mat = mat * g_glFacade.projectStack[i];  return mat; 

Una vez que teníamos kits, rápidamente teníamos algo en marcha. Había un pequeño trabajo que hacer, como convertir el formato de color de los vértices en el esperado por el sombreado y volver a empaquetar los datos de vértices de varios búferes separados, cada uno con atributos de vértice separados (posición, UVs, etc.) en una sola búfer intercalado como se muestra en el siguiente diagrama:


Con la adición de un sombreador muy básico, pronto tuvimos nuestra pantalla de inicio en funcionamiento en el kit ... tipo de:


Usar el color de vértice es una buena manera de asegurar que tu juego realmente funciona y que la geometría se está procesando correctamente antes de preocuparte por las texturas

Con la adición de un sombreado simple para aplicar texturas, eso pronto se convirtió en esto:


Como mencioné, Quell estaba usando el canal de funciones fijas y el Vita era programable, lo que significa que toda la representación tenía que convertirse para usar sombreadores en lugar del enfoque de función fija de configurar una multitud de estados de representación para lograr un efecto dado.

Hay un par de escuelas de pensamiento acerca de cómo administrar sus sombreadores. Una es crear un sombreador separado para cada material o efecto; el otro es el enfoque 'uber-shader', un sombreado enorme que usa definiciones de preprocesador para producir las variantes necesarias en el momento de la compilación. Cada uno tiene sus pros y sus contras:

Sombreadores individuales - Pros:

  • Más fácil de optimizar
  • Más fácil de leer y entender

Sombreadores individuales - Contras:

  • Difícil de administrar, ya que la cantidad de shaders requeridos puede crecer increíblemente rápido
  • A menudo requerirá la intervención del programador cada vez que un artista quiera usar una nueva combinación de efectos

Uber-shader - Pros:

  • Menos soporte de codificador requerido por los artistas (después de que el trabajo inicial está hecho)
  • Un número de archivos mucho más manejable.

Uber-shader - Contras:

  • Más complicado de depurar y optimizar.
  • Mayores tiempos de compilación.

En realidad, es probable que la mayoría de los proyectos utilicen una combinación de ambos enfoques. Para nuestro puerto de Quell, optamos por un enfoque de sombreado individual, ya que nuestros requisitos eran tan simples y fijos..

El juego se basó en relativamente pocas combinaciones diferentes de los estados de renderización de OpenGL. Para dar una idea de lo sencillos que fueron nuestros requisitos de sombreado, he añadido los más complejos aquí:

 float4 v gire a la derecha (float4, float2 vTexCoord), haga clic en el botón de entrada, muestre uniformado, vTexCoord1, flote ); 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; 

El código de Quell Vita tenía un total de 13 sombreadores: ocho programas de sombreado (un vértice y siete sombreadores de fragmentos), combinados con modos de mezcla específicos. Fue bastante fácil reemplazar el código en el motor Quell que configuraba todas las variables OpenGL con llamadas para establecer un sombreado en su lugar:

 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);

convirtió:

 rlSetShader (RL_SHADER_BLEND_RGBA_4);
los rl Las funciones (capa de procesamiento) son un conjunto de funciones que envuelven la funcionalidad OpenGL; la 4 en RL_SHADER_BLEND_RGBA_4 simplemente indicó que esta era nuestra cuarta variación de este sombreador RGBA - con tan pocos sombreadores no requerimos una convención de nombres particularmente descriptiva.

Estas rl Las funciones ya existían en el motor Quell, pero si el juego que se va a portar no utiliza este tipo de abstracción, es algo que querrá agregar desde el principio. Permite que el código de representación se abstraiga para que se puedan realizar cambios específicos de la plataforma sin afectar el código del juego.

Al idealista en mí realmente le hubiera gustado haber implementado un sistema basado en uber-shader. Sin embargo, esto habría sido una exageración y el trabajo requerido por los muchachos de FTG para apoyar, algo en lo que trabajamos arduamente para minimizar. Portar no es diferente de cualquier otra tarea de programación, ya que siempre va a estar sopesando el 'hacer el trabajo' con su visión idealizada de cómo hacerlo. debería ser hecho.

En última instancia, hubo muy pocos dolores de cabeza al poner en funcionamiento el lado gráfico del juego, aunque hubo una pérdida de tiempo frustrante para rastrear lo que asumí que era una sobrescritura de memoria en el código de representación. Pasó un tiempo antes de que me di cuenta de que, a diferencia de llamadas como glDrawArrays en OpenGL, donde se copia la matriz cuando realiza la llamada, las llamadas de sorteo de Vita no lo hacen, es decir, no puede reutilizar el búfer de vértice que pasa a las llamadas de sorteo de Vita hasta que se termine de dibujar. Como puede ver en la captura de pantalla a continuación, hacerlo puede hacer un gran desastre.


Los resultados de reutilizar el búfer de vértice prematuramente significaron que esto ... ... ocasionalmente se parecía un poco más a esto, a menudo por un solo cuadro.

La solución para esto fue simplemente usar la funcionalidad existente en la API para esperar hasta que se hiciera con el búfer, pero fue un recordatorio oportuno de los peligros de hacer suposiciones sobre la forma en que funcionan las cosas en una nueva plataforma (y también de cuál es su error). puede ser, en cualquier plataforma).

Entrada del usuario

Tuvimos suerte aquí ya que los juegos anteriores ya se habían lanzado en Xperia Play de Sony, lo que significa que no se requería mucho trabajo para hacer funcionar los botones, muchos de los controles físicos que existen en el Vita existen en el Xperia y el funcionalidad relacionada ya estaba en su lugar.


El teléfono inteligente Xperia Play presenta un diseño de gamepad similar al de PS Vita. Imagen de Sony Mobile.

Esto significaba que en realidad solo era cuestión de asignar las claves de hardware a las claves de software y pasar los estados "presionado" y "liberado" del botón al código de manejo de entrada existente.


La PS Vita cuenta con un panel táctil trasero. Foto por popculturegeek.

Como el juego se originó en dispositivos móviles, lo mismo sucedió con el panel táctil frontal. El panel táctil trasero requirió un poco de precisión, el problema obvio es que no se pueden introducir ambos en el mismo flujo de entradas, ya que si un jugador toca ambos paneles y libera el frente, el juego puede querer registrar eso como equivalente a liberar la espalda o no puede.

También se trabajó un poco para obtener entradas del panel posterior (que no es del mismo tamaño que la pantalla) para sentir que se estaban asignando correctamente a la pantalla frontal. Esto se logró sin tener en cuenta el borde de una zona muerta alrededor del borde del panel posterior y escalando las entradas dentro de esta área para asignar a la pantalla.

 // las entradas posteriores no parecen coincidir completamente con el rango de la pantalla frontal, por lo que se extienden en el código // estos son valores a los que se puede acceder fácilmente #define REAR_DEADZONE_MIN_X 10 #define REAR_DEADZONE_MIN_Y 75 #define REAR_DEADZONE_MAX_define define REAR_STRETCH_Y 544 static 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); retorno estiradoEntrada; 

En general, creo que nos salimos bastante a la ligera aquí, en parte debido a que el juego se basa completamente en un simple gesto de deslizamiento. Portar a través de interfaces radicalmente diferentes puede ser un verdadero dolor de cabeza y, mal hecho, tiene el potencial de paralizar un gran juego. Si hubiésemos portado un juego de acción en tercera persona a la Wii, esta sección hubiera sido considerablemente más larga..

Audio

No voy a mentir Tengo una verdadera relación de amor / odio con audio. En mi tiempo en Free Radical Design, pasé mucho tiempo trabajando con los chicos de audio del equipo de motores y los diseñadores de sonido para obtener audio en el juego y lo disfruté inmensamente. El audio realmente levanta un juego y lo da vida..

Lamentablemente, el lado más bajo de las cosas, con su combinación de formatos de archivo, frecuencias de muestreo, compresión, voces, buses, transmisión de archivos, etc., nunca me ha entusiasmado de la misma manera. Así que abordamos esta tarea con cierta inquietud..

Afortunadamente, el SDK de Vita viene con muestras (actualizadas regularmente) que cubren a fondo todas las formas de usar la API de audio. Lo mínimo que va a desear, incluso en los juegos 2D más simples, es la capacidad de reproducir sonidos únicos (los efectos de sonido del juego) y la capacidad de transmitir audio (música y cualquier otro archivo grande que sea demasiado grande para mantener cargado en la memoria todo el tiempo). En una gran cantidad de juegos en 2D, es probable que incluso prefieras quedarte solo con mono y ahorrarte un poco de memoria adicional, tal vez incluso evitando la transmisión por completo..

Con una gran referencia para trabajar en las muestras, tuvimos todo el audio en funcionamiento en un par de días. El único otro trabajo importante en el audio fue un cambio tardío en el formato de audio de VAG a un formato propietario con un nivel de compresión mucho más alto, lo que redujo el uso de nuestra memoria de audio a aproximadamente el 30% de lo que había sido anteriormente..

Al final, el proceso de implementación del audio fue una experiencia mucho menos dolorosa de lo que había temido.

Red

Quell Memento es un juego para un solo jugador sin juego en red y funciones en línea limitadas, por lo que, en teoría, esta debería haber sido una de las áreas más simples. La realidad destaca muy bien uno de los desafíos de la migración a una plataforma de PlayStation: los temidos TRCs (Lista de verificación de requisitos técnicos: una lista de lo que se debe y no se debe hacer a los desarrolladores para pasar el control de calidad).

Debo señalar que Sony no es única aquí; Microsoft y Nintendo tienen sus equivalentes. A diferencia de los dispositivos móviles, donde la funcionalidad en línea a menudo es proporcionada por alguna solución multiplataforma de terceros, o PC, donde la única persona que juzga su implementación será el usuario final, en las consolas, esta área tiende a someterse a un gran escrutinio. Esto tiene que ver, en parte, con garantizar que la funcionalidad proporcionada por un servicio como PSN se comporte de manera consistente en todos los títulos y que se cumplan los bloqueos parentales, las clasificaciones de edad, etc..

Como resultado, si está trasladándose a una consola, incluso para un juego con funciones en línea relativamente simples, esto puede llevar más tiempo del que espera. Para un puerto, cumplir con los TRC puede ser una de las partes más intrusivas del trabajo que tiene que hacer. Los requisitos específicos sobre cómo manejar eventos como la pérdida de conexión o la denegación de acceso a las funciones debido al bloqueo de los padres, y el momento y la forma en que debe transmitir estas cosas al usuario, pueden requerir un grado de ida y vuelta entre su juego y componentes de red que simplemente no existían en el juego original.

Utilizamos una biblioteca provista por Sony que envuelve toda la configuración de bajo nivel y el desmontaje de PSN y las tareas en línea en una interfaz bastante simple, proporcionando devoluciones de llamadas para todas las tareas asíncronas. Las llamadas del juego a la funcionalidad en línea podrían reducirse a unos pocos grupos distintos: inicio de sesión, tienda y tablas de clasificación, cada uno con algunos parámetros para especificar los detalles..

Todo esto significó que una solicitud en línea podría ser activada con solo unas pocas líneas de código, y terminamos con probablemente no más de cinco o seis funciones diferentes llamadas desde el juego para apoyar las funciones en línea.

Las devoluciones de llamada de la envoltura de Sony proporcionan detalles bastante granulares sobre cualquier cosa que salga mal, pero en su mayor parte, simplemente podrían clasificarse como un éxito o un fracaso y se activó la devolución de llamada apropiada al juego. Esto significaba que también podríamos reducir las devoluciones de llamada del motor al juego para hacer algunas llamadas similares.

Los estados de falla se manejaron lo más posible en el código del motor. Esto significa que los chicos de Fallen Tree podrían continuar desarrollando Quell sin tener que preocuparse por los estados de falla específicos de Vita.

Por ejemplo, si una función del motor tenía una llamada de requisito previo que podría fallar, en lugar de requerir que el juego llame a cualquier requisito previo y entonces su solicitud, llamaríamos el requisito previo en silencio, almacenando en caché la solicitud real. Si el prerrequisito fallaba, descartaríamos la solicitud y notificaríamos al juego a través de la devolución de llamada normal, invocando el diálogo desde el lado del motor. En caso de éxito la solicitud se ejecutaría según lo previsto..


Esto generalmente funcionó bien; Al igual que con cualquier sistema que se agregue más tarde y que esté haciendo todo lo posible para no ser intrusivo, hubo uno o dos códigos poco elegantes, pero hizo el trabajo..

Guardar juegos

Vale la pena mencionar los juegos guardados porque, al igual que con la funcionalidad de red anterior, están sujetos a un alto grado de escrutinio en términos de TRCs. Las partidas guardadas son propensas a dos errores clave: quedarse sin almacenamiento de archivos o quedarse sin guardar cuota.

(He excluido la corrupción de guardar porque realmente no es mucho lo que puede hacer para evitarlo; el sistema lo alertará e informará al usuario, pero todos lo que pueden hacer es eliminarlo y seguir adelante ... y tal vez tener poco grito silencioso en todas esas horas perdidas.

Quedarse sin almacenamiento en el sistema de archivos es bastante explícito: simplemente no hay suficiente espacio para guardar lo que desea. La cuota de guardado se establece durante el desarrollo de tu juego; es esencialmente un límite autodeclarado en la cantidad de memoria que su aplicación necesitará para guardar datos del juego. Sin embargo, esta cuota no está asignada en la instalación de tu juego, no se garantiza que exista..

En el manejo de cada uno de estos realmente tienes dos opciones..

Si el juego se queda sin almacenamiento del sistema de archivos, puedes:

  1. Alerte al usuario pero permita que la aplicación continúe, o
  2. Evitar el progreso de la aplicación..

En cuanto a quedarse sin cupo de guardado, puede:

  1. Hacer provisiones para sobrescribir o eliminar datos guardados, o
  2. Asegúrate de que nunca suceda!

La naturaleza de Quell nos permitió lidiar con esto de manera bastante concisa yendo con las opciones 2 y 1, respectivamente. Quell no es un juego en el que puede querer saltar a su guardado de hace cinco minutos, por lo que solo se requiere un guardado y este se crea automáticamente, se guarda y se carga. El contenido y por lo tanto el tamaño de la partida guardada es algo predecible..

En la primera partida, nuestro sistema de guardar intentará asignar la cantidad máxima de memoria que necesitará para su archivo de guardar. Si no puede hacerlo, es decir, si ya no hay suficiente almacenamiento en el sistema de archivos, se mostrará el mensaje estándar que se muestra a continuación:


El jugador no puede continuar hasta que haya resuelto este problema por sí mismo (minimizando o cerrando la aplicación y eliminando algunos datos). Una vez que presionan OK intentará nuevamente asignar la memoria. Una vez que este guardado inicial se crea con éxito, es seguro asumir que nunca se producirá una escasez en el sistema de archivos y la cuota de guardado.


Otras Consideraciones

TRCs y Sumisión

Ya mencioné brevemente los TRC (la Lista de verificación de requisitos técnicos) y, como descargo de responsabilidad, diría que estoy feliz de que existan los TRCs; como jugador, como PSN se ha convertido en una parte tan integral de la experiencia que aprecio saber que puedo esperar un cierto grado de coherencia en el comportamiento de los juegos.

Dicho esto, como desarrollador, son un dolor. Tuvimos la suerte de que el juego era relativamente simple y, como tal, muchos TRCs podrían simplemente ser ignorados ya que no se aplicaban. Sin embargo, incluso si está trabajando para llevar un juego relativamente simple a cualquiera de las consolas, le recomiendo encarecidamente que se familiarice con las reglas de esa plataforma. temprano y referirse a ellos a menudo. Lo que puede haber sido aceptable en una plataforma puede no volar en otra, y no desea esperar hasta que reciba una gran lista de razones por las que no logró el control de calidad al darse cuenta de que lo está haciendo todo mal..

Para un equipo pequeño sin un departamento de control de calidad dedicado, esto puede parecer una tarea realmente desalentadora, pero un poco de sentido y planificación pueden hacer la diferencia..

En primer lugar, muchos de los requisitos son solo una manera específica de pedirte que no hagas cosas estúpidas que probablemente no quieras hacer de todos modos. Afortunadamente, los chicos de FTG ya habían evitado hacer algo estúpido, así que este fue un buen comienzo..

En segundo lugar, mantuvimos una hoja de cálculo de todos los requisitos y si actualmente se aprobaron, fallaron, no se pudieron probar o simplemente no se aplicaron. A medida que las características clave entraron en el juego, podríamos hacer un barrido de esta lista para actualizar el estado de cada requisito y al mismo tiempo refrescar nuestros recuerdos sobre las restricciones aplicadas.

En el momento en que llegamos a la fase de control de calidad, teníamos una idea bastante clara de cómo nos situábamos con respecto a los TRC y no nos encontramos con ninguna sorpresa desagradable..

Portar a un objetivo en movimiento

Asegúrese de tener plazos y objetivos claramente acordados. Esto es más un problema comercial que técnico, pero es crucial si está portando un juego para otra persona, incluso si es solo un proyecto de hobby entre amigos. (Quieres ser amigos, ¿verdad ?!)

Cuando comenzamos a trabajar en Quell Memento, no estaba terminado y, aunque había una sensación general de cuándo sería la fecha de finalización, nada estaba escrito en piedra. En última instancia, todo el proyecto tomó más tiempo del esperado.


En retrospectiva, hubiera sido preferible esperar a que el juego esté completamente terminado, o al menos mucho más completo, antes de comenzar nuestro puerto. Cuando portábamos el motor, rara vez se veía afectado por la nueva jugabilidad y el contenido, pero había ocasiones en las que las funciones requerían cambios de motor. También hubo momentos en que se bloqueó el progreso en la adaptación del motor mientras esperábamos que se agregaran nuevas funciones..

Tenemos una gran relación con los muchachos en FTG y tuvimos la suerte de tener la flexibilidad de cambiar a nuestros propios proyectos para estos períodos (incluida la investigación de algunas de las características más exclusivas de Vita, como la realidad aumentada), pero como nadie quien haya intentado un poco de multitarea debe saber, esta no es la forma más eficiente de trabajar.


Cosas que hemos aprendido

Es difícil señalar algunas lecciones destacadas singulares que aprendimos; obtuvimos más de una acumulación incremental de conocimiento sobre nuevas herramientas, API y procesos.

En el futuro, quizás seamos más audaces en forzar (o al menos sugerir) cambios en el código del juego donde se considere razonable. Es posible que hayamos hecho algunas tareas más difíciles de lo que debían ser en esta ocasión. Pero la definición de 'razonable' siempre va a variar enormemente de un proyecto a otro.

Además, es probable que esperemos a que un juego esté más completo antes de comenzar a trabajar en un puerto en el futuro, haciendo que más gente trabaje sólidamente por menos tiempo. Nuevamente, la factibilidad de esto podría variar enormemente entre proyectos dependiendo del calendario de lanzamiento. Sin embargo, habiéndolo hecho una vez, ahora podemos estimar mejor cuánto tiempo podremos necesitar.

Lo más importante es que hemos adquirido meses de experiencia valiosa en una nueva plataforma, incluido su proceso de envío, incluso con la posibilidad de investigar algunas de sus características únicas. Para un equipo que se basa principalmente en el trabajo por contrato y el trabajo por contrato como fuente de Ingreso, el valor de esto no puede ser subestimado..


Conclusión

Mi consejo para cualquiera de ustedes que esté considerando un puerto para Vita sería darle una oportunidad. Creo que hay una cierta mística que rodea el desarrollo de la consola; tuvimos la suerte de tener experiencia en este campo, pero incluso sin eso no debería ser desanimado.

Sony es muy acogedor para los desarrolladores independientes y pequeños (algo que creo que se está haciendo evidente para la comunidad de desarrolladores de juegos en general) y, si tiene un grado razonable de conocimientos técnicos de desarrollo de juegos, con el gran apoyo del equipo de soporte para desarrolladores de Sony, debería No te topes con ningún desafío insuperable..

Quell Memento para Vita ya está disponible en SCEA y SCEE.