CLR: .Net / Mono / Boo / Otros CLR > C#
Discusion:
JuanK:
--- Citar ---Reitero sin intencion de molestar, la finalidad de este programa no es generar animaciones, y el ke se vea que se pintan linea por linea en pantalla es mas culpa del GDI+ pues está usando FillRectangle para pintar los puntos.
--- Fin de la cita ---
Nuevamente en desacuerdo, como cres que funciona el panit? adivina...con el gdi+ de hecho todo cuanto vez del sistema de ventanas de windows usa el GDI+ y nunca veraz que suceda eso, realmente es problema es la programacion.
--- Citar ---Aqui si no entendi muy bien, pero lo que se me fiura que pensaste es que puedes sin ningun problema pasar del backbuffer al frontbuffer sin calculo alguno, simplemente indicando las coordenadas left/top origen-destino, utilizando un BitBlt, DrawImage o un memcpy, pero eso no es razon de procesamiento extra. El problema es cuando hay que calcular las coordenadas de la entrada del mouse del usario, en el area de dibujo y convertirlos al origen, para luego pasarlo al backbuffer; lo cual es precisamente lo que digo que se está ahorrando.
--- Fin de la cita ---
bueno es cierto que ahorra un tiempo pero es despreciable a cmabio del costo que implica pasar repetidamente por el DMA para enviar los datos a la memoria de video, ya que es mucho mas rapido hacer un solo viaje con un bloque de datos por DMA que hacer muchos viajes con pequeños segmentos.
--- Citar ---Por otro lado, si no vas a mostrar animaciones (ni un solo cambio de texto, redibujado, etc.) no tiene caso utilizar el backbuffer. Pues no se necesita borrar la pantalla para redibujar en ella, a final de cuentas nada ha cambiado, por lo tanto si no hay animacion no hay redibujado(o no tiene porque haber) programado (solo el de hardware), y como no hay movimiento tampoco puede notarse el barrido generado por el refresco vertical.
--- Fin de la cita ---
Al usar backbuffer no se nceesita borarr la pantalla, solo se remplazan los datos que estan en ella y por otro lado el dibujar un circulo en un buffer y luego pasarlo a la pantalla no implica que se redibuje toda la pantalla sino solo el area donde esta el circulo.
--- Código: Text --- pues la unica forma de acceder al buffer blockeado es a travéz de punteros y funciones de memoria (memcpy,zeromemory, etc),
lo que pasa es que funciones como las que has mencionado, y de ehco cualquier operacion tenga o no tenga punteros... es hecha a travez de la api, el compilador convierte el codigo en llamados a la API que le autorizan o no una transaccion en memoria por ello cuando con un puntero vas por una locacion de memoira no asiganda te sale el mensaje de error del sistema (sea linux o windows) diciendo que hay una infraccion de acceso ya que es el propio sistema quien determina si se puede o no hacer algo en una locacion de memoria.
niofis:
--- Citar ---Nuevamente en desacuerdo, como cres que funciona el panit? adivina...con el gdi+ de hecho todo cuanto vez del sistema de ventanas de windows usa el GDI+ y nunca veraz que suceda eso, realmente es problema es la programacion.
--- Fin de la cita ---
Así es, el paint (versiones nuevas) utiliza gdi+. Y tal como lo dices es "problema" de la programación, ya que al no estar utilizando las funciones de gdi+ para el dibujado, hace mas lento las cosas al tener que utilizar un seudo-punto hecho con un fillrectangle con ancho y alto puestos a 1.
--- Citar ---bueno es cierto que ahorra un tiempo pero es despreciable a cmabio del costo que implica pasar repetidamente por el DMA para enviar los datos a la memoria de video, ya que es mucho mas rapido hacer un solo viaje con un bloque de datos por DMA que hacer muchos viajes con pequeños segmentos.
--- Fin de la cita ---
En eso tienes razon, pero a final de cuentas, solo son unos cuantos puntos los que vas a transferir al frontbuffer, comparado a todo el tamaño del backbuffer en un solo bloque, incluso si tan solo transfieres un area determinada, por decir un círculo, de la manera que él lo hace solo transfiere los puntos del perímetro. De otra forma, si transfieres el cuadro donde está el círculo con un BitBlt te traes muchisimos puntos mas (una transferencia de memoria mas grande, que tal vez no supere la velocidad que hacer las transferencias individuales para cada uno de los puntos de la circunferencia); ahora bien podrias decir utilizar un TransparentBlt pero con eso tambien te puedes traer mas informacion que la necesaria.
--- Citar ---Al usar backbuffer no se nceesita borarr la pantalla, solo se remplazan los datos que estan en ella y por otro lado el dibujar un circulo en un buffer y luego pasarlo a la pantalla no implica que se redibuje toda la pantalla sino solo el area donde esta el circulo.
--- Fin de la cita ---
No mencione que fuese necesario, borrar la pantalla para traerse el backbuffer. Pero al tratarse de graficos vectoriales, solo se dibuja la parte necesaria y obviamente hay que borrar el area de dibujo para redibujar, ya que si no los dibujos ke se encontraban ahi, kedarán sobrepuestos. Si se tratase de un programa con graficos tipo raster entonces no habria que borrar, simplemente sobreponer la parte cambiada o todo.
--- Citar ---lo que pasa es que funciones como las que has mencionado, y de ehco cualquier operacion tenga o no tenga punteros... es hecha a travez de la api, el compilador convierte el codigo en llamados a la API que le autorizan o no una transaccion en memoria por ello cuando con un puntero vas por una locacion de memoira no asiganda te sale el mensaje de error del sistema (sea linux o windows) diciendo que hay una infraccion de acceso ya que es el propio sistema quien determina si se puede o no hacer algo en una locacion de memoria.
--- Fin de la cita ---
Creo que no me di a entender, cuando tu utilizas punteros para acceder a la memoria no pasas por ningún API ni el compilador lo convierte a llamadas de API. Te puedes dar cuenta de esto si desensamblas un código ejecutable, cuando hayas hecho un acceso a memoria verás algo como MOV eax,[eax] donde esta cargando al registro eax, la informacion a la que apunta el valor de eax, sin llamar a la API, pues no hay ningun CALL.
Con el block de memoria que te deja accesar el lock del backbuffer tu puedes hacer algo como esto:
--- Código: Text --- int *video;//...video[100][100]=0;//... Donde pondrás el pixel 100,100 en color negro, acceso directo al backbuffer (VRAM o RAM).
Lo que hacen los sistemas operativos, es monitorear el uso de la memoria de cada uno de los programas que están en ejecución, en ningún momento los programas le piden permiso a windows para leer o escribir en ram (aunque para reservar memoria si), eso no implica ke solo puedas leer o escribir en tu espacio de memoria, por ejemplo puedes obtener el puntero de una ventana ajena a tu sistema y hacer con ella muchas cosas. Hay espacios de memoria restringidos y es cuando el sistema operativo destruye el proceso que la esta tratando de acceder. InvalidMemmoryAddress error, el mas clasico es el (0x000000), por punteros nulos.
niofis
niofis
ibito:
--- Citar ---QUOTE
Nuevamente en desacuerdo, como cres que funciona el panit? adivina...con el gdi+ de hecho todo cuanto vez del sistema de ventanas de windows usa el GDI+ y nunca veraz que suceda eso, realmente es problema es la programacion.
Así es, el paint (versiones nuevas) utiliza gdi+. Y tal como lo dices es "problema" de la programación, ya que al no estar utilizando las funciones de gdi+ para el dibujado, hace mas lento las cosas al tener que utilizar un seudo-punto hecho con un fillrectangle con ancho y alto puestos a 1.
QUOTE
bueno es cierto que ahorra un tiempo pero es despreciable a cmabio del costo que implica pasar repetidamente por el DMA para enviar los datos a la memoria de video, ya que es mucho mas rapido hacer un solo viaje con un bloque de datos por DMA que hacer muchos viajes con pequeños segmentos.
En eso tienes razon, pero a final de cuentas, solo son unos cuantos puntos los que vas a transferir al frontbuffer, comparado a todo el tamaño del backbuffer en un solo bloque, incluso si tan solo transfieres un area determinada, por decir un círculo, de la manera que él lo hace solo transfiere los puntos del perímetro. De otra forma, si transfieres el cuadro donde está el círculo con un BitBlt te traes muchisimos puntos mas (una transferencia de memoria mas grande, que tal vez no supere la velocidad que hacer las transferencias individuales para cada uno de los puntos de la circunferencia); ahora bien podrias decir utilizar un TransparentBlt pero con eso tambien te puedes traer mas informacion que la necesaria.
QUOTE
Al usar backbuffer no se nceesita borarr la pantalla, solo se remplazan los datos que estan en ella y por otro lado el dibujar un circulo en un buffer y luego pasarlo a la pantalla no implica que se redibuje toda la pantalla sino solo el area donde esta el circulo.
No mencione que fuese necesario, borrar la pantalla para traerse el backbuffer. Pero al tratarse de graficos vectoriales, solo se dibuja la parte necesaria y obviamente hay que borrar el area de dibujo para redibujar, ya que si no los dibujos ke se encontraban ahi, kedarán sobrepuestos. Si se tratase de un programa con graficos tipo raster entonces no habria que borrar, simplemente sobreponer la parte cambiada o todo.
QUOTE
lo que pasa es que funciones como las que has mencionado, y de ehco cualquier operacion tenga o no tenga punteros... es hecha a travez de la api, el compilador convierte el codigo en llamados a la API que le autorizan o no una transaccion en memoria por ello cuando con un puntero vas por una locacion de memoira no asiganda te sale el mensaje de error del sistema (sea linux o windows) diciendo que hay una infraccion de acceso ya que es el propio sistema quien determina si se puede o no hacer algo en una locacion de memoria.
Creo que no me di a entender, cuando tu utilizas punteros para acceder a la memoria no pasas por ningún API ni el compilador lo convierte a llamadas de API. Te puedes dar cuenta de esto si desensamblas un código ejecutable, cuando hayas hecho un acceso a memoria verás algo como MOV eax,[eax] donde esta cargando al registro eax, la informacion a la que apunta el valor de eax, sin llamar a la API, pues no hay ningun CALL.
Con el block de memoria que te deja accesar el lock del backbuffer tu puedes hacer algo como esto:
CODE
int *video;
//...
video[100][100]=0;
//...
Donde pondrás el pixel 100,100 en color negro, acceso directo al backbuffer (VRAM o RAM).
Lo que hacen los sistemas operativos, es monitorear el uso de la memoria de cada uno de los programas que están en ejecución, en ningún momento los programas le piden permiso a windows para leer o escribir en ram (aunque para reservar memoria si), eso no implica ke solo puedas leer o escribir en tu espacio de memoria, por ejemplo puedes obtener el puntero de una ventana ajena a tu sistema y hacer con ella muchas cosas. Hay espacios de memoria restringidos y es cuando el sistema operativo destruye el proceso que la esta tratando de acceder. InvalidMemmoryAddress error, el mas clasico es el (0x000000), por punteros nulos.
niofis
--- Fin de la cita ---
alguna duda? :whistling:
JuanK:
Por supuesto, pero no seguire discutiendo pues seria una discución sin fin y la verdad no me la paso todo el dia sin hacer nada y tengo que trabajar... :(
asi que decidi abandonar la converzacion, lo ideal que queria hacer era hacer un ejemplo yo mismo donde demostrara que lo que digo es cierto, pero lamentablemente ando muy mal de tiempo y tengo otros desarrollos muy urgentes por hacer. :huh:
Lo siento, si tengo tiempo en algunas semas hare lo de el ejemplo.. sino.. pues bien cada cual es libre de experimentar.
ibito:
--- Cita de: "JuanK" ---Por supuesto, pero no seguire discutiendo pues seria una discución sin fin y la verdad no me la paso todo el dia sin hacer nada y tengo que trabajar... :(
asi que decidi abandonar la converzacion, lo ideal que queria hacer era hacer un ejemplo yo mismo donde demostrara que lo que digo es cierto, pero lamentablemente ando muy mal de tiempo y tengo otros desarrollos muy urgentes por hacer. :huh:
Lo siento, si tengo tiempo en algunas semas hare lo de el ejemplo.. sino.. pues bien cada cual es libre de experimentar.
--- Fin de la cita ---
En realidad escribi "Alguna duda?" porque para ser sincero de todo lo que dijeron apenas entiendo un 30%... fueron muy tecnicos y yo no entendi del todo :P
Navegación
[*] Página Anterior
Ir a la versión completa