Author Topic: Removing images/sprites from RAM?  (Read 131 times)

KeiDash

  • Newbie
  • *
  • Posts: 11
  • Karma: +1/-0
    • View Profile
    • amelian.eu
Removing images/sprites from RAM?
« on: July 10, 2019, 09:33:54 am »
Hi again,

I'm working around 2 weeks with JoEngine and I think that is a good framework to develop games for SS, I Like it and I think that it's so easy to use.

I've just been using BennuGD port for Dreamcast and I leave it for all problems with the audio and the Ram memory management.

When I began with JoEngine, I decide first do some test divided in output text, audio test, gamepad test, image/sprite test and save/load state test, so I try  to merge all in the same project divided in screens, something very simple.

Each screen has its owns image background, vars, functionalities, messages, etc.

I did the output text screen with and background image, some text like date, autor, description, etc.

I'm doing the 3th screen that represents the display of sprite/images with animations, sprites, backgrounds etc.

Well, In this point I'm begin having problems with the game.

The first thing that I detect was that some text were not show and the game stops in the first screen (It worked properly before I made the 3th screen). This happened when I load one more sprite in the game and I assign this to a jo_img var. I tried free the memory and remove from memory all images that I don't use but I don't know really how to do it.

I think that it's possible that I'm loading all images and sprite in the wrong way or something that I'm doing with this images not is correct, for example:

As I say, each screen has its own background image. I'm doing this with this piece of code added in the core with jo_core_add_callback

Code: [Select]
void SetBackgroundByScreen()
{
    jo_img imgBackground;
    imgBackground.width = 320;
    imgBackground.height = 240;

    switch (currentScreen)
    {
        case SCREEN_MAIN:
            if(!enableBackground) { break; }

            enableBackground = true;
            imgBackground.data = (unsigned short *)BG1;

            jo_clear_background(JO_COLOR_Black);
            jo_set_background_sprite(&imgBackground, 0, 0);
            jo_free_img(&imgBackground);

            break;
        case SCREEN_OUTP:
           
            if(!enableBackground) { break; }

            enableBackground = true;
            imgBackground.data = (unsigned short *)BG2;

            jo_clear_background(JO_COLOR_Black);
            jo_set_background_sprite(&imgBackground, 0, 0);
            jo_free_img(&imgBackground);

            break;
        case SCREEN_SPRI:
       
            /* TODO*/

        default:
            enableBackground = false;
            imgBackground.data = JO_NULL;
           
            break;
    }

}

void jo_main(void)
{
   jo_core_init(JO_COLOR_Black);
   jo_core_add_callback(SetBackgroundByScreen);
   jo_core_run();
}


And in the screen 3, I'm loading some sprites (five in particular) with this piece of code:
Code: [Select]
void s_LoadSprites()
{
    static int sprLoaded = 0;
   
   /*
         load only once time
         sprLoading1st it's a global var
   */

    if(sprLoaded == 1)
    {
       return;
    }

    sprLoading1st.width = 48;
    sprLoading1st.height = 48;

    /*sprite 1*/
    sprLoading1st.data = (unsigned short *)sprLoading1;
    idSprLoading1st = jo_sprite_add(&sprLoading1st);
    sprLoading1st.data = JO_NULL;

    /*sprite 2*/
    sprLoading1st.data = (unsigned short *)sprLoading2;
    jo_sprite_add(&sprLoading1st);
    sprLoading1st.data = JO_NULL;
   
    /*sprite 3*/
    sprLoading1st.data = (unsigned short *)sprLoading2;
    jo_sprite_add(&sprLoading1st);
    sprLoading1st.data = JO_NULL;

    /*sprite 4*/
    sprLoading1st.data = (unsigned short *)sprLoading4;
    jo_sprite_add(&sprLoading1st);
    sprLoading1st.data = JO_NULL;
   
    animSprLoading1st = jo_create_sprite_anim(idSprLoading1st, 4, 2);
    jo_start_sprite_anim_loop(animSprLoading1st);

    /*sprite 5*/
    sprLoading1st.width = 24;
    sprLoading1st.height = 40;

    sprLoading1st.data = (unsigned short *)sprKen01;
    sprLoading1st.data = JO_NULL;

    sprLoaded = 1;
}

I must point out that the images are hardcore loaded. I was create it with the JoMapEngine and ported to C and included in the code.

At this point the game doesn't run. I have to remove several image/sprite loads for the game to work.

So please, I need help! What I'm doing wrong? How can I remove images and sprites and liberate it from ram? This is the real problem?

Regards,

KeiDash

  • Newbie
  • *
  • Posts: 11
  • Karma: +1/-0
    • View Profile
    • amelian.eu
Re: Removing images/sprites from RAM?
« Reply #1 on: July 12, 2019, 12:28:16 pm »
Researching the case, I'm not solved yet but I found the piece of code that making the game crashes.

I have 3 background images of 320x240 pixels hardcoded (converted to C with JoMapEditor)

If I use 2 of them, the game works fine but if I load more of 2 of them, the games crashes, Regardless of whether you used it or not or the life cycle of the code reaches the loading point.


I have 2 methods, jo_main() and testbg(). In jo_main() I'm doing this:

Code: [Select]
void jo_main(void)
{
    jo_core_init(JO_COLOR_Black);

    currentScreen = 0;

    jo_core_run();
   
}

And in the method testbg I'm doing this:
Code: [Select]
void testbg()
{
    static unsigned int myscreen = 0;
    static int counter = 0;

    jo_img bg1;
    jo_img bg2;
    jo_img bg3;

    if(displayed == 0)
    {
        displayed = 1;

        bg1.width = 320;
        bg1.height = 240;
        bg1.data = (unsigned short *)BG1;

        bg2.width = 320;
        bg2.height = 240;
        bg2.data = (unsigned short *)BG2;

        bg3.width = 320;
        bg3.height = 240;
        bg3.data = (unsigned short *)BG3;
    }
}

If you look at the code, I'm not calling the method testbg() on jo_main(). In spite of this, if I write the 3th image code, the game crashes
Code: [Select]
        bg3.width = 320;
        bg3.height = 240;
        bg3.data = (unsigned short *)BG3;

But if I coment it, the game works fine.
Code: [Select]
        /*bg3.width = 320;*/
        /*bg3.height = 240;*/
        /*bg3.data = (unsigned short *)BG3;*/

And I repeat, I'm not calling to the testbg method.

The image arrays (BG1, BG2 and BG3) it's on one file called bgMain.h (#include "bgMain.h"), that contanis the 3 images exported with JoMagEditor to C. (PNG file to C)

I thought that the problem was the BG3 array maybe, so I made another different and I replace it but still happening the same.

So please, someone know what I'm doing wrong?

Maybe the problem is the size of exported images indepent of they was loaded?

Thanks

 

Sitemap 1 2 3 4 5 6 7 8 9 10 
SMF spam blocked by CleanTalk