Imagina un motor de renderizado imperativo que transforma los sprites en un mapa de bits que luego se muestra. Esto se basa en gran medida en la capacidad de mutar de manera eficiente píxeles individuales en dicho mapa de bits. ¿Cómo podría hacer tal cosa un idioma sin efectos secundarios? ¿Supongo que se necesita una estructura de datos completamente diferente?¿Cómo tendría que imaginar la representación basada en píxeles en Haskell?
Respuesta
Puede convertir cualquier algoritmo que use estado mutable en un algoritmo que "encadena" el estado junto con él. Haskell proporciona una forma de hacerlo tal que todavía se siente como una programación imperativa con el estado Monad.
Aunque, me parece que la operación básica de blit podría hacerse en un estilo más funcional. Básicamente está combinando dos mapas de bits para producir un nuevo mapa de bits mediante el funcionamiento de píxel por píxel. Eso suena muy funcional para mí.
alta calidad del código imperativo es a menudo más rápido que un buen código funcionales, pero si usted está dispuesto a renunciar a un poco de velocidad que normalmente puede crear muy buenos arquitecturas con un estilo funcional pura
Haskell tiene efectos secundarios y que debería usarlos cuando sea apropiado. Una rutina blit de alta velocidad que va a estar en su bucle interno (y por lo tanto es crítica para el rendimiento) es ciertamente un lugar donde la mutación es apropiada, ¡así que úsala! Tiene un par de opciones:
- Haga rodar el suyo en Haskell, usando ST (U) Array o IO (U) Array. No recomendado.
- Haga rodar el suyo en C y llámelo con el FFI. No recomendado.
- Utilice uno de los muchos kits de herramientas gráficas que ya ofrecen este tipo de operaciones, y tiene cientos de horas dedicadas al programador para hacer una buena interfaz con alto rendimiento, como Gtk u OpenGL. Muy recomendable.
¡Disfrútalo!
una manera funcional natural de representación de una imagen es el uso de la función de índice:
Image :: (Int,Int) -> Color
Con esta representación, blitting un área de una imagen a otra que se lograría con
blit area a b = \(x,y) -> if (x,y) `isInsideOf` area then a (x,y) else b (x,y)
Si Se requiere traducción u otra transformación, se puede aplicar directamente a las coordenadas:
translate (dx,dy) image = \(x,y) -> b (x+dx,y+dy)
Esta representación le proporciona una forma natural de trabajar con puntos de imagen. Puede, por ejemplo, trabajar fácilmente con las áreas no rectangulares, y hacer trucos como hacer la interpolación de imagen como función independiente en lugar de ser parte de sus algoritmos de imagen de escala habituales:
quadraticInterpolation :: ((Int,Int) -> Color) -> ((Double,Double) -> Color)
El rendimiento puede sufrir en algunos casos, como cuando se combinan varias imágenes en una y luego se hacen cálculos con el resultado. Esto da como resultado una cadena de pruebas para cada píxel para cada cálculo sucesivo. Sin embargo, al aplicar la memorización, podemos representar temporalmente la representación funcional en una matriz y transformarla en función de índice, eliminando así el rendimiento alcanzado por las operaciones sucesivas.
Tenga en cuenta que la memorización también se puede utilizar para introducir el paralelismo en el proceso.
- 1. ¿Por qué la entrada basada en [Char] es mucho más lenta que la salida basada en [Char] en Haskell?
- 2. Representación hexagonal de flotadores en Haskell
- 3. ASP.NET MVC ¿Cómo aplicar la representación de Vista basada en roles o en autenticación?
- 4. Python: representación eficiente de píxeles y valores asociados
- 5. ¿Cuándo JavaScript == tendría más sentido que ===?
- 6. Haskell - Marco de Fungen - Problema de representación
- 7. Píxeles de dibujo en WPF
- 8. ¿Podrías imaginar alguna otra forma de implementar OO que el enfoque clásico basado en clases?
- 9. Cómo escalar píxeles en pantalla?
- 10. ¿Cómo convertir el código fuente a una representación basada en xml del ast?
- 11. Cómo recortar la representación en OpenGL (C++)
- 12. ¿Cómo funciona la encriptación basada en contraseñas?
- 13. iOS 5 + GLKView: ¿Cómo acceder a los datos RGB de píxeles para la selección de vértices basada en colores?
- 14. document.execCommand() FontSize en píxeles?
- 15. Generación de una representación lineal, basada en la línea de tiempo, de elementos que consumen tiempo y elementos que no, pero aún necesitan espacio para dibujarse en
- 16. ¿Es seguro asumir que un servidor tendría PHP 5?
- 17. ¿Por qué tendría que llamar a disponer de controles ASP.NET?
- 18. Búsqueda basada en AST para Eclipse
- 19. Facturación basada en la suscripción
- 20. Procesamiento de gráficos paralelos en Haskell
- 21. píxeles en Direct2D
- 22. Fuentes de píxeles en Silverlight 4
- 23. Haskell gráfico de tipo de datos de representación
- 24. cómo implementar la representación en escala de grises en OpenGL?
- 25. ¿Habilita la nueva representación GL en Google Maps API v3?
- 26. Cómo implementar la aplicación basada en EJB en Tomcat
- 27. cómo especificar tamaño de la imagen en píxeles
- 28. Android: Convertir puntos en píxeles
- 29. Renderización de sub-píxeles de fuentes en el iPad
- 30. ¿Cómo funciona la derivación en Haskell?