Comprendiendo MetalKit: Comenzando con el marco de gráficos de Apple.
MetalKit es un marco de alto nivel que facilita el uso de Metal. Aquí tienes cómo empezar a utilizar el framework 3D de Apple.
Introducción a Metal
Metal es la plataforma de gráficos y juegos en 3D de Apple para renderizar objetos en dispositivos Apple. Diseñado para reemplazar a OpenGL y otros frameworks 3D, Metal tiene la ventaja de estar optimizado para el hardware de Apple y lograr un rendimiento máximo. Apple ofrece una renderización en 3D fluida en dispositivos Apple a niveles de rendimiento que no son posibles con otros frameworks 3D. Probablemente hayas visto un ejemplo de renderización Metal en un dispositivo iOS o macOS si te has suscrito y ejecutado la aplicación de juegos Arcade de Apple. La animación de introducción en Arcade se renderiza con Metal.
MetalKit y sus funciones adicionales
En 2015, en la WWDC, Apple presentó otro framework de alto nivel para Metal llamado MetalKit. Este framework facilita el uso de Metal al proporcionar algunas funciones de nivel superior que hacen que el desarrollo de aplicaciones 3D sea más sencillo. Específicamente, MetalKit proporciona API adicionales de Metal en las siguientes áreas: carga de texturas, Model I/O y gestión de vistas.
Carga de texturas
Usando MetalKit, la carga de activos y texturas es más fácil gracias a la clase MTKTextureLoader. Esta clase proporciona una forma sencilla de cargar activos y texturas, así como configurar opciones de texturas. Estas opciones incluyen el uso y carga de mipmaps, modos de almacenamiento y caché, transformación de coordenadas de textura, uso de texturas de cubo y opciones de color RGB.
Model I/O
Model I/O es el framework de desarrollo de Apple para gestionar activos en 3D y 2D. La integración de Model I/O en MetalKit incluye API para cargar rápidamente texturas en buffers de Metal y utilizar datos de malla mediante contenedores. Actualmente hay aproximadamente media docena de clases relacionadas con Model I/O en MetalKit, la mayoría de las cuales se ocupan de mallas.
Gestión de vistas
La mayoría de las aplicaciones de iOS y macOS utilizan vistas, clases estándar que presentan información visual y elementos de interfaz de usuario en pantalla. Diferentes subclases de vistas proporcionan diferentes tipos de vistas. Por ejemplo, en iOS, UIView es la clase base de vista, pero UIButton es una subclase de vista de botón derivada de UIView. Al utilizar clases de vistas orientadas a objetos en iOS o macOS, puedes construir funcionalidades adicionales que se basan en funcionalidades estándar ya definidas por las clases de Apple. Esto se conoce como herencia de objetos. En MetalKit, se proporciona una nueva clase llamada MTKView, que permite a los desarrolladores crear vistas completas de Metal en aplicaciones. Al tener una clase de vista de Metal dedicada, la vista puede ser dibujada y gestionada de manera óptima por Metal sin necesidad de código adicional.
Animación básica en MetalKit
Al igual que muchas vistas estándar de iOS o macOS, MTKView también tiene una capa de animación básica. Core Animation es el marco de animación 2D de alto rendimiento de Apple. La mayoría de las vistas tienen una CALayer, un objeto de capa de animación básica que puede dibujar y animar gráficos en 2D. Las capas de animación básica se pueden agrupar y combinar para crear animaciones complejas. MTKView tiene su propia subclase de CALayer llamada CAMetalLayer, en la que Metal puede renderizar. Puedes combinar CAMetalLayer con otras capas de animación básica para crear animaciones combinadas en 2D y 3D. En la mayoría de los casos, tanto para las capas de animación básica en 2D como en 3D, el dibujo es mucho más rápido y eficiente que el dibujo que ocurre en las vistas UIView. También puedes ajustar la opacidad o alfa de las capas de animación básica para hacer partes transparentes.
Modos de dibujo en MTKView
MTKView admite tres modos de dibujo: notificaciones temporizadas, notificaciones explícitas y dibujo explícito. En el dibujo temporizado, la vista se actualiza a intervalos regulares establecidos internamente en el objeto. La mayoría de los juegos utilizan este modo cuando se representa una escena de juego a una velocidad específica descrita en fotogramas por segundo (FPS). Con el modo temporizado, también puedes establecer o borrar la propiedad isPaused para iniciar y detener la animación de la vista. En el modo de notificación, el redibujo ocurre cuando alguna parte de la vista se invalida. Esto te permite redibujar solo una parte de la vista o capa, lo cual lleva menos tiempo y mejora el rendimiento del juego. Para forzar un redibujo utilizando el modo de notificación, simplemente envía un mensaje setNeedsDisplay() al objeto de la vista para que se redibuje. Esto fuerza a la vista a redibujar todas sus subvistas enviándoles a cada una un mensaje setNeedsDisplay(). En el dibujo explícito, puedes redibujar el contenido de la vista enviando directamente un mensaje draw() al objeto de la vista. Esto generalmente no se recomienda a menos que tengas un flujo de trabajo de dibujo personalizado que haga algo fuera de la jerarquía de vista/subvista estándar. También puedes redibujar solo partes de una vista enviando un mensaje setNeedsDisplay() a sus subvistas, evitando así el redibujo de la vista de nivel superior.
Programación orientada a objetos
En la programación orientada a objetos (OOP), los objetos se definen por medio de clases. Una clase es una definición en un archivo de código fuente que especifica qué contiene un objeto y, en Swift, también su implementación real. Una clase define métodos (funciones) que pueden recibir mensajes enviados por otros objetos para realizar alguna función. Cada método contiene código para realizar un trabajo. Una clase también define propiedades o variables que pueden contener datos. Por lo general, los métodos de una clase realizan algún trabajo en las propiedades de la clase. La mayoría de los métodos, pero no todos, pueden leer la mayoría (pero no todas) de las propiedades contenidas en la clase o en una de sus superclases (clases padre). Todo lo anterior es conocido como encapsulación de objetos. Los objetos encapsulan tanto los datos como los métodos para mantener todo ordenado y organizado. Es más fácil transportar, referenciar, copiar y utilizar objetos con sus datos asociados en un solo lugar que tener que hacer un seguimiento de los datos por separado. La herencia es una característica de OOP mediante la cual se pueden definir nuevas clases a partir de otra clase. El objeto derivado se llama subclase y la clase principal se llama superclase. Se pueden definir cadenas largas de objetos mediante la creación de subclases. La herencia es poderosa porque te permite reutilizar código existente con casi ningún trabajo adicional. Las subclases heredan todo el comportamiento y las propiedades de sus clases principales con casi ningún trabajo adicional. Las subclases pueden agregar métodos adicionales que solo ellas (o sus subclases) conocen. Lo que es aún mejor, cuando se instancia (crea) una instancia (una copia) de un objeto en un programa, también se instancia automáticamente una copia de todos sus objetos superclase. Con una línea de código, puedes obtener un nivel vasto de funcionalidad del programa simplemente creando una instancia de una clase. La instanciación es simplemente la creación de un objeto, la asignación de memoria para él en RAM y ponerlo a disposición de un programa. Todo esto generalmente se define en uno o, en el caso de Objective-C, dos archivos de código fuente, generalmente uno o dos archivos por clase. Así que, en nuestra discusión anterior, un MTKView se define como una clase (por Apple) y se instancia cuando se crea en el código (por ti). El resultado es un objeto MTKView en memoria, listo para ser utilizado. Cuando el objeto MTKView ya no es necesario, se desasigna y se elimina de la memoria. La mayoría de las aplicaciones son programas que crean, utilizan, gestionan y destruyen cientos de objetos de este tipo. El paradigma de programación OOP es poderoso porque reduce considerablemente la cantidad de código necesario mediante la herencia y la reutilización, y mantiene los programas más modulares y reutilizables mediante la encapsulación de código y datos. Una vez que has escrito una clase para realizar un trabajo específico, puedes simplemente reutilizar la clase o crear una subclase en otro programa para crear rápidamente otra aplicación.
Animación básica en MetalKit
Al igual que muchas vistas estándar de iOS o macOS, MTKView también tiene una capa de animación básica de Core Animation. Core Animation es el marco de animación 2D de alto rendimiento de Apple. La mayoría de las vistas tienen una CALayer, un objeto de capa de animación básica que puede dibujar y animar gráficos en 2D. Las capas de animación básica se pueden agrupar y combinar para crear animaciones complejas. MTKView tiene su propia subclase de CALayer llamada CAMetalLayer, en la que Metal puede renderizar. Puedes combinar CAMetalLayer con otras capas de animación básica para crear animaciones combinadas en 2D y 3D. En la mayoría de los casos, tanto para las capas de animación básica en 2D como en 3D, el dibujo es mucho más rápido y eficiente que el dibujo que ocurre en las vistas UIView. También puedes ajustar la opacidad o alfa de las capas de animación básica para hacer partes transparentes.
Modos de dibujo en MTKView
MTKView admite tres modos de dibujo: notificaciones temporizadas, notificaciones explícitas y dibujo explíc