Título: Animar Gif como fondo de escritorio, va muy lento. Publicado por: **Aincrad** en 18 Mayo 2021, 15:23 pm Hola, tengo una duda, haber si alguien podria ayudarme.
Estoy intentando poner un gif de fondo de pantalla , para eso... se me ocurre obtener cada frame del gif y cada frame , lo pongo de fondo de escritorio. pero el problema es que va lageado. Esto es lo que estoy haciando : Para manipular el Gif , uso la clase de elektro, yo hice la mia, pero consume mucha memoria. asi que F. Clase : https://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg2116514#msg2116514 (https://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg2116514#msg2116514) Y lo que estoy haciendo : Código
Funciona pero va muy lento , alguna solucion? , gracias de antemano . Título: Re: Animar Gif como fondo de escritorio, va muy lento. Publicado por: Serapis en 18 Mayo 2021, 16:55 pm El principal problema de la lentitud, recáe en que un gif, es una cantidad de frames comprimidos y con transparencia (habitualmente), luego meterlo en un bucle, exige cada vez tener que descomprimir cada frame y recalcular y luego además como has elegido el modo 'tile', lo que supone que cada frame se repetirá hasta completar el tamaño de la pantalla, con tantas filas y columnas como se precisen (o recortar la imagen si excediera el tamaño de la pantalla).
Un típico visualizador de gif, lo que hace es en primer lugar extraer cada frame, esto es descomprimirlo y calcular la transparencia respecto del previo, de modo que se obtienen los frames descomprimidos simplemente como un 'picture' (un bitmap), serán luego esos bitmaps, los que iteren en el bucle... pero solo se descomprimen del fichero una sola vez. Ahí radica la principal desventaja de tu código. Código: array de picture bitmaps() Una vez tomados los frames, ya puedes en tu bucle rotar entre entre ellos pero ahora de un array de imágenes, que no necesitan ser descomprimidas cada vez (aunque ignoro si tu objeto gif, ya las tiene extraídas de una vez) y que ya cada uno tiene ahora el tamaño del escritorio (y no escalar con cada cambio de imagen).entero numFrames numframes = funcion ExtraerFrames(gif gif) picture frame, framefull dimensionar bitmaps(0 a gif.NumFrames) por cada frame en gif.Frames frameFull = ResizeFrame(desktop.width, desktop.Height, frame, tile) bitmaps(x)= frameFull x+=1 siguiente devolver gif.NumFrames fin funcion Por supuesto ahora teniendo cada imagen el tamaño del escritorio, debería signarse 'centrado' no 'tile' (que se retiene en la imagen)... Por último, deberías detectar si hay cambio de orientación o del tamaño del escritorio (el cambio de orientación es un cambio de tamaño, excepto cuando rota 180º), para readaptar (invocar de nuevo el código previo para reconstruir) los frames al nuevo tamaño del escritorio. Pero insisto en que no es buena idea hacer que el escritorio cambie constantemente su fondo. El escritorio es la ventana 0, todo el resto del IDE de windows cuelga de él, es la raíz. Cualquier sobrecarga en el uso o refresco del escritorio, supone un lastre para el resto. Piensa que otro agravio en la lentitud, es que el escritorio ha de recortar todos los elementos que contiene para pegar la imagen... Si al menos estuviera vacío... se evitaría el recorte, pero claro entonces no se distinguiría de un 'salvapantallas'... Como mínimo en tu bucle o bien pones un intervalo alto entre cambio de imágenes... o que se detenga cuando descubra que otros procesos (que no son el tuyo), consumen/demandan recursos del procesador... Título: Re: Animar Gif como fondo de escritorio, va muy lento. Publicado por: **Aincrad** en 18 Mayo 2021, 18:08 pm El principal problema de la lentitud, recáe en que un gif, es una cantidad de frames comprimidos y con transparencia (habitualmente), luego meterlo en un bucle, exige cada vez tener que descomprimir cada frame y recalcular y luego además como has elegido el modo 'tile', lo que supone que cada frame se repetirá hasta completar el tamaño de la pantalla, con tantas filas y columnas como se precisen (o recortar la imagen si excediera el tamaño de la pantalla). Un típico visualizador de gif, lo que hace es en primer lugar extraer cada frame, esto es descomprimirlo y calcular la transparencia respecto del previo, de modo que se obtienen los frames descomprimidos simplemente como un 'picture' (un bitmap), serán luego esos bitmaps, los que iteren en el bucle... pero solo se descomprimen del fichero una sola vez. Ahí radica la principal desventaja de tu código. Código: array de picture bitmaps() Una vez tomados los frames, ya puedes en tu bucle rotar entre entre ellos pero ahora de un array de imágenes, que no necesitan ser descomprimidas cada vez (aunque ignoro si tu objeto gif, ya las tiene extraídas de una vez) y que ya cada uno tiene ahora el tamaño del escritorio (y no escalar con cada cambio de imagen).entero numFrames numframes = funcion ExtraerFrames(gif gif) picture frame, framefull dimensionar bitmaps(0 a gif.NumFrames) por cada frame en gif.Frames frameFull = ResizeFrame(desktop.width, desktop.Height, frame, tile) bitmaps(x)= frameFull x+=1 siguiente devolver gif.NumFrames fin funcion Por supuesto ahora teniendo cada imagen el tamaño del escritorio, debería signarse 'centrado' no 'tile' (que se retiene en la imagen)... Por último, deberías detectar si hay cambio de orientación o del tamaño del escritorio (el cambio de orientación es un cambio de tamaño, excepto cuando rota 180º), para readaptar (invocar de nuevo el código previo para reconstruir) los frames al nuevo tamaño del escritorio. Pero insisto en que no es buena idea hacer que el escritorio cambie constantemente su fondo. El escritorio es la ventana 0, todo el resto del IDE de windows cuelga de él, es la raíz. Cualquier sobrecarga en el uso o refresco del escritorio, supone un lastre para el resto. Piensa que otro agravio en la lentitud, es que el escritorio ha de recortar todos los elementos que contiene para pegar la imagen... Si al menos estuviera vacío... se evitaría el recorte, pero claro entonces no se distinguiría de un 'salvapantallas'... Como mínimo en tu bucle o bien pones un intervalo alto entre cambio de imágenes... o que se detenga cuando descubra que otros procesos (que no son el tuyo), consumen/demandan recursos del procesador... Gracias bro, voy a dejar la idea de cambiar constantemente el fondo de pantalla. e intentare dibujar directamente en el escritorio , debajo de los iconos. es muchísimo mas rapido, y no sobrecarga el escritorio. Título: Re: Animar Gif como fondo de escritorio, va muy lento. Publicado por: **Aincrad** en 18 Mayo 2021, 19:57 pm Solucionado!
Tuve que convertir mucho código de c++ y c# a vb , pero valio la pena : (https://i.ibb.co/D9gvXTL/GIF-18-5-2021-1-50-01-p-m.gif) Solo faltan algunos ajustes. |