Paso a explicar:
Cuando nosotros limitamos el FPS en el AO se realiza con GetTickCount.
Para los que no saben, basicamente GetTickCount y QueryPerfomance son 2 funciones para medir los intervalos.
GetTickCount tiene el inconveniente de que mide intervalos minimos de 15-16ms (En Windows XP, esto varia dependiendo el Sistema Operativo que usen)
Y QueryPerfomance, es mas precisa, mide intervalos de hasta 1ms y menos!
Lo que hace, es realizar todos los FPS posibles, y cuando detecta que es superior a 101fps entonces pausea/tilda hasta cumplir el segundo.
Esto genera desastres en la reproduccion del motor grafico, haciendo que los calculos no sean tan exactos ya que en computadoras rapidas, procesa la mitad de un segundo los graficos y la otra mitad esta tildado.
La solución a esto es simple.
Limitar los FPS por frame mediante la funcion QueryPerfomance.
¿Como seria esto?
Pensemos en que queremos limitar a 100fps.
100fps = 100 frame per second = 100 cuadros por segundo = 100 bucles por segundo.
Entonces... si tenemos 100fps, ¿Cuanto tiene que ser el intervalo de cada bucle?
1segundo / 100fps = 1000ms / 100fps = 10ms por fps
Entonces, si limitamos 10ms cada bucle logramos tener aproximadamente 100fps.
Pero, tambien se realizan funciones en este bucle, que pueden alentar el bucle, en el caso del Argentum tenemos todo el procesamiento del motor grafico, desde los calculos, hasta la impresion en pantalla y mas!.
Normalmente en una computadora normal, este procesamiento puede tardar 5-7ms por bucle.
Pero entonces! Si tenemos 5-7ms de procesamiento y 10ms para limitar los FPS nos quedaria unos 15-17ms de pauseo por bucle. Entonces nuestros FPS seran de 58-59fps (lo saque haciendo este calculo FPS=1000/16).
Entonces lo que se puede hacer, es calcular el tiempo que tarda en procesar el bucle, y despues calcular el tiempo en que se pausea.
Por ejemplo, si el tiempo de procesamiento del bucle es de 6ms por loop entonces al pauseo de FPS le hacemos 10ms-6ms=4ms. Entonces pauseamos por 4ms.
Por lo tanto hay un pauseo de 6ms por el procesamiento + 4ms de pauseo por el limitador de FPS y llegamos a tener 10ms. Osea 100fps aproximadamente!
Esto sirve mucho en los calculos que se deben realizar a la hora de ejecutar el motor grafico.
Tambien evita que los usuarios se aceleren y cosas por el estilo.
¡Bueno! Basta de explicación y les dejo el codigo!
Buscamos:
Aclaración: El "\ 10" varia en diferentes codigos.
- While (DirectX.TickCount - fpsLastCheck) \ 10 < FramesPerSecCounter
- Sleep 5
- Wend
Y reemplazamos por:
Aclaracion: Cambiar el numero 100, para poder cambiar el limite de FPS. Si lo escribes en 60, se limitara a aproximadamente 60fps.
- Dim TimeSleep As Long ' Declaramos el tiempo para pausear la PC
- TimeSleep = (1000 / 100 - 1) - SetElapsedTime(False) ' Cambiar numero 100 para cambiar los FPS
- If TimeSleep > 0 Then 'Si el Tiempo es negativo entonces no limitamos
- Sleep TimeSleep
- End If
- Call SetElapsedTime(True) 'Seteamos el tiempo
Buscar:
- Do While prgRun
Y arriba poner
- Call SetElapsedTime(True) 'Iniciamos el tiempo
Buscar
- Private Function GetElapsedTime() As Single
Y arriba poner
- Public Function SetElapsedTime(ByVal Start As Boolean) As Single
- '**************************************************************
- 'Author: Aaron Perkins
- 'Last Modify Date: 23/05/2011 By MaTeO
- 'Gets the time that past since the last call
- '[MaTeO] Agrego cambios a la funcion
- '**************************************************************
- Dim Start_Time As Currency
- Static End_Time As Currency
- Static Timer_Freq As Currency
- 'Get the timer frequency
- If Timer_Freq = 0 Then
- QueryPerformanceFrequency Timer_Freq
- End If
- 'Get current time
- Call QueryPerformanceCounter(Start_Time)
- If Not Start Then
- 'Calculate elapsed time
- SetElapsedTime = (Start_Time - End_Time) / Timer_Freq * 1000
- 'Get next end time
- Else
- Call QueryPerformanceCounter(End_Time)
- End If
- End Function
¡Y listo!
Ahora si limitan los FPS les queda mas comodo.
Ensima es mas facil de calcularlos, directamente ponen el numero que desean limitar y se limita
Igual, no lo pausea exacto pero sin embargo sirve igual.
Si lo limitas a 100fps tira entre 100 a 110fps.





132![Aprendiz [7] Aprendiz [7]](./images/ranks/Rango12.gif)

![Dragon Ancestral [2] Dragon Ancestral [2]](./images/ranks/Rango31.gif)

![Legendario Inmortal [2] Legendario Inmortal [2]](./images/ranks/Rango37.gif)

![Dragon Ancestral [4] Dragon Ancestral [4]](./images/ranks/Rango33.gif)

![Aprendiz [1] Aprendiz [1]](./images/ranks/Rango6.gif)


![Oraculo [2] Oraculo [2]](./images/ranks/Rango26.gif)



![Oraculo [1] Oraculo [1]](./images/ranks/Rango25.gif)
