Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Enorme disminucion de FPS

Iniciado por bnl, 20 de Octubre de 2002, 06:32:32 PM

« anterior - próximo »

ethernet

Postealo, creo q sera la mejor solucion, si es mucho te recomiendo q pegues solo una parte o lo subas a un sitio web y pongas el link

saludos

bnl

                                Ahi va, espero q sea legible. Solo copio los procedimientos que pueden tener algo q ver (inicializarD3D, cargarTextura, dibujarCasilla, crearVertice, render)

Utilizo el mismo cuadrado (2 triangulos, 4 vertices) para dibujar todas las casillas. Voy cambiando la posicion de los vertices y la parte de la parte de la textura antes de dibujar la proxima casilla) Actualmente como estoy de pruebas siempre se dibuja la misma casilla por toda la pantalla.

Seguro q encontrais muchas cosas q no estan bien o son mejorables. Todas las criticas son bienvenidas  :D

Y muchas gracias de antemano por leeros tantas lineas :)

Public Function inicializarD3D(hWnd As Long) As Boolean
   On Error GoTo tratErr
   
   Dim modo As D3DDISPLAYMODE 'describe nuestro modo de visualizacion
   Dim D3DWindow As D3DPRESENT_PARAMETERS 'como se mostrara
   
   
   
   Set DX = New DirectX8
   Set D3D = DX.Direct3DCreate()
   Set D3DX = New D3DX8
   
   If D3D Is Nothing Then Exit Function
   
   ' capturamos el modo de visualizacion actual
   D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, modo
   
   modo.Format = D3DFMT_R5G6B5 'If this mode doesn't work try the commented one above...
   modo.Width = 800
   modo.Height = 600

   D3DWindow.SwapEffect = D3DSWAPEFFECT_FLIP
   D3DWindow.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE 'D3DPRESENT_INTERVAL_ONE
   D3DWindow.BackBufferCount = 1    '//1 backbuffer only
   D3DWindow.BackBufferFormat = modo.Format 'What we specified earlier
   D3DWindow.BackBufferWidth = 800
   D3DWindow.BackBufferHeight = 600
   D3DWindow.hDeviceWindow = hWnd
     
   Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)
   If D3DDevice Is Nothing Then Exit Function
   
   '//Set the vertex shader to use our vertex format
   D3DDevice.SetVertexShader FVF

   '//Transformed and lit vertices dont need lighting
   '   so we disable it...
   D3DDevice.SetRenderState D3DRS_LIGHTING, False

   D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
   D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
   D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True

   
   'ColorKeyVal = &HFFFF00FF '//Magenta 256 colores
   ColorKeyVal = &HFFFF00FA '//Magenta 16 bits
     
   '    Set textura = D3DX.CreateTextureFromFile(D3DDevice, App.Path & "protaRPG.bmp")
   
   fnt.Name = "Verdana"
   fnt.Size = 10
   Set MainFontDesc = fnt
   Set MainFont = D3DX.CreateFont(D3DDevice, MainFontDesc.hFont)

   
   inicializarD3D = True
   Exit Function
tratErr:
   cerrarDD
   inicializarD3D = False
End Function



Public Sub cargarTextura(textura As Direct3DTexture8, fichero As String)
   Set textura = D3DX.CreateTextureFromFileEx(D3DDevice, App.Path & "" & fichero, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_POINT, D3DX_FILTER_POINT, ColorKeyVal, ByVal 0, ByVal 0)
End Sub



Public Sub dibujarCasilla(x As Integer, y As Integer, casilla As Integer, textura As Integer)
   Dim xx As Single
   Dim yy As Single
   Dim textX1 As Single 'coordenadas de la textura q se van a dibujar
   Dim textY1 As Single
   Dim textX2 As Single
   Dim textY2 As Single
   
   xx = CSng(x)
   yy = CSng(y)
   
   
   textX1 = 0.375 '(1 / tileSet(textura).ancho) * desplazamientoX
   textY1 = 0 '(1 / tileSet(textura).alto) * desplazamientoY
   textX2 = 0.5 '(1 / tileSet(textura).ancho) * (desplazamientoX + 1)
   textY2 = 0.0625 '(1 / tileSet(textura).alto) * (desplazamientoY + 1)

  ' textX1 = 0.125 '(1 / tileSet(textura).ancho) * desplazamientoX
  ' textY1 = 0.03125 '(1 / tileSet(textura).alto) * desplazamientoY
  ' textX2 = 0.25 '(1 / tileSet(textura).ancho) * (desplazamientoX + 1)
  ' textY2 = 0.0625 '(1 / tileSet(textura).alto) * (desplazamientoY + 1)

   verticesX(0) = crearVertice(xx, yy, 0, 1, RGB(255, 255, 255), 0, textX1, textY1)
   verticesX(1) = crearVertice(xx + TAM_CASILLA, yy, 0, 1, RGB(255, 255, 255), 0, textX2, textY1)
   verticesX(2) = crearVertice(xx, yy + TAM_CASILLA, 0, 1, RGB(255, 255, 255), 0, textX1, textY2)
   verticesX(3) = crearVertice(xx + TAM_CASILLA, yy + TAM_CASILLA, 0, 1, RGB(255, 255, 255), 0, textX2, textY2)
'    D3DDevice.SetTexture 0, tileSet(textura).textura
   D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, verticesX(0), Len(verticesX(0))

End Sub




Public Function crearVertice(x As Single, y As Single, Z As Single, rhw As Single, color As Long, specular As Long, tu As Single, tv As Single) As D3DTLVERTEX
   crearVertice.sx = x
   crearVertice.sy = y
   crearVertice.sz = Z
   crearVertice.rhw = rhw
   crearVertice.color = color
   crearVertice.specular = specular
   crearVertice.tu = tu
   crearVertice.tv = tv
End Function



Public Sub Render()
   Dim x As Integer
   Dim y As Integer
   
   On Error GoTo tratError

   D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, RGB(255, 150, 150), 1#, 0 '//Clear the screen black

   D3DDevice.BeginScene
   
   
   D3DDevice.SetTexture 0, tileSet(1).textura
   y = 0
   While y < RESOLUCIONY
       x = 0
       While x < RESOLUCIONX
           Call dibujarCasilla2(x, y, 3, 1)
           x = x + TAM_CASILLA
       Wend
       y = y + TAM_CASILLA
   Wend  
   
   D3DDevice.EndScene

   D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
   Exit Sub
tratError:
   cerrarDD
   Unload frmPrincipal
   End
End Sub                                
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

ethernet

No tengo ni la mas remota idea de q puede ser, podria ser algo del calculo del filtrado de la textura o quizas sea cosa del calculo en punto flotante (a saber como trabaja vb con esas cosas).

saludos

bnl

                                ¿q es el calculo del filtrado de la textura? ¿es lo mismo q las coordenadas de la textura?

lo mas extraño es que las coordenadas de la textura no las calculo en tiempo de ejecucion si no que las escribo directamente en el cudigo, y con unas coordenadas va a 43 (con las q no tengo comentadas) y con otras va a 83 (con las q tengo comentadas) .                                
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

ethernet

cuando le das una textura de 32x32 pixeles y tiene q dibujarla de 400x400 en pantalla eso requiere calculo para agrandarla, a eso me referia, pero en realdiad no se muy bien si es eso, solo lo he dicho por si suena la flauta xDD.

saludos

bnl

                                No agrando las imagenes. Tengo un fichero .bmp con todas las casillas y cada una ocupa 32x32 pixels. Luego dibujo una de ellas en pantalla para lo cual tomo solo una parte de la textura en la que cargue el bmp. Esta casilla q dibujo la dibujo muchas veces hasta dibujar la pantalla entera con ella, pero cada vez la dibujo en un cuadrado de 32x32 pixels                                
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

Lord Trancos

                                Es muy raro lo que te pasa :(
Lo siguiente son pruebas o cambios que yo haria... algunos de ellos tienen mas que ver con el Voodoo y los Ovnis que con la informatica :loco:

- Pq usas Alpha Blending para dibujar un mapa ?

- Esto creo q esta mal:

ColorKeyVal = &HFFFF00FA '//Magenta 16 bits

para D3DFMT_R5G6B5 (16 bit) seria:

 &HF81F

- Prueba a NO usar las fuentes de DirectX (al menos para probar hasta que te funcione bien)

- Al cargar la textura no le digas D3DFMT_UNKNOWN, prueba a decirle D3DFMT_R5G6B5.

- El segundo textY1 = 0.03125 prueba a ponerle menos decimales; textY1 = 0.0312 o textY1 = 0.031

- El valor specular de tu formato de vertice creo q no lo usas para nada.

- Prueba a borrar el z-buffer (por probar... :))

- Prueba a usar el mismo grafico en ambos casos (es decir dibuja el mismo dibujo), a ver que pasa...                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

bnl

                                Voy a probar lo q me dices a ver si funciona

El alpha Blending lo estaba usando para dibujar al personaje q se mueve por el mapa y q tiene partes que no han de verse.

El tipo de vertice que utilizo es el D3DTLVERTEX, no es un tipo propio sino uno que ya viene declarado. No sabia muy bien que tipo de vertice utilizar. ¿cual me recomendais q use? ¿para q sirve el valor specular?

¿como borro el z-buffer? ¿para q vale?                                
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

Mars Attacks

                                Si no me equivoco, el specular se refiere al color que mostrará como "reflejo" de la luz incidente en él. Es decir, una manzana, por ejemplo, tiene un color especular rojo porque al incidir la luz en él, se producen degradados de rojo en el entorno del rayo de luz. Normalmente el specular suele ser el mismo color que el difuso (aunque con varianzas en la luminosidad) y si lo cambias a otro color será para conseguir efectos visuales un tanto extraños.
Que alguien me corrija si me equivoco o si en este contexto no tiene nada que ver.                                

Lord Trancos

                                Lo del z-buffer olvidalo. Me acabo de dar cuenta de que no lo creas, y no creo q tenga nada q ver, solo lo decia por probar :)

El z-buffer sirve (asin a groso modo) para dibujar bien los objetos 3D. Es como un backbuffer, pero en lugar de pintar colores se pintan profundidades (un valor de 0 a 1 por cada pixel). Si quieres me enrollo mas y te lo explico con pelos y señales, pero esto es solo necesario para 3D ;)

En cuanto al tipo de vertice, pues lo mismo que usas pero sin el specular. Como estas trabajando en 2D y con vertices ya transformados e iluminados, lo del specular sobra (no hay luz, y aunque la hubiera no hay angulo con respecto a la luz)

Lo del alpha blending.... no tiene mucho sentido que lo estes usando para dibujar todo el mapa; deberias de hacer esto:

- Desactivar alpha blending
- Dibujar mapa
- Activar alpha blending
- Dibujar personajes

o bien:

- Dibujar mapa
- Activar alpha blending
- Dibujar personajes
- Desactivar alpha blending

la cuestion es que cuando dibujes el mapa no tengas el alpha blending. Ah, y para la textura del monigote tendras que usar un formato que tenga canal alpha :)  como por ejemplo A4R4G4B4. (16 bit)

PD: yo en una manzana creo q usaria el specular blanco :P                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Mars Attacks

                               
Citar
PD: yo en una manzana creo q usaria el specular blanco :P

Pero un blanco rosáceo, ¿no?                                

Lord Trancos

                                Valeeee, un blanco con ligeros toques rosaceooos xD                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

fiero

                                Lo que habeis comentado del filtrado puede tener sentido, ya que parece un poco sospechoso que al pintar un trozo de textura del doble de tamaño, los FPS bajen a la mitad. Porque según esas coordenadas se dibuja el doble de textura ¿no?, lo que pasa que encogida en los 32x32 pixels...
En el caso de 85FPS la textura es de 0.125 x 0.03125, y en el caso de 43FPS la textura es de 0.125 x 0.0625
Podria ser que al dibujar la textura pequeña no se active el MINIFICATION_FILTER (no sé como son los nombres en dx8.1) y por eso el render sea más rápido.

saludos                                
www.videopanoramas.com Videopanoramas 3D player

bnl

                                Modificare el tipo de vertice, es tonteria declarar algo q no utilizo.

Tambien descactivare/activare el alpha blending a ver si aumento los fps.

Antes conseguia pintar al presonaje con sus partes transparentes usando un bmp ¿es necesario utilizar otro formato para las imagenes?

Sobre lo q me comentabas de poner menos decimales a las coordenadas de la textura lo curioso es q me funciona bien con el que tiene mas decimales (el 2º conjunto de coordenadas) y mal con el otro.                                
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

Lord Trancos

                               
Citar
Antes conseguia pintar al presonaje con sus partes transparentes usando un bmp ¿es necesario utilizar otro formato para las imagenes?

Nop, siempre y cuando le digas al cargar la textura que quieres un formato con canal Alpha. Otra cosa seria que quisieras un personaje con zonas de transparencia variable, en ese caso tendrias que usar un formato de imagen con canal alpha como por ej. TGA o PNG.

Citar
Sobre lo q me comentabas de poner menos decimales a las coordenadas de la textura lo curioso es q me funciona bien con el que tiene mas decimales (el 2º conjunto de coordenadas) y mal con el otro.

Has leido lo que dice fiero?,... es mucho mas sensato que todo lo que yo he dicho :)                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.






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.