Balloonatics Thread

slinga

Established Member
I created a new build that hopefully fixes the SSMTF pre-title screen. It sounds dumb but it's important to me to get that right at least. The fish is supposed to ominously come up and look around, then descend back down. On emulators it works, on real hardware the water doesn't render and the fish doesn't appear.

I would appreciate it if someone can try out build 0.91.
 

Attachments

  • balloonatics_v91.zip
    16.5 MB · Views: 64
Last edited:

fafling

Gear Supporter
So like I said on Discord, the last row of water sprites still has flickers, the rest is fine, including the monster. Tested on a PAL Saturn switched to 60 Hz (there's no flicker at 50 Hz, but I don't think that's the intended framerate).
RIMG0343.JPG


So that it doesn't get buried in Discord, here's a recap of the optimizations in place to make VDP1 draw more sprites, since it is the limiting factor :
  • Disabling pre-clipping on sprites that are completely visible. Pre-clipping is only useful for sprites that have a big part outside of the visible drawing coordinates, and it costs 5 cycles per line drawn. To handle pre-clipping in Jo engine :
    Code:
    __jo_sprite_attributes.effect |= (1 << 11); // Disables pre-clipping.
    __jo_sprite_attributes.effect &= (~(1 << 11)); // Enables pre-clipping back.
  • Trimming the blank lines at the top of the wave and monster textures.
The flicker indicates that the rendering is still incomplete every other field. This is due to the way SGL handles 480i, reusing the same VDP1 command list two fields in a row. The command list transfer occurs at the beginning of the 1st field and eats into VDP1 time to render that field (SGL doesn't take advantage of vblank to transfer the command list). The 2nd field has more time because no transfer occurs.

Here VDP1 renders around 750 sprites per field in 640x480i. Setting the horizontal res to 704 instead of 640 would increase VDP1 speed, but would impact the aspect ratio, and either require to add sprites on the sides or leave black bars.
 

slinga

Established Member
Thanks again as always Fafling. The build 91 above has all of the improvements you recommended (disable preclipping for all sprites except for the fish, reduce water empty lines, reduce fish empty lines) with the exception of changing the resolution. I made a build with 704 resolution + disable preclipping and that worked well.

Why did I go with 640x480 instead of 704x480? I just assumed it would look better on my TV. That being my said, my TV claims the input is 720x480 60i. This is with HD retrovision component cables plugged directly to the TV. So yeah what the heck lol. I should just take pictures and compare at 704 vs 640. The additional width would help with player starting positions...
 

fafling

Gear Supporter
704 resolution gives slightly narrower pixels on screen than 640, and should cover a slightly wider area : 704 has 10% more pixels than 640 while VDP2 frequency, so pixel frequency, increases by about 7%. Both resolutions have borders on the sides, which are black in your game, and which added to the 640/704 image form a 4/3 picture (when the aspect ratio of the TV is set to 4/3).

When converting an analog NTSC signal to digital, it's considered to have 720 pixels horizontally, that's why your TV displays that 720x480 60i information. It has no way to know what was the actual horizontal resolution on the Saturn. The 704 resolution, when adding the border area, matches pretty much exactly the 720 pixels that the TV expects, so it should be sharper than the 640 resolution which, when adding the border, should give an analog signal packing something like 672 pixels being sampled 720 times by the TV.
 

slinga

Established Member
"Tails of Saturn" uploaded a video of the game: youtube.com/watch?v=MNIuQpEtRxY. I appreciate the vid but have to lol at a number of things.

1) He called the game "Baloontastic". Lol wut.
2) He burned the game without audio tracks. The cue file is in zip, I'm assuming he burned just the ISO.
3) In my release notes I mentioned to use the start button. This guy clearly doesn't press on the team select screen so he gets stuck for a bit. He mashes buttons for a bit. B takes him back to the title screen.
4) He accidentally hits X and Z at different times. X is a debugging feature I left in by mistake (whoops) that changes the level. Unfortunately changing the level on story mode doesn't make sense as the versus levels don't have balloons. Z toggles debug prints.
5) If you die in story mode I don't exit the game. You have to sit there and wait until the 100 balloons pass by. Whoops. You can hit ABC + START.

Anyway hope the judges see this so they have less frustration then this guy did.
 

slinga

Established Member
Another review: .

Again the reviewer got the name of the game wrong lol. Otherwise much less frustrating to watch than the first vid.

One thing I wanted to comment on: Because the pre-title screen didn't have the fish render, the reviewer was surprised in the ending scene when the fish comes up and eats the princess. Dang.
 
Last edited:

slinga

Established Member
Thanks to @SuperReye, I have greatly improved the loading time of Balloonatics and Flicky's Flock. See the diff here: Faster Load Time, Thx Reyeme · slinga-homebrew/Flickys-Flock@09e7abf.

TL;DR: The jo_sprite_add*() that take a directory argument has an optional input end up calling jo_fs_cd() twice (once to change into the dir, and once to change back out). This is a slow process.

This is slow:

Code:
g_Assets.SSMTF1Sprite = jo_sprite_add_tga("TEX", "SSMTF1.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF2Sprite = jo_sprite_add_tga("TEX", "SSMTF2.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF3Sprite = jo_sprite_add_tga("TEX", "SSMTF3.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF4Sprite = jo_sprite_add_tga("TEX", "SSMTF4.TGA", JO_COLOR_Transparent);

This is much faster (and equivalent):

Code:
jo_fs_cd("TEX");

g_Assets.SSMTF1Sprite = jo_sprite_add_tga(NULL, "SSMTF1.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF2Sprite = jo_sprite_add_tga(NULL, "SSMTF2.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF3Sprite = jo_sprite_add_tga(NULL, "SSMTF3.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF4Sprite = jo_sprite_add_tga(NULL, "SSMTF4.TGA", JO_COLOR_Transparent);
   
jo_fs_cd("..");
 
Big improvement, indeed.
Thanks for keep updating your proyects, Balloonatics was a nice and fresh surprise and it feels so fluid on gameplay that i hope you could finish it.
 

Danthrax

Established Member
Thanks to @SuperReye, I have greatly improved the loading time of Balloonatics and Flicky's Flock. See the diff here: Faster Load Time, Thx Reyeme · slinga-homebrew/Flickys-Flock@09e7abf.

TL;DR: The jo_sprite_add*() that take a directory argument has an optional input end up calling jo_fs_cd() twice (once to change into the dir, and once to change back out). This is a slow process.

This is slow:

Code:
g_Assets.SSMTF1Sprite = jo_sprite_add_tga("TEX", "SSMTF1.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF2Sprite = jo_sprite_add_tga("TEX", "SSMTF2.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF3Sprite = jo_sprite_add_tga("TEX", "SSMTF3.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF4Sprite = jo_sprite_add_tga("TEX", "SSMTF4.TGA", JO_COLOR_Transparent);

This is much faster (and equivalent):

Code:
jo_fs_cd("TEX");

g_Assets.SSMTF1Sprite = jo_sprite_add_tga(NULL, "SSMTF1.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF2Sprite = jo_sprite_add_tga(NULL, "SSMTF2.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF3Sprite = jo_sprite_add_tga(NULL, "SSMTF3.TGA", JO_COLOR_Transparent);
g_Assets.SSMTF4Sprite = jo_sprite_add_tga(NULL, "SSMTF4.TGA", JO_COLOR_Transparent);
  
jo_fs_cd("..");

Do you have an updated build that implements this load time fix?
 

slinga

Established Member
Here's the latest build. At some point I will cleanup the source and toss it up on Github.
 

Attachments

  • balloonatics_v92.zip
    16.4 MB · Views: 31
Top