libreria-unifiedgfx

Librería UnifiedGFX

La librería UnifiedGFX permite desarrollar tus proyectos de forma independiente al hardware empleado.

Existen muchos tipos de MCU y pantallas, y muchas y muy buenas librerías para gestionarlas. Pero yo no quiero que mi proyecto dependa de un tipo determinado hardware, si no que quiero que funcione en cualquiera de ellos.

Idealmente, el objetivo es que la mayor parte de mi proyecto funcione lo mismo en un M5Stick con TFT, en un ESP8266 con una pantalla OLED, incluso en una matriz led RGB o WS2812b.

Sin embargo, esta capacidad de portabilidad viene con un (pequeño) coste de rendimiento. Si estás buscando el máximo rendimiento, probablemente esta librería no es para ti.

Personalmente, en la mayoría de ocasiones no me importa tener 30.48 fps o 29.83, comparado con la ventaja de ser independiente del hardware

Como usar UGFX

UnifiedGFX incorpora clases abstractas como IBitmap, IReadableBitmapo IGraphic.

Por otro lado, la clase Graphicimplementa casi todas las funciones de IGraphicusando únicamente las funciones de IBitmap, Height(), Width() y drawPixel().

De esta forma en tu proyecto, por ejemplo, tu función de dibujo quedaría así,

void draw(UGFX::IGraphic<uint16_t>& screen, uint16_t background, uint16_t color)
{
    //
}

Adaptando a tu hardware

Por diseño, UnfiedGFX no sabe nada sobre hardware y drivers, es una capa superior de abstracción. Para usarla en el hardware específico de tu proyecto puedes hacer dos cosas,

  • Usar un patrón adaptador
  • Modificar las librerías gráficas de tu hardware para implementar IGraphic

Un ejemplo de cómo implementar en tus clases Graphicse muestra en el ejemplo ‘Generic’.

Por otro lado, se proporcionan adaptadores y ejemplo de su uso para las librerías AdagruitGFX, eTFT y LGVX.

Rendimiento

Las funciones en los adaptadores están decoradas con el atributo ‘always_inline’, así que el rendimiento debería ser similar a usarlas la directamente.

El rendimiento será incluso superior si modificas las librerías de tu hardware para implementar las clases abstractas de UnifiedGFX

Por otro lado, el rendimiento real obtenido dependerá de lo bien que el adaptador aproveche las características del hardware.

Lo mínimo necesario para que UnifiedGFX funcione son las funciones de IBitmap, Height(), Width() y drawPixel(). Con esto obtendrías el mínimo rendimiento posible.

Si el adaptador overrides más funciones de Graphic, y las mapea hasta la librería del hardware, el rendimiento mejorara sustancialmente.

Esto es especialmente importante en funciones que realizan operaciones en bloque, que son mucho más rápidas que realizar la operación pixel por pixel. Normalmente estas funciones suelen ser drawHorizontalLine, drawVerticalLine o fillRect.

Descarga el código

Todo el código está disponible para su descarga en Github en este enlace https://github.com/luisllamasbinaburo/UnifiedGFX github-full