[PSP] Error al cargar multiples imagenes en SDL

Hola a todos no es un error propiemente dicho es que no se como hacer esto para que tire bien jajajaj mirar estoy intentando hacer una intro imagen por imagen dado que no se como cargar avi en psp con C la intro consta de 175 imagenes que van desde 1K hasta 70k de tamaño el codigo que he usado es este

for(Intro = 1;Intro <= 175;Intro++){
sprintf(Introduccion,"imagenesg/Comp 1 %03d.png",Intro);
PIntro = IMG_Load(Introduccion);
SDL_BlitSurface(PIntro,NULL,PantallaV,NULL);
SDL_Flip(PantallaV);
SDL_FreeSurface(PIntro);
}

Y funciona correctamente pero al tener que leer cada imagen de la ms0 el video se ve muy despacito y si intento cargar antes las imagen en memoria solo me deja cargar unas 40 imagenes y las demas no cargan asi que no se como resolverlo alguien prodria ayudarme
Gracias por adelantado.
Un saludo
Kaltorak.
No puedes cargar un gif con todas las imagenes?
Hola nazareth
el problema es que tampoco se cargar Gif animados :_( a ver si alguien me echa 1 mano con esto.
Si fuese NDS, podria hecharte un pequeño cable (tampoco se mucho), pero siendo PSP... sorry.

Lo unico que se me ocurre, que para pasar las imagenes, tendra una velocidad, aumentala.
Asi de manera exacta no podria responderte, pero podrias crear 2 hilos para lo de la intro, uno que cargue las imagenes y otro que las muestre, tendrias que sincronizarlos bien.

Creas algunas variables globales para saber por donde va la muestra de la intro, y segun vayas mostrando imagenes las vas liberando y en el otro hilo mostrando, el asunto es que cargues unas cuantas imagenes en primera instancia.

Si quieres me mandas un MP para que me agregues al msn o gtalk y echarte una mano mas directa en esto.
iceman755 escribió:Creas algunas variables globales para saber por donde va la muestra de la intro, y segun vayas mostrando imagenes las vas liberando y en el otro hilo mostrando, el asunto es que cargues unas cuantas imagenes en primera instancia.


Donde pone globales, si estas utilizando C++, mejor pon una clase singleton o una clase con métodos y atributos estáticos.
Hola
Muchas gracias por contestar kbks y iceman755 mirar no uso c++ uso c y sdl lo de los hilos parece una idea muy buena pero no tengo ni idea de como se hace me podriais poner un ejemplo con codigo que pueda entender.
Un saludo
Kaltorak.
La verdad es que nunca he programado nada multihilo en C, pero seguro que internet está repleto de tutoriales. De todos modos yo evitaría esto e intentaría dividir en el video en escenas de menos imágenes (un número que pueda cargarse completamente en la memoria a la vez) y crearía una pequeña pantalla de carga entre escenas mientras carga las imágenes de la siguiente escena.
kbks escribió:La verdad es que nunca he programado nada multihilo en C, pero seguro que internet está repleto de tutoriales. De todos modos yo evitaría esto e intentaría dividir en el video en escenas de menos imágenes (un número que pueda cargarse completamente en la memoria a la vez) y crearía una pequeña pantalla de carga entre escenas mientras carga las imágenes de la siguiente escena.


Yo tambien te aconsejo lo mismo, despues de varias pruebas se hace casi imposible (en psp, por sus limitaciones) sincronizar 2 hilos de SDL, y es que tarda demasiado cargando las imagenes, y siempre me termina atrasandose.
Hola a todos e estado trasteando un poco con lo de los hilos este es el codigo que estoy usando
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspdisplay.h>
#include <stdio.h>
#include <pspnet.h>
#include <psputility.h>
#include <pspnet_adhoc.h>
#include <pspnet_adhocctl.h>
#include <pspnet_adhocmatching.h>
#include <pspwlan.h>
#include <SDL.h>
#include <SDL_image.h>
#include <png.h>
#include <SDL_thread.h>

PSP_MODULE_INFO("cargar", 0, 1, 0);
PSP_HEAP_SIZE_KB(20480);

#define printf  pspDebugScreenPrintf

int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}

int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11,
0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}

int Cargar_Imagen(void);
int Mostrar_Imagen(void);

   SDL_Surface  *PIntro[175];
  int err,Intro,Intro2,I;
  unsigned char mimac[6],Abierto[6],Introduccion[16];
  unsigned char Hola[6] = "HOLA";
  SDL_Thread *uno,*dos;

int main(int argc, char *argv[])
{
    pspDebugScreenInit();
    pspDebugScreenClear();
    SetupCallbacks();
     SDL_Init(0);

   pspDebugScreenSetXY(0, 0);
 
                for(Intro = 1;Intro <= 20;Intro++){
                 sprintf(Introduccion,"imagenesg/Comp 1 %03d.png",Intro);
                 PIntro[Intro] = IMG_Load(Introduccion);
                 if(PIntro[Intro] != 0){
                    printf("IMAGEN %03d CARGADA\n",Intro);
                                }
                                                   }
                                                   
    uno = SDL_CreateThread(Cargar_Imagen,NULL);                         
    dos = SDL_CreateThread(Mostrar_Imagen,NULL);
    SDL_WaitThread(uno, NULL);
    SDL_WaitThread(dos, NULL);

                                              
   

}
int Cargar_Imagen(void){
                   for(Intro = 21;Intro <= 175;Intro++){
                 sprintf(Introduccion,"imagenesg/Comp 1 %03d.png",Intro);
                 PIntro[Intro] = IMG_Load(Introduccion);
                 if(PIntro[Intro] != 0){
                    printf("IMAGEN %03d CARGADA\n",Intro);
                         }
                    else{
                          printf("IMAGEN %03d  NO CARGADA\n",Intro); 
                        }   
                             }
                           }
int Mostrar_Imagen(void){
                   for(Intro2 = 1;Intro2 <= 175;Intro2++){
                 if(PIntro[Intro2] != 0){
                    printf("IMAGEN %03d Mostrada\n",Intro2);
                    SDL_FreeSurface(PIntro[Intro2]);
                SDL_Delay(100);
                                }   
                                                      
                               }
                               }


si no muestro las imagenes como en el codigo con un delay de 100 es mas que suficiente pero cuando muestro las imagenes tengo que usar 170 lo que hace que las imagenes tiren 1 pelin mas rapido que cuando las cargaba 1 a 1 pero aun asi va muy lento que puedo hacer ???
Muchas gracias.
Kaltorak
Yo, de momento, lo que haria, seria hacer un .h incluyendolo todo, y asi solo incluyes ese .h, para simplificar.

No puedo ayudarte en mas :S, ve borrando conforme cargas, carga 3, borras la primera, y asi, dejando una de margen, para que no se note, si lo hay, corte. No se si asi tardaria mas...
Lo suyo sería pillar esos 175 fotogramas, crear un video con ellos y luego reproducirlo. La PSP si no me equivoco lleva un chip para decodificar x264 a 480x272. Sería cuestión de mirar en las funciones del SDK y ver cómo se reproduce.

El querer reproducir un vídeo así por surfaces tiene ese problema, estás intentando cargar los 175 fotogramas descomprimidos en memoria y eso ocupa un cojón (es como si estuvieras montando y vídeo en lossless, sin compresión). Cargar surfaces y liberarlas en tiempo real no soluciona el problema, ya que leer de disco y liberar memoria es jodidamente lento. Usando threads no creo que soluciones el problema, ya que no es cosa de CPU, ahí lo que te está limitando es la lectura de disco.

Espero haberte servido de ayuda.

PD: Por cierto, se me ocurre que si disminuyes de tamaño las imágenes, quizás te quepan en memoria (por ejemplo: de 480x272 a 240x136). Y también prueba a reducir la profundidad de color, de 32 a 16 u 8 bit. Puede marcar la diferencia.
Hola a todos
Muchisimas gracias por vuestros consejos y ayuda al final lo he echo todo y va de puta madre, he indexado el color y he usado hilos jajajaja no he dejado nada sin hacer jajajja pero al final la mejor solucion era la mezcla de todas las opciones que me habeis dado [ok]
espero que todos probeis la nueva version del Kopitetris cuando la tenga lista.

Un saludo
Kaltorak.
Claro, ahora que tengo psp puedo [+risas]
14 respuestas