La interfaz de dispositivo gráfico ( GDI ) es una interfaz de programación de aplicaciones de Microsoft Windows y un componente central del sistema operativo responsable de representar objetos gráficos y transmitirlos a dispositivos de salida como monitores e impresoras .
GDI es responsable de tareas como dibujar líneas y curvas, renderizar fuentes y manejar paletas . No es directamente responsable de dibujar ventanas, menús, etc .; esa tarea está reservada para el subsistema de usuario , que reside en user32.dll y está construido sobre GDI. Otros sistemas tienen componentes que son similares a GDI, por ejemplo macOS ' cuarzo y X Window System ' s Xlib / XCB .
Las ventajas más importantes de GDI sobre los métodos más directos de acceso al hardware son quizás sus capacidades de escalado y su representación abstracta de los dispositivos de destino. Con GDI, es muy fácil dibujar en varios dispositivos, como una pantalla y una impresora, y esperar una reproducción adecuada en cada caso. Esta capacidad está en el centro de la mayoría de las aplicaciones " Lo que ve es lo que obtiene " para Microsoft Windows.
Los juegos simples que no requieren una representación gráfica rápida pueden usar GDI. Sin embargo, GDI es relativamente difícil de usar para animación avanzada y carece de la noción de sincronización con fotogramas de video individuales en la tarjeta de video , carece de rasterización de hardware para 3D, etc. Los juegos modernos generalmente usan DirectX , Vulkan u OpenGL en su lugar, lo que permite a los programadores explotar las características del hardware moderno.
Detalles técnicos
Un contexto de dispositivo (DC) se utiliza para definir los atributos del texto y las imágenes que se envían a la pantalla o impresora. GDI mantiene el contexto real. Se obtiene un identificador para el contexto del dispositivo (HDC) antes de que se escriba la salida y luego se libera después de que se hayan escrito los elementos. GDI utiliza el algoritmo de dibujo de líneas de Bresenham para dibujar líneas con alias. [1]
Historial de versiones
Versiones tempranas
GDI estuvo presente en la versión inicial de Windows. Los programas de MS-DOS habían manipulado hasta ahora el hardware de gráficos utilizando interrupciones de software (a veces a través del BIOS de vídeo ) y manipulando la memoria de vídeo directamente. El código escrito de esta manera espera que sea el único usuario de la memoria de video, lo que no se podía sostener en un sistema con ventanas como Microsoft Windows, donde varias aplicaciones querrían escribir (en sus propias subventanas) al mismo tiempo. BYTE en diciembre de 1983 discutió los planes de Microsoft para un sistema para generar gráficos tanto en impresoras como en monitores con el mismo código en la próxima primera versión de Windows. [2]
Windows XP
Con la introducción de Windows XP , GDI se complementó con el subsistema GDI + basado en C ++ . GDI + agrega gráficos 2D suavizados, coordenadas de punto flotante, sombreado de degradado, administración de rutas más complejas, soporte intrínseco para formatos de archivos de gráficos modernos como JPEG y PNG , y soporte para la composición de transformaciones afines en la canalización de vistas 2D. GDI + usa valores RGBA para representar el color. El uso de estas funciones es evidente en la interfaz de usuario de Windows XP y en varias de sus aplicaciones, como Microsoft Paint , Visor de imágenes y fax de Windows , Asistente de impresión de fotos y el protector de pantalla de presentación de diapositivas de Mis imágenes, y su presencia en la capa gráfica básica simplifica enormemente las implementaciones de vectores. -sistemas gráficos como Flash o SVG .
GDI + se incluye con todas las versiones de Windows desde Windows XP. La biblioteca dinámica GDI + también se puede enviar con una aplicación y usarse en versiones anteriores de Windows desde Windows 98 y Windows NT 4.0 en adelante. [3]
Debido al procesamiento de texto adicional y las capacidades de independencia de resolución en GDI +, la representación de texto la realiza la CPU [4] y es casi un orden de magnitud más lenta que en GDI acelerado por hardware. [5] Chris Jackson publicó algunas pruebas que indicaban que un fragmento de código de representación de texto que había escrito podía representar 99.000 glifos por segundo en GDI, pero el mismo código usando GDI + representaba 16.600 glifos por segundo.
La biblioteca de clases de Microsoft .NET proporciona una interfaz administrada para GDI + a través del System.Drawing
espacio de nombres .
GDI + es similar (en propósito y estructura) al subsistema QuickDraw GX de Apple y las bibliotecas de código abierto y Cairo .
Windows Vista
En Windows Vista, todas las aplicaciones de Windows, incluidas las aplicaciones GDI y GDI +, se ejecutan en el nuevo motor de composición, Desktop Window Manager (DWM), que se basa en el modelo de controlador de pantalla de Windows . La representación GDI se implementa con el controlador de pantalla Canonical (cdd.dll), que atrae las superficies de la memoria del sistema que luego se redirigen a través de DWM, y el controlador de la tarjeta de video ya no acelera por hardware GDI . [6] [7] [8] Debido a la naturaleza de las operaciones de composición, los movimientos de ventana pueden ser más rápidos o más receptivos porque el contenido subyacente no necesita ser re-renderizado por la aplicación. [7]
Windows 7
Windows 7 incluye aceleración de hardware GDI para operaciones de blitting en el modelo de controlador de pantalla de Windows v1.1 . Esto mejora el rendimiento de GDI del controlador de pantalla Canonical y permite que el motor DWM utilice la memoria de vídeo local para la composición, lo que reduce la huella de memoria del sistema y aumenta el rendimiento de las operaciones gráficas. La mayoría de las operaciones de GDI primitivas todavía no están aceleradas por hardware, a diferencia de Direct2D . En noviembre de 2009, tanto AMD como Nvidia lanzaron controladores de video compatibles con WDDM v1.1.
GDI + sigue dependiendo de la representación de software en Windows 7. [9]
Impresoras GDI
Una impresora GDI o Winprinter (análoga a un Winmodem ) es una impresora diseñada para aceptar la salida de una computadora host que ejecuta GDI en Windows. La computadora host realiza todo el procesamiento de impresión: el software GDI procesa una página como un mapa de bits que se envía a un controlador de impresora de software , generalmente proporcionado por el fabricante de la impresora, para procesarla para la impresora en particular y luego a la impresora. [10] [11] La combinación del GDI y el controlador es bidireccional; reciben información de la impresora, como si está lista para imprimir, si no tiene papel o tinta, etc.
Las impresoras que no son GDI requieren hardware, firmware y memoria para la reproducción de páginas; una impresora GDI utiliza la computadora host para esto, lo que la hace más barata de fabricar que una impresora similar que no sea GDI. Algunos fabricantes producen esencialmente la misma impresora en una versión compatible con un lenguaje de control de impresoras como PCL o PostScript , y una versión más económica solo para GDI. En la mayoría de los casos, solo los modelos de menor costo en la gama de cualquier fabricante admiten solo GDI.
Una impresora con su propio lenguaje de control puede aceptar entradas desde cualquier dispositivo con un controlador adecuado; una impresora GDI requiere una PC con Windows y no es compatible con otro hardware y sistemas operativos. En general, las impresoras GDI no son compatibles con los servidores de impresión de hardware , aunque algunos servidores tienen una capacidad de procesamiento incorporada que los hace compatibles con las impresoras GDI especificadas. Las impresoras GDI se pueden poner a disposición de las computadoras en una red si están conectadas como impresoras compartidas en una computadora que está en y ejecuta Windows. Se han escrito algunos controladores GDI "genéricos", como pnm2ppa, que hacen que algunas impresoras GDI sean compatibles con sistemas operativos que no son Windows, como FreeBSD , pero no hay garantía de que se admitirá ninguna impresora GDI en particular. [10]
Para permitir una creación más sencilla de controladores para Winprinters, se creó el controlador de impresora universal de Microsoft . Esto permite a los proveedores de impresoras escribir "minidrivers" de descripción de impresora genérica (GPD), que describen las capacidades de la impresora y el conjunto de comandos en texto plano, en lugar de tener que desarrollar el controlador en modo kernel.
Limitaciones
Cada vez que se abre una ventana, consume objetos GDI. A medida que aumenta la complejidad de la ventana, con características adicionales como botones e imágenes, también aumenta el uso de su objeto GDI. Cuando hay demasiados objetos en uso, Windows no puede dibujar más objetos GDI, lo que provoca que el software se comporte mal y que el funcionamiento del programa se congele y no responda. [12] Muchas aplicaciones también están codificadas incorrectamente y no liberan objetos GDI después de su uso, lo que agrava aún más el problema. [13] El total de objetos GDI disponibles varía de una versión de Windows a la siguiente: Windows 95, 98 y Millennium tenían un límite de 1.200 objetos en total; Windows 2000 tiene un límite de 16 384 objetos; y Windows XP, Vista y Windows 7 tienen un límite configurable (a través del registro) que por defecto es de 10,000 objetos por proceso (pero un máximo teórico de 65,536 para toda la sesión). [14] [15] Windows 8 y 8.1 aumentan aún más el límite de objetos GDI a 65.536 por sesión de inicio de sesión de usuario.
Las versiones anteriores de Windows, como Windows 3.1 y Windows 98, incluían un programa Medidor de recursos para permitir al usuario controlar la cantidad de recursos GDI totales del sistema en uso. Desafortunadamente, este medidor de recursos consumió objetos GDI. Las versiones posteriores, como Windows 2000 y Windows XP, pueden informar el uso de objetos GDI para cada programa en el Administrador de tareas, pero no pueden decirle al usuario la capacidad total de GDI disponible.
El desbordamiento de la capacidad de GDI puede afectar al propio Windows, evitando que se abran nuevas ventanas, que se muestren menús y que aparezcan cuadros de alerta. La situación puede ser difícil de solucionar y potencialmente puede requerir un restablecimiento completo forzado del sistema, ya que impide que funcionen los programas centrales del sistema. En Windows 8 y 8.1, los cierres de sesión forzados se producen como resultado de un desbordamiento de la capacidad de GDI en lugar de un reinicio completo.
Por ejemplo, forzar la finalización de un proceso congelado mediante el Administrador de tareas normalmente hace que aparezca una ventana de alerta "¿Está seguro?" . Sin GDI libre, Windows emite un pitido y la opción de alerta no aparece, por lo que los procesos de desbordamiento de GDI no se pueden terminar (a menos que el usuario use el comando taskkill ).
Sucesor: Direct2D y DirectWrite
Direct2D y DirectWrite se diseñaron para reemplazar GDI / GDI + y Uniscribe , respectivamente, para la representación orientada a la pantalla y se enviaron con Windows 7 y Windows Server 2008 R2, así como con Windows Vista y Windows Server 2008 (con Platform Update instalado). Para la aplicación basada en WPF / UWP , Win2D es una biblioteca de clases similar a GDI desarrollada por Microsoft que se puede descargar dentro de Visual Studio usando NuGet . Win2D es una API de Windows Runtime fácil de usar para la representación de gráficos 2D en modo inmediato con aceleración de GPU. [16] [17]
Ver también
- Ala
- DirectX
- Especificación de papel XML
- Direct2D
- DirectWrite
- Darse de baja
- Archivos de la biblioteca de Microsoft Windows
notas y referencias
- ^ Comparación de aceleración de hardware Direct2D y GDI. https://msdn.microsoft.com/en-us/library/windows/desktop/ff729480(v=vs.85).aspx
- ^ Butler, John (diciembre de 1983). "Salida de gráficos independiente del dispositivo para Microsoft Windows" . BYTE . pag. 49 . Consultado el 20 de octubre de 2013 .
- ^ GDI +
- ^ "API de dibujo 2D en Windows -" . Blog para desarrolladores de DirectX . Blogs de MSDN. 12 de mayo de 2009 . Consultado el 19 de julio de 2012 .
- ^ Jackson, Chris. "Rendimiento de procesamiento de texto GDI vs GDI +" . Consonancia semántica de Chris Jackson . Microsoft.
- ^ MSDN: Comparación de la aceleración de hardware Direct2D y GDI
- ^ a b GDI no está acelerado por hardware en Windows Vista
- ^ Ventanas en capas ... SW es a veces más rápido que HW . Avalite en blogs de MSDN.
- ^ Thomas Olsen (29 de octubre de 2008). "Presentación de la API de Microsoft Direct2D" .
- ^ a b "linuxprinting.org sobre la impresora GDI" . La Fundación Linux. Archivado desde el original el 7 de febrero de 2007 . Consultado el 24 de diciembre de 2020 .
- ^ "Impresoras solo para Windows" . Proyecto de documentación de Linux . Consultado el 29 de octubre de 2019 .
- ^ Artículo 838283 de la base de conocimientos de Microsoft: los menús de la aplicación de escritorio se muestran incorrectamente si un proceso excede su cuota de objetos GDI en Windows XP o en Windows 2000 http://support.microsoft.com/kb/838283
- ^ Blog de Microsoft Developer Network: la fuga de GDI en Outlook 2007 causa problemas cuando el uso de GDI alcanza los 10.000 objetos http://blogs.msdn.com/rgregg/archive/2007/09/03/outlook-2007-gdi-leak-hotfix.aspx
- ^ Red de desarrolladores de Microsoft: límites de objetos GDI http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx
- ^ Artículo 894500 de la base de conocimientos de Microsoft: los programas .NET diseñados en sistemas operativos NT más nuevos pueden funcionar mal en versiones anteriores de Win 95 / Win 98 / Win ME debido a límites de uso de GDI más bajos http://support.microsoft.com/kb/894500
- ^ Documentos de Win2D GitHub
- ^ Galería de ejemplos de Win2D
enlaces externos
- Página de GDI + de Microsoft
- Lista de preguntas frecuentes sobre GDI + de Bob Powell
- Artículo de MSDN sobre descripción general de GDI
- Boletín de seguridad de Microsoft MS04-028
- F-Secure: una vulnerabilidad crítica en MS Windows puede aumentar la amenaza del virus
- IGDI + : biblioteca GDI + de código abierto de Delphi .