Ver la versión completa : Programacion: SDL vsync
Gammenon
04/06/2010, 20:14
A las buenas
Estoy con un programa que corre tanto en windows como en Wiz. En Wiz funciona correctamente, con el vsync, pero en windows no consigo hacer que espere al retrazo vertical. Se supone que usando HWSURFACE y double buffering, llamando a SDL_Flip() hace que se espere al vsync, pero tanto en windows 7 como en windows XP se nota un tearing acojonante.
Aqui mi linea del setViewMode:
SDL_SetVideoMode(640, 480, SCREEN_BPP, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
Alguien mas tiene este problema? No uso openGL, solo el bliteado nativo de SDL.
Muchas gracias de antemano :)
SplinterGU
04/06/2010, 20:47
el vsync en la SDL no funciona en windows.
igual tiene que ver como haces el update de pantalla, imagino que usas sdl_flip, porque eso es lo que tenes que usar.
Gammenon
04/06/2010, 20:53
Efectivamente uso SDL_Flip(). Si el vsync no funciona en windows que alternativa hay? o_O
^MiSaTo^
04/06/2010, 20:57
Yo he programado con SDL para la GP2X en windows y no he tenido ningún problema con el vsync :confused:
Ahora bien, siempre usaba como flag SDL_SWSURFACE y siempre en modo ventana (del tamaño de la GP2X, claro).
Gammenon
04/06/2010, 21:42
Una ventana de 320x240 quizas sea demasiada pequeña para notar el tearing. Ademas en modo ventana se supone que no hay vsync, aun usando SDL_Flip().
^MiSaTo^
04/06/2010, 21:55
Tb probaba con 640x480 creo recordar (por verlo más grandote) y no he visto nunca nada raro. Tal cual lo veía en la GP2X, lo veía en windor ;)
Gammenon
04/06/2010, 22:03
Como lo probabas a 640x480? Yo necesito hacerle un strecht de 320x240 a 640x480 con una cutrerutina que tengo por aqui... Pero vamos, eso no tiene nada que ver con este asqueroso tearing >:(
^MiSaTo^
04/06/2010, 22:12
Como lo probabas a 640x480? Yo necesito hacerle un strecht de 320x240 a 640x480 con una cutrerutina que tengo por aqui... Pero vamos, eso no tiene nada que ver con este asqueroso tearing >:(
Tenia un ifdef _PC_ o algo así e inicializaba el modo de video a 640x480 con:
SDL_SetVideoMode(640,480, bpp, SDL_SWSURFACE);
y luego si era para GP2X, lo mismo pero con 320x240 ;)
Si quieres luego te busco el código que andará por ahí. Es de un tetris que estaba haciendo en C++, cuando empecé a aprender C++ hace años xD
Ahora ya hace mucho tiempo que no tengo windows ni en el curro ;) (antes lo probaba en el curro porque me aburría xD)
Gammenon
04/06/2010, 22:16
Lo del ifdef tambien lo tengo yo. Supongo que crearias las piezas y tal en funcion de la resolucion de la pantalla, sino deberias tener un paso intermedio donde hacias un strecht de 320x240 a 640x480. Si el tetris no tenia scroll o algo parecido por alguna parte lo del tearing no se notaria tanto :(
^MiSaTo^
04/06/2010, 22:18
Sí, las piezas eran cuadrados pintados con SDL_FillRect así que dependía de la resolución. (tenía variables para el tamaño del SDL_Rect dependiendo de la resolución de pantalla).
Y no, no había scroll, quizá por eso no lo notara.
Pero vamos no he vuelto a tocar nada en windows sorry :(
Gammenon
04/06/2010, 23:15
Leyendo por ahi parece ser que aparte de indicar que use hardware surface, que tire de doble buffer y que lo haga fullscreen, SDL debe ser capaz de pillar un hardware surface. Es decir, cuando se inicializa SDL debe crear un buffer en la memoria de la tarjeta, pero si falla tira de un surface por software, pasando asi del vsync al hacer SDL_Flip(). A mi me dice que el surface que consigue no es de hardware. Es un problema tipico de windows o es justo de mi hardware?
Bueno bueno, parece que si quiero vsync en windows necesito coger el codigo fuente de las SDL y compilarlo de forma que use DirectX y no GDI, que este es el que se usa por defecto y no tiene surfaces hardware, por lo tanto no tiene vsync. Por si os interesa el tema y tal XD
^MiSaTo^
04/06/2010, 23:52
Leyendo por ahi parece ser que aparte de indicar que use hardware surface, que tire de doble buffer y que lo haga fullscreen, SDL debe ser capaz de pillar un hardware surface. Es decir, cuando se inicializa SDL debe crear un buffer en la memoria de la tarjeta, pero si falla tira de un surface por software, pasando asi del vsync al hacer SDL_Flip(). A mi me dice que el surface que consigue no es de hardware. Es un problema tipico de windows o es justo de mi hardware?
Bueno bueno, parece que si quiero vsync en windows necesito coger el codigo fuente de las SDL y compilarlo de forma que use DirectX y no GDI, que este es el que se usa por defecto y no tiene surfaces hardware, por lo tanto no tiene vsync. Por si os interesa el tema y tal XD
Pues gracias por la respuesta, nunca está de más saber algo nuevo ;)
Fijo que a alguien le es util ^^
Gammenon
05/06/2010, 00:10
Bueno bueno, parece ser que con esta linea se activa el backend de directX:
_wputenv(L"SDL_VIDEODRIVER=directx");
En mi configuracion no estaba disponible el putenv estandar y he tenido que tirar de este, pero como es una cosa exclusiva de windows tampoco pasa nada. Eso si, como hago movidas de pixeles con surfaces hardware me va lento, pero el vsync creo que lo tengo :)
Confirmado: tengo el vsnyc en windows :D
SplinterGU
05/06/2010, 09:11
yo recuerdo que cuando revise el codigo de la sdl porque no me iba el vsync vi que no funcionaba por eso que dices de la directx, pero tambien si mal no recuerdo las sdl no venian compiladas con directx, ya que estaban en un #if, pero la verdad que no recuerdo bien esto, puede que me equivoque, lo que si se era que no funcionaban, y por eso me tuve que meter un codigo propio en bennu para manejar el vsync directo con directx.
vos decis entonces que seteando el driver directx funciona? y otra, va lento o va a 60fps?
Gammenon
05/06/2010, 16:20
Efectivamente, con el putenv que he puesto se activa el backend de directX. De las dos formas va bien de velocidad, de hecho en mi codigo uso solo un HWSURFACE, que es el frame buffer, el resto son SWSURFACE. Simplemente queria quitar el efecto de tearing.
SplinterGU
05/06/2010, 17:18
lo probare, gracias...
has hecho pruebas de rendimiento comparando un driver con otro? que version de sdl estas usando?
Gammenon
05/06/2010, 17:24
No he hecho pruebas, ya que mas o menos son lo mismo excepto el surface del framebuffer. El resto siempre son software. Aun asi para mover algo a 320x240 no hay ningun problema en pillar 1000 y pico FPS. Al hacer el streetch para subirlo a 640x480 justo antes hacer el flip me consume mucho, pero eso es porque no esta nada optimizada esa parte.
Respecto a las SDL uso las que vienen en el SDK oficial de la Wiz, que segun SDL_version.h es la 1.2.13
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.