https://foro.gambas-es.org/viewtopic.php?f=1&t=2410
-----------------------------------
jsbsan
Martes, 05 Junio 2012, 20:09

Rendimiento De La Orden Draw...
-----------------------------------
Queria preguntaros, como es mas rapido usar la orden Draw...

Os explico tengo que dibujar en la pantalla muchos clases que incluyen una pictures diferente...

Normalmente haria en cada clase, un método para dibujarla. Por ejemplo:
[code linenumbers=false syntax=gambas]'Clase Nave
....
...
Public sub dibuja(area  as drawing)
draw.begin(area)
draw.picture(PictureNave,pos.x,pos.y)
draw.end
end
--------------------------------
'Clase Planeta
...
...
...
Public sub dibuja(area  as drawing)
draw.begin(area)
draw.picture(PicturePlaneta,pos.x,pos.y)
draw.end
end[/code]

Como veis uso muchos draw.begin y draw.end.... ¿es más rapido crear una subrutina y en  ella dibujarlo todo solo con un draw.begin y un draw.end?

Me explico:
'modulo dibujar toda la pantalla

[code linenumbers=false syntax=gambas]public sub dibujapantalla(area as drawing,planetas as classplaneta[], naves as classnaves[] )
draw.begin(area)

for a=0 to planeta.count-1
draw.picture(planetas[a].picture,planetas[a].pos.x, planetas[a].pos.y)
next

for a=0 to naves.count-1
draw.picture(naves[a].picture,naves[a].pos.x, naves[a].pos.y)
next

draw.end

end[/code]

En principio, parece que la primera forma es mas clara, mas orientada al objeto, pero mas lenta que la segunda ¿no? ¿que os parece?

Saludos

Nota:
¿Hay alguna forma de medir el rendimiento, tiempo que se tarda en hacer una operación, consumo de memoria del ordenador en gambas?


-----------------------------------
Shell
Martes, 05 Junio 2012, 23:20

Re: Rendimiento De La Orden Draw...
-----------------------------------
Hola Julio.

Es lo normal, construirte un procedimiento para que no repetir partes de código.
Bueno, un método.

La primera forma es mas primitiva si tienes que repetir muchas veces la misma rutina.  :? 

Y si fuera un for each next.Estas tratando con un array.
Es dibujar todos  los planetas y las naves.¿ No ?..Si no, no mostrara todos ellos. ;-)

Para medir el tiempo.Una manera fácil seria guardar la hora al comienzo de la rutina que te interesa en una
variable y al acabar en otra.Haces la diferencia.

Saludos.


-----------------------------------
fabianfv
Miercoles, 06 Junio 2012, 01:08

Re: Rendimiento De La Orden Draw...
-----------------------------------
Julio, tenés que pensar en términos de objetos. Si encontraste un método que se repite es que obviaste la existencia de un concepto más abstracto que lo incluye. Por ello, no es que la 1era opción sea más orientada a objetos, de hecho la redundancia de ese método implica que algo está mal. No obstante, no hay razones para pensar que una sería más rápida que la otra.

Si no recuerdo mal, los objetos DrawingArea brindan la posibilidad de usar una caché y es en el uso de esa característica que podría haber una diferencia apreciable en el rendimiento.

Saludos.


-----------------------------------
jsbsan
Jueves, 07 Junio 2012, 20:15

Re: Rendimiento De La Orden Draw...
-----------------------------------
Shell:

[quote]for each next[/quote]
Buena idea, mirare en la documentacion como hacerlo con un array (yo siempre lo habia usado con consultas de bases de datos  :mryellow: )



fabianfv

[quote]No obstante, no hay razones para pensar que una sería más rápida que la otra. [/quote]
Lo que he "descubierto", es que cada vez que se ejecuta un bloque de orden "draw.begin .....  draw.end", dibuja lo que le hayamos dicho... si lo pongo varias veces (una para dibujar el fondo, otro para dibujar cada planeta, otra para dibujar cada nave), provoca un efecto de "refresco" de pantalla 

Sin embargo, usando un solo bloque para dibujarlo todo, ese efecto no se nota, quedando mejor la presentacion de los movimientos.


[quote]los objetos DrawingArea brindan la posibilidad de usar una caché[/quote]
La propiedad cache del drawingArea, la tengo como true, ya que sino tengo problemas al poner formularios encimas, o mover el objeto...

Gracias !!!  :mryellow:  :mryellow:


-----------------------------------
fabianfv
Viernes, 08 Junio 2012, 02:57

Re: Rendimiento De La Orden Draw...
-----------------------------------
[quote user="jsbsan" post="13726"]

fabianfv

Lo que he "descubierto", es que cada vez que se ejecuta un bloque de orden "draw.begin .....  draw.end", dibuja lo que le hayamos dicho... si lo pongo varias veces (una para dibujar el fondo, otro para dibujar cada planeta, otra para dibujar cada nave), provoca un efecto de "refresco" de pantalla 

Sin embargo, usando un solo bloque para dibujarlo todo, ese efecto no se nota, quedando mejor la presentacion de los movimientos.
[/quote]

Pero, ¿estarías redibujando todos los elementos que se ven en el formulario? Si mal no recuerdo, se puede dibujar en un área específica de un DrawingArea, lo que te permitiría redibujar sólo las partes que cambian (que se mueven).

Respecto de que opción "es más POO", es la segunda (aunque ese método debe pertenecer a la clase adecuada).

Por otra parte no entiendo por qué tienes parametrizado el DrawingArea (¿drawing es un control personalizado basado en DrawingArea?). También es confuso el nombre de los arrays classplaneta[] y classnaves[] porque la lógica de tu código indica que son arrays cuyos elementos son objetos de tipo Planeta y de tipo Nave; sería más claro así: "planetas AS Planeta[], naves AS Nave[] (es innecesario y hasta confuso nombrar las clases usando el prefijo "class").

Me gustaría que me cuentes sobre este trabajo tuyo porque yo estuve escribiendo algunos juegos en Gambas (aunque no están terminados) para mi libro y como un efecto secundario (pero buscado) lo que está emergiendo es un pequeño framework para juegos.

Por último, una pregunta. ¿Recuerdas si Gambas brinda la posibilidad de ajustar el tamaño de una imagen (stretch) para dibujarla en un DrawingArea en un tamaño diferente al original?


-----------------------------------
jsbsan
Viernes, 08 Junio 2012, 16:29

Re: Rendimiento De La Orden Draw...
-----------------------------------
fabianfv

[quote]¿estarías redibujando todos los elementos que se ven en el formulario?[/quote]
Si, todos, primero el fondo, luego los planetas, luego las naves, luego las explosiones...

[quote]se puede dibujar en un área específica de un DrawingArea, lo que te permitiría redibujar sólo las partes que cambian (que se mueven). [/quote]
Pues eso no se como se puede hacer....  :roll: 



[quote]
DrawingArea (¿drawing es un control personalizado basado en DrawingArea?). [/quote]

Me equivoque escribiendo el codigo se trata de un DrawingArea... y no de un "drawing"


[quote]es innecesario y hasta confuso nombrar las clases usando el prefijo "class"[/quote]
Pues, la verdad es que me resulta más cómodo para escribir el código, ya que aprovecho el Ide de gambas para cada vez que quiero instanciar una clase me resulta mas facil empezar a llamarla con "class..lo que sea" para encontrarla en la ayuda que sale...

[quote]Me gustaría que me cuentes sobre este trabajo [/quote]
El juego que quiero hacer es parecido a este [url=http://73c4e181.linkbucks.com]Enlace Juego Flash.
Lo que realmente me interesa el programar "la inteligencia del juego".... en eso estoy... :roll: 

[quote]¿Recuerdas si Gambas brinda la posibilidad de ajustar el tamaño de una imagen (stretch) para dibujarla en un DrawingArea en un tamaño diferente al original?[/quote]

Lo que dice la ayuda interactiva del ide de gambas es:
[url=http://www.zimagez.com/zimage/capturadepantalla-080612-172807.php][img]http://www.zimagez.com/miniature/capturadepantalla-080612-172807.php[/img]
No se si te servirá...


