Por qué XNA borra las imágenes que se mueve menos de 1px entre dos dibujos Es bastante molesto, porque todo se ve muy borroso. Hay una manera de desactivarlo? He intentado establecer el SamplerState de los spritebatchs SamplerState a PointWrap en su función Begin, pero luego se envuelve las imágenes en píxeles, por lo que se mueven agitado. Cualquier sugerencias Gracias Mis SpriteBatchs función de Inicio: Esta es la forma en la clase de imagen se ve como (sin funciones adicionales), y ésta es su función sorteo que está siendo called. Rendertarget cambios en XNA Game Studio 2.0 Las cosas son en realidad mucho más consistente Ahora, vamos honesta me explain8230 Cómo rendertargets utiliza para trabajar (1.0) Cada rendertarget vive en una pieza separada de la memoria de vídeo Después de seleccionar la rendertarget, se puede dibujar en que la memoria de vídeo Cuando haya terminado el dibujo, se llama a GetTexture para reutilizar la misma área de memoria de vídeo Como una textura Se puede dibujar en el mismo rendertarget tantas veces como quiera, y su contenido siempre permanecerá válido Todos los rendertargets compartir una sola pieza especial de la memoria EDRAM Esto significa que sólo uno de ellos puede existir físicamente a la vez Cuando termine el dibujo a un rendertarget, las copias método GraphicsDevice. ResolveRenderTarget de EDRAM a un área separada de la memoria de textura a continuación, puede utilizar esta textura en la forma que desee, pero EDRAM está siendo reutilizado por alguna otra rendertarget este trabajo won8217t como se puede esperar: Dibuje a backbuffer (EDRAM contiene lo que acaba de dibujar) Cambiar a rendertarget Draw para rendertarget (EDRAM contiene lo que acaba de dibujar) Resolver rendertarget (RenderTarget. GetTexture () contiene una copia de lo que ha dibujado) cambia de nuevo a backbuffer (problema que el acto de seleccionar una diferente rendertarget ha sobrescrito lo que previamente ha dibujado a la backbuffer, por lo que el EDRAM ya no contiene la imagen backbuffer que) las reglas en resumen: Cada vez que cambie rendertarget, el contenido de EDRAM se sobrescriben, por lo que son golpeadas todos rendertargets anteriores (incluyendo el backbuffer) datos rendertarget que se resolvió en la textura asociada sigue siendo válido, sin embargo esto está bien: Dibujar para rendertarget un empate para rendertarget B Draw texturas de rendertargets a y B en rendertarget C Pero esto no es: Dibujar para rendertarget un empate para rendertarget interruptor B de nuevo A A y seguir dibujando en la parte superior de la misma Problema con el comportamiento 1.0: Era demasiado fácil escribir un programa que funcionó bien en una plataforma, pero luego se procesó incorrectamente cuando se ejecuta en la otra Cómo rendertargets trabajo ahora (2.0) Obtiene lo que solía ser el comportamiento de Xbox En Xbox, funciona exactamente igual que antes En Windows, automáticamente borrar sus rendertargets en el momento adecuado para emular el comportamiento de Xbox Esto es rápido en ambas plataformas (Clear es muy barato) don8217t de esa manera predeterminada: puede especificar un parámetro constructor RenderTargetUsage RenderTarget2D diferentes para cambiarlo por el backbuffer, utilice el evento GraphicsDeviceManager. PreparingDeviceSettings para alterar GraphicsDeviceInformation. PresentationParameters. RenderTargetUsage especificar RenderTargetUsage. PreserveContents de conseguir lo que solía ser el comportamiento de Windows funciona exactamente de la igual que antes en Windows en Xbox, copiamos los datos automáticamente de vuelta de la textura resolverse en EDRAM para restaurar su contenido cuando se cambia rendertarget Esto no es Usar barato que si es necesario, pero ser conscientes de la pérdida de rendimiento Especificar RenderTargetUsage. PlatformContents para obtener El comportamiento exactamente igual que 1.0, que es diferente en Xbox frente a Windows Si es posible, utilice el modo predeterminado RenderTargetUsage. DiscardContents. Esto da un buen rendimiento y un comportamiento constante en ambas plataformas. Otras cosas buenas: En 2.0, ya no es necesario llamar al método GraphicsDevice. ResolveRenderTarget. De hecho, usted puede hacerlo, porque lo hemos quitado. Ahora lo hacemos automáticamente cuando cambia de la rendertarget. En 2.0, ahora soporta múltiples rendertargets simultáneos (MRT) en Xbox. Por qué es el movimiento espasmódico en un simple juego 2D he estado explorando la posibilidad de usar Unity para construir un juego 2D. Im que mira un número de bibliotecas ayudantes 2D, incluyendo ex2D y Orthello. El problema es: Cuando ejecuto los proyectos de ejemplo que vienen con estas bibliotecas, el movimiento de los sprites es desigual. (El problema existe con ambas bibliotecas, y en realidad sólo con Unity en general - más en que a continuación.) Permítanme explicar lo que quiero decir: Cada 1-2 segundos, theres muy sutil pero notable quotblipquot en el movimiento de los gráficos. El hipo es como un metrónomo el movimiento es perfectamente suave durante 1 segundo, y luego por 1 instante (un solo marco probablemente), el sprite notablemente sacudidas muy sutilmente. Entonces su suavidad otra vez por 1 segundo, entonces un chasquido del marco, etc. ad infinitum. El movimiento espasmódico es probablemente sólo una cuestión de un píxel o dos tiene que ver con cuidado para verlo. Cavé un poco más profundo y creé un juego simple de la unidad del rasguño con una cámara ortográfica y un cubo (y nada más - ningunas bibliotecas 2D, ninguna física, ninguna nada), y bastante seguro, el movimiento sigue siendo desigual. Cada 1-2 segundos, como un mecanismo de relojería, se produce un hipo en el movimiento. Vengo de un fondo de Microsoft XNA, y he experimentado un problema como este con XNA una vez en un tiempo. La solución fue desactivar quotFixedTimeStepquot para el juego, y luego el juego se ejecutó perfectamente. Hay un ajuste similar en Unity encontré la configuración de tiempo, pero theres aparentemente no hay manera de deshabilitar el timestep fijo. Para los curiosos, aquí están los objetos / código para mi proyecto simple que exhibe el comportamiento de la animación espasmódica: Cámara Principal: Ortográfica, tamaño 2, posición (0,0, -1) Y luego este script C en el Cubo: Como la inicial Respuestas correctamente señalado, en mi código de ejemplo original me olvidé completamente de multiplicar por Time. deltaTime. Pero heres lo extraño. Multiplicar por Time. deltaTime realmente hace que el problema sea más pronunciado. Acabo de actualizar mi código para incluir Time. deltaTime, ya que no parece ser lo que está causando mi problema específico. (Independientemente, gracias por sus respuestas Eric5h5 y malraux.) Más información. Acabo de descubrir que la construcción del juego (en lugar de jugar en el editor de la Unidad) y ejecutarlo en calidad quotGraphics: Fastestquot parece eliminar la fluctuación de movimiento. El problema todavía existe si lo ejecuto en calidad quotGoodquot o más alto. Mi tarjeta de video es un Nvidia 8800GT con controladores actualizados. Sé que no es la mejor tarjeta del mundo, pero se ejecuta un montón de otros juegos 3D en calidad decente, sin contratiempos tasa de fotogramas. Y mi proyecto de ejemplo es tan simple como usted puede conseguir: un solo cubo untextured que se mueve hacia adelante y hacia atrás. Cualquier otro pensamiento que me preguntaba si alguna vez llegó a la parte inferior de este problema estoy usando el código de seguimiento para mover el objeto y la cámara. Var Velocidad. Float 28.0 transform. position transform. forward Speed Time. deltaTime No puedo hacerlo más simple, lo he probado en dos PC y en un libro de mac, y aún así me sale escalones cada 2 segundos. He intentado todos los diferentes tipos de actualización. Todo lo que puedo proove es que cuando elimino el tiempo delta todo funciona bien. Estoy en mi witts final con este problema. Ahora voy a mirar el uso de la constante de un RTC y olvidar este tiempo delta tiene algún tipo de broma, sé que si carga una copia antigua de Unity no tengo el problema. Puede alguien arrojar alguna luz sobre este problema. Lo que estaba pensando, es leer el tiempo delta antes de cada movimiento y eliminar las fluctuaciones mayores que ocurren dentro de un porcentaje de decir un segundo de intervalos por mearsurments promedio, voy a dar una oportunidad y ver si se puede suavizar de alguna manera. Gracias All Dean 10 Por lo tanto, este problema me ha estado plagando durante semanas, y finalmente lo solucioné. Tipo de Mi proyecto ha pasado por una serie de cambios, por lo que esta solución no necesariamente se aplican a la pregunta exactamente la forma en que lo pedí. Pero voy a publicar esta información aquí de todos modos, porque nunca he visto esta solución mencionada en ninguna de las preguntas de movimiento de jitter / judder / jerky sobre Unity. Esperemos que esta solución ayudará a alguien más. Primero de todos, Im ahora usando la física y Rigidbodies. Y todavía tenía el problema de movimiento judder / jitter con un Rigidbody y FixedUpdate. Pero si estás usando Física, esta solución puede ayudarte: Todo se reduce a un pequeño ajuste en el Rigidbody: Interpolar. Configurar la propiedad Interpolar a Interpolar hace que mi objeto se mueva completamente sin problemas ahora. Espero que ayude a alguien más. Gracias Interpolate era exactamente lo que necesitaba. Esto me estaba plagando durante semanas, mi jugador se jitter una vez que alcanza una velocidad más alta y pensé que era un problema con mi límite de velocidad. Puse la interpolación y ahora su increíblemente suave. Actualmente tengo este problema. No me había dado cuenta hasta que llegué más adelante en mi proyecto, con más y más unidades en mi pantalla. No parece pesadamente vsync / monitor tasa de actualización relacionados. Tengo poco marco quotblipsquot / jittering sobre cada 2-4 segundos, y es realmente notable. En mi flatscreen los monitores lcd refrescan la tarifa de 60 hz, su bastante jittering malo. Cuando cambio a 100 hz tasa de actualización en mi monitor, se pone mucho más suave, aunque no eliminar el quotblippingquot por completo - todavía está allí. Lo extraño es que si establezco la velocidad de actualización de mi monitor a 120 hz, es casi tan malo como a 60 hz. Estoy completamente perplejo. He intentado todo en este hilo, y ayuda a suavizar un poco, pero de nuevo su nunca eliminado por completo. Incluso con la configuración de mis modelos rigidbodies para interpolar como se sugirió, y el establecimiento de mi velocidad de actualización de monitores a 100 hz, y la configuración de vsync a la configuración de mi proyecto. Cualquier plomo sobre cómo arreglar esto sería genial. Sé que esto es un hilo viejo sin embargo. En este momento es 15/08/2012 lol. Unity versión 3.5.4f1. Estoy empezando a pensar en algo que los programadores de Unity cambiaron en la opción vsync en una de las actualizaciones recientes. Actualización: Acabo de probar la construcción de mi juego con la configuración de quotfastestquot en la configuración de calidad del proyecto. Luego seleccionar quotfastestquot en la pestaña de selección al iniciar mi juego (con él construido). Esto prácticamente funciona. Me di cuenta casi no jittering / blipping - posiblemente algunos muy minúsculo blipping, pero casi imperceptible. Esto es genial, pero la pregunta es por qué no deberíamos tener que ejecutar nuestro juego en el más rápido con el fin de eliminar este terrible vsync blipping o lo que sea. De todos modos, por ahora, al menos hay una manera de minimizarlo casi por completo. Gracias por todos los consejos y consejos hasta ahora. Por lo que puedo decir, su absolutamente vsync / monitor tasa de actualización relacionados. Usted puede leer sobre el problema en mucho mayor detalle en una pregunta actualizada que he publicado aquí: No creo que tenga nada que ver con la complejidad del juego Veo el problema de tartamudeo en el juego más simple absoluta posible. (Puede descargar un proyecto de juego de ejemplo a través del enlace anterior.) El problema es definitivamente más grave con VSync habilitado. Estoy convencido de que no todo el mundo ve el problema. Tal vez sólo algunas tarjetas de video y / o monitores se ven afectados Tengo una Nvidia GeForce 8800, qué hay de usted Sé que esto es una antigua publicación, pero yo estaba teniendo el mismo problema. Cambié mi rigidbodys interpolar la configuración de ninguno a interpolar y parece haberlo arreglado. No he hecho una compilación, pero esto es sólo en el editor hasta ahora. Sé que este es un hilo más antiguo, pero espero que esto ayude a alguien: inicialmente pensé que el problema jerkiness estaba relacionado con Update () corriendo en diferentes hilos por Unity, así que cambié mis objetos a clases simples y actualizarlos manualmente desde mi quotmainquot , Pero esto no lo resolvió. El problema de jerkiness está realmente relacionado con las variaciones en la velocidad de fotogramas. Es por eso que - por lo que he visto - ocurre independientemente del esquema de sincronización o actualización vs FixedUpdate. Digamos que el último marco tomó por ejemplo 50ms, y usas ese deltatime para tu movimiento, pero el fotograma actual actual tarda sólo 25ms en renderizar, te verá como si el objeto saltase. Esto es particularmente más evidente si tiene rutinas de búsqueda de objetos como yo, o si está ejecutando framerates más bajos. Usted puede hacer esto: Ahora su suave como la seda. Lo que probablemente haría para una solución más robusta es mantener un promedio móvil de 1 segundo de la velocidad de fotogramas, y luego restringirlo a eso. Edit: Lo siento por la redundancia, yo no había visto Deanos respuesta correcta. Como Eric señaló, use deltaTime: Tenga en cuenta que estoy llamando velocidad ahora. DeltaTime te da la diferencia en el tiempo desde la última actualización. Multiplique eso por una velocidad y usted está interpolando el valor de posición basado en la velocidad, ya que la velocidad (velocidad) es la distancia en el tiempo. Además, si está usando un RigidBody, asegúrese de usar FixedUpdate en lugar de Actualizar: MonoBehaviour. FixedUpdate Argh, sí, había probado anteriormente, pero se olvidó en este código de ejemplo. Heres lo extraño. Correctamente multiplicar por deltaTime realmente hace que el problema más pronunciado. Estoy empezando a pensar que debe haber algún problema específico con mi tarjeta de video (Nvidia 8800GT) y fijo timesteps. Es realmente extraño. Independientemente, gracias por su respuesta theremin Lo probó en FixedUpdate Buena pregunta, yo hadnt, pero acabo de hacer. Como resultado, FixedUpdate produjo los peores resultados de todos: el movimiento cambia de jitter de una vez por segundo a casi constante. Vale la pena probarlo, gracias por la idea. Como resulta, parece que tener VSync habilitado podría ser el culpable. (Ver mi comentario anterior.)
No comments:
Post a Comment