saulotmalo escribió:creo que la solución que propones no sirve tampoco...
"creo" la idea del doble buffer es usarlo para que cuando esté lista la imagen a mostrar se cambie el buffer ,ok? pero si haces un blit dependerá del tiempo que te cueste el blit al ser de toda la pantalla le costará tiempo y es posible que lo pille a mitad con lo que igual se verían algunos fallos gráficos menores ....
Si, el propósito del doble buffer es justamente ese, pero en teoría un blitting es más rápido, aunque sea por software, y además modificas la pantalla en un único momento en vez de en varios durante el bucle del juego, por lo que eso se minimizaría.
Lo que estoy pensando es que puede que tengas razón, y no se si lo que estoy haciendo es redundante, porque en SDL si no llamas a UpdateRect(screen,0,0,0,0) para marcar la pantalla como "sucia" no cambia el dibujo en pantalla.
Vamos que es posible que SDL tenga ya por debajo un backbuffer "por soft" y lo controle. Eso tendría sentido, ya que SDL_Flip(), si no tienes una superficie con doble buffer por hardware lo que hace es llamar a UpdateRect() en realidad.
A ver si me bajo el código de SDL y le echo un vistazo.
EDITO: olvida esto que he dicho arriba, no tiene nada que ver con utilizar un backbuffer para hacer un double buffer por software, al menos lo que he podido entender del código fuente.
Lo que pasa es que si una superficie es software, ésta se aloja en la RAM, por tanto en algún momento se tiene que copiar a la VRAM para que pueda representarse por pantalla.
Ahí estaba mi fallo, y efectivamente lo que te comento es redundante, y sólo sirve para una cosa: gastar más memoria.
Efectivamente, no puedes tener double buffer si no es por hardware. Y el problema es que depende mucho ya no del hardware del sistema, sino del propio SO y drivers. Por ejemplo en windows no puedes obtener superficies hardware en modo ventana, tiene que ser a pantalla completa.
Y una vez tuve un problema que por alguna razón no me cargaba el driver de DirectX (para usar DDraw) y tampoco me pillaba superficies hardware, y la tontería es que había copiado las dll a windows/system, pero sin querer había vinculado el programa con una versión más nueva de la librería