2011-02-23 11 views
5

Soy nuevo en C Sharp, y estoy escribiendo un juego con XNA Framework. Creé un proyecto que es una versión muy modificada del kit de inicio XNA "Plataforma".XNA Platformer (2D) - Frameraterate/FPS fluctuations

Estoy viendo (aparentemente) fluctuaciones aleatorias con la velocidad de fotogramas. Algunas veces funcionará a 60 FPS todo el tiempo, a veces comenzará a 60 FPS luego caerá a 49-52, y otras veces bajará a 49-52 inmediatamente. Usar Fraps para mostrar la velocidad de fotogramas (no grabar video en el disco).

La naturaleza única de este juego requiere que funcione a 60 FPS consistentemente.

Parece que alguna condición de carrera o factor aleatorio está causando una diferencia entre ejecuciones individuales del ejecutable. Numerosas reconstrucciones no hacen la diferencia.

Esta fluctuación se produce tanto en mi escritorio y portátiles con exactamente la misma frecuencia, así que no es un problema w/hardware, antivirus, etc.

He buscado sobre cómo bloquear una tasa de fotogramas en XNA, y mi código parece estar haciendo mucho de lo que necesita hacer, incluido un intento de fijar a 60 FPS (usando IsFixedTimeStep, SynchronizeWithVerticalRetrace).

El juego es absolutamente capaz de 60 FPS de principio a fin, lo veo todo el tiempo. Cuando se está ejecutando a 60 FPS no grava CPU, RAM o cualquier otro recurso por lo que puedo decir.

¿Alguien más ha experimentado esto?

Gracias, - S

+1

¿Puede reunir más datos utilizando la configuración Frametimes de FRAPS? Además: si está utilizando V-sync, y suelta un cuadro, su velocidad de fotogramas se reducirá a la mitad de manera instantánea. Si lo hace durante una fracción de segundo, la velocidad de fotogramas reportada para ese segundo será de entre 30 y 60 FPS. –

+0

"La naturaleza única de este juego requiere que funcione a 60 FPS constantemente". De Verdad? Tengo curiosidad por esta razón. – Justin

Respuesta

2

La inconsistencia que describes significa que el problema está causado por

  • un factor ambiental como otro proceso; o
  • Una ruta de código en su juego que no se toma en cada carrera

La causa más probable es otro proceso que se ejecuta en ambos equipos.

Cierre todos los procesos no esenciales como los reproductores de medios. Windows Media Player e iTunes pueden reducir tu velocidad de fotogramas mientras se están reproduciendo. Fraps debería estar bien siempre y cuando no esté grabando, pero implementaría tu propia pantalla FPS incorporada solo para estar seguro.

Utilice el monitor de rendimiento de Windows para comprobar si hay un proceso que consuma la CPU o la memoria. Especialmente, busque instancias de su juego que no se hayan apagado correctamente y sigan ejecutándose en segundo plano.

Otras cosas que podría tratar de reducir una causa ambiental incluyen:

  • determinar si el juego corre a 60 fps después de un reinicio limpio
  • determinar si el juego siempre corre a 60 fps en la primera carrera
  • lanzar su juego de Explorador en vez de visual Studio
  • Determinar si se ejecuta en la versión o El modo de depuración tiene ningún impacto
  • ejecutar su juego en el ordenador de un amigo

Si la causa es de una ruta de código dentro de su juego que no se ejecuta en cada carrera que podía:

  • juega repetidamente y trata de determinar qué es lo que haces en el juego que desencadena la ralentización.
  • implementar una grabación de entrada y sistema de reproducción de manera que el mismo recorrido a través del juego es exactamente repetible
  • perfil de su recolección de basura y el rendimiento en general a buscar cualquier problema que se destacan
1

Me gustaría comprobar si estos las ralentizaciones periódicas coinciden con los eventos de GC, específicamente de las generaciones 1 o 2. De lo que describes, parece bastante plausible. En ese caso, fíjese si puede reducir la deserción de objetos en su código mediante reutilización, asignaciones de pila, etc.

0

Puede eludir este problema por completo. Siempre que el juego se ejecute a un mínimo de alrededor de 35 fps, las caídas de framerate no serán perceptibles para el ojo humano. Para eludir este problema, asegúrese de que todo su código de actualización tenga en cuenta el objeto GameTime que se aprobó. Por lo general, debe multiplicar los cálculos para obtener cálculos más pequeños cuando la velocidad de fotogramas es alta, y resultados mucho más pronunciados cuando el juego se está actualizando lentamente. En general, hará que las imágenes de tu juego parezcan más fluidas.

¿Has probado a permitir que el juego se ejecute a su velocidad máxima de fotogramas? Si es así, ¿todavía recibes enormes caídas de framerate? Si no sabe cómo hacerlo, puedo publicar el código cuando llegue a casa si lo necesita.

0

Intente deshabilitar la sincronización V SynchronizeWithVerticalRetrace=false y vea si ayuda. La sincronización V tiene el desagradable efecto secundario de reducir drásticamente tu velocidad de cuadros si un evento ocurre en el momento de la sincronización o si un cuadro es demasiado largo para renderizar, ya que tendrá que esperar la siguiente sincronización. Sin embargo, es probable que experimente desgarro. Sin embargo, si la estabilidad de framerate es más importante que rasgar la pantalla libre, eso podría ser un buen compromiso.

0

¿Estás dibujando algo fuera del área visible? Tuve el mismo problema (la velocidad de fotogramas bajaría repentinamente). Después de probar todo, resultó que a veces dibujaba cosas fuera del área visible o a medio camino entre las áreas visibles e invisibles de la pantalla. Dado que estás usando el kit de inicio de plataformas, este es probablemente tu problema también.

0

Nunca podrás forzar el juego para que funcione a 60 fps.

Si el juego realmente necesita ejecutarse a esta velocidad, es probable que esté actualizando el estado del juego por cuadro.Si es así, debe cambiar eso en una actualización que tenga en cuenta el tiempo transcurrido.

1

Tuve exactamente el mismo problema. Creé un juego basado en el kit de inicio de plataformas, y uso Windows 7. El programa funciona bien la mayor parte del tiempo a 60 FPS, pero luego a veces baja a 52 FPS durante unos 30 segundos, y luego va a ir de vuelta a 60 FPS.

Descubrí que al desactivar las funciones de Windows 7 Aero, mi juego ahora se mantiene en 60 FPS constantemente. Tuve que cambiar al tema básico de Windows 7 sin Aero, y ahora el juego funciona bien y sin problemas.