Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sistema De Mapas De Durezas Mediante Gdi De Window

Iniciado por ethernet, 23 de Agosto de 2005, 05:52:54 PM

« anterior - próximo »

ethernet

 No critico a la gente que trata de optimizar su código al máximo, pero está claro que para conseguir cosas importantes no es necesario, ___ni de lejos__, optimizar demasiado. Voy a poner los dos ejemplos que siempre pongo. Glest está programado en C++ usando OpenGL para renerizar, si mirais su código no es lo más óptimo del mundo, usa excepciones y me juego todo el dinero del mundo a que no todos sus algortimos son lo más óptimo, sin embargo ahí tienes GLEST por su versió 1.2 (sí, de hoy mismo :)) y con un MOD desarrollándose. El otro ejemplo es Haddd, un motor en C#, un lenguaje que lleva mil capas por debajo, etc, etc... y creo que poco hay que decir de Haddd, todos hemos visto su calidad.

A medida que maduras un poco te das cuenta que la optimización es un parte que debes tener en cuenta mucho depués de que tengas cierta experiencia a la hora de llevar a cabo proyectos, que es cuando tienes una visión global de una aplicación y es cuando de verdad puedes optimizar :). Hay algunos que hemos optado por ir por el camino de la eficiencia y no de la efectividad, esto es, queremos hacer juegos y no códigos muy rápidos, pero tb muy aislados.

En cualquier caso el COTW sirve precisamente para discutir un trozo de código y son muy enriquecedoras todas las aportaciones,  siempre y cuando vayan por el camino correcto y no por el que nos lleva a la descalificación y a las generalizaciones, que molestan tanto como inciertas son.

_XUTI_H_

 Este es el primer mensaje q escribo en este foro,
y si no pongo las etiquetas como toca y todo eso espero q me disculpeis. ;)

El tema de las durezas no creo q pueda traer tanta tela.
La idea (q pienso q es lo importante) es q un podamos dibujar un bitmap como una capa sobre una imagen, y que la podamos interpretar por separado para detectar colisiones!!!!

Entender estas cosas y saber aplicarlas es lo que, en mi modesta opinión, permite que existan los videojuegos, y q cada vez haya más gente q se dedique a aprender este mundo.

Cada uno comienza con lo q puede y como puede. Yo puedo llegar a avengorzarme al ver código q he escrito hace seis meses, pensando q ahora lo haria mejor ... pero si no hubiera hecho ese código hace medio año, ahora no podria realizarlo mucho mejor.

Alabo la labor de quien dedica horas a aprender, y a enseñar lo que aprende a otros como él.

Y finalmente, [EX3] si quieres realmente optimizar tus librerias guardando en RAM los bytes del mapa de durezas y accediendo con tus funciones, enviame un mensaje y te hecho una mano y las lineas de código que hagan falta.

Adew
UTI

ethernet

Cita de: "_XUTI_H_"El tema de las durezas no creo q pueda traer tanta tela.
aquí nos lo tomamos todo muy a pecho, lo entenderás cuando lleves más tiempo XD

Ya sabes que puedes enviarme un código si lo consideras útil para que lo publique y lo podamos discutir o tirarnos los trastos a la cabeza, según se vea.

un saludo

[EX3]

 
Cita de: "_XUTI_H_"El tema de las durezas no creo q pueda traer tanta tela.
La idea (q pienso q es lo importante) es q un podamos dibujar un bitmap como una capa sobre una imagen, y que la podamos interpretar por separado para detectar colisiones!!!!
Planteaselo a un novato o recien iniciado y a ver que te dice. Que para nosotros "ahora" nos parezca sencillo no quiere decir que para otros lo sean ;)

Cita de: "_XUTI_H_"Y finalmente, [EX3] si quieres realmente optimizar tus librerias guardando en RAM los bytes del mapa de durezas y accediendo con tus funciones, enviame un mensaje y te hecho una mano y las lineas de código que hagan falta.
Mi unico problema con guardar o no las texturas en RAM es si me conviene sobre cargar la RAM de texturas pudiendo guardarlas en la memoria de la tarjeta dejando la RAM disponible para otras tareas. Y aun asi, para evitar esa perdida de velocidad solo tendria que dejar "lockeadas" las superficies y almacenar la informacion de sus pixeles en un array en memoria cuando cargo las superficies para poder acceder a ellas sin tener que:
  • Bloquear la superficie
  • Obtener la descripcion de la superficie
  • Leer la informacion de los pixeles
  • Copiar la informacion de los pixeles en un array
  • Desbloquear la superficie
Todo esto cada vez que accedo a ellas para leer un simple pixel. Pierdo velocidad por realizar demasiados pasos en cada llamada a la funcion que me puedo ahorrar una vez cargada la superficie en memoria. Aun asi gracias por la ayuda :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Grugnorr

 Sin entrar en los flames:

a) Cargar en memoria un bitmap para leer un pixel y descargarlo me parece excesivo, intenta cachearlo.

B) Cuando cargues el mapa de durezas, pásalo a un array de bytes y haz tu lógica sobre él, será muucho más rápido.
hat the hells!

zupervaca

Cita de: "Grugnorr"Sin entrar en los flames:

a) Cargar en memoria un bitmap para leer un pixel y descargarlo me parece excesivo, intenta cachearlo.

B) Cuando cargues el mapa de durezas, pásalo a un array de bytes y haz tu lógica sobre él, será muucho más rápido.
no insistas, yo ya se lo dije unas cuantas veces y ni caso hijo :P

saludos

_XUTI_H_

 
Citar
Planteaselo a un novato o recien iniciado y a ver que te dice. Que para nosotros "ahora" nos parezca sencillo no quiere decir que para otros lo sean

Ei, d trankis! Lo que queria decir es que lo principal es que se capte la idea! Te estaba intentando defender un poquete delante de los "fanáticos de la optimización". Jeje (ahora no os piqueis los demás conmigo ;-)  )

[Ex3] el tema que t creo q todo el mundo quiere decir es que, VALE, crea tu mapa de durezas como un bitmap en el photoplof si quieres. Guardaló como un BMP ...

... pero no lo vas a dibujar!!!!. X tanto NO NECESITAS crear una superficie de vram ni nada de ese estilo. Solo tienes que leer el valor de los pixels que forman el dibujo de tus durezas y determinar si existe o no la colisión.

Un Bitmap no és más que una serie de pixeles, por tanto SOLO has de leer el valor del pixel deseado, y la forma más ràpida para este tipo de operaciones es alojar en memoria principal estos datos. NO te hace falta gastar funciones del palo de GetPixel ni obtener acceso a superficies de VRAM.

Una forma efectiva (suponiendo un mapa de durezas de, por ejemplo, 8 bits de profundidad) es cargar el bitmap (usando funciones de de bindous pa C++, no sé exactamente como se haria en VB, ho sent :( ) y obtener un puntero (char*) al inicio de estos datos.
De manera que el primer elemento al que apunta este puntero (puntero[0]) serà el pixel 0,0 de tu bitmap, el segundo (puntero[1]) seria el pixel 1,0, y así sucesivamente.

Para acceder a la posicion (3,8) ?????
la Fommula mágica --> pos = xPos + yPos*ancho = 3 + 8*ancho. (donde ancho es la anchura del bitmap). Y ahora obtenemos puntero[pos] y yatà, el valor correcto de nuestro pixel.
PERO!!!, este valor (si estamos en 8 bits como deciamos) recuerda que es el valor del color de paleta del pixel, no el RGB ni el COLOREF ni nada parecido. Para obtener el color real has de acceder a la paleta de tu bitmap con el valor de puntero[pos] y obtendrás el valor real de tu pixel.

Bueno, supongo que tampoco lo explicado demasiado bien. Intentaré hacer una pequeña libreria con un par de utilidades de este tipo. Lo que no puedo garantizar es que lo pueda hacer en VB (creo que lo he gastado un par de veces solo). Y me miraré las funciones estas de manejo de Bitmaps que hace mil que no las gasto!

Citar
a) Cargar en memoria un bitmap para leer un pixel y descargarlo me parece excesivo, intenta cachearlo.

Por cierto, d que hablais cuando decis lo de "cahear". Me molaria saber si hay trucos para accesos más rápidos cuando gastais un mapa de durezas o cosas parecidas, me muero por aprender!!!!

Wueno, saludos a todos. Adew.
UTI

[EX3]

 
Cita de: "Grugnorr"a) Cargar en memoria un bitmap para leer un pixel y descargarlo me parece excesivo, intenta cachearlo.
Err, creo que no me explique bien xD Me referia que como en cada lectura de pixel la funcion que actualmente tengo implementada hacia una copia en un array del contenido de la superficie, se leia el pixel y despues se destruia el array (el array era local en la funcion) decia de hacer que en la funcion de carga copiar los datos en un array global y alojarlo en memoria hasta que se quiera descargarlo, pero la funcion solo cargaria la superficie en la memoria y despues de copiarse los datos se descargaria, manteniendo el array en memoria, vamos, que todo lo que hace la funcion actual hacerlo solo en el inicio. Resumiendo, en cuestion es a lo que os referis, alojar en memoria simplemente un array con los valores de los pixeles.

El por que tengo esta implementacion en la libreria es por que las funciones de lectura/escritura estaban pensadas en un principio para poder leer/escribir pixeles en mitad de la ejecucion del programa para  modificar texturas y de paso para usarse para el tema de mapas de durezas.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.