Although there are great articles like this that gives all the technical information you might need on scrolling, I'm on the hunt for all kinds "tricks" that exists that can be used to make the multi-directional scrolling better. I've found some here and there while googling around, but I'm hoping there is a whole lot more that I don't know about. The main issue to tackle is obviously scrolling artifacts, but I'm also on the hunt for things that decrease time spent in VBlank since multi-directional scrolling eats up a lot of it.
I figure I might start by listing out every trick I know:
- 1. The most obvious thing to do is use more nametables and not have any scrolling artifacts whatsoever, but I always felt this was a bit of a waste, like using a laser cannon to kill an ant. So many cool effects can be done if you have some unused nametables. But it's an option.
2. A well-known trick is to use the $2001 register to hide sprites and background in the leftmost 8 pixels of the screen, to partially hide scrolling artifacts on the horizontal scroll. This is enough to completely eliminate horizontal nametable artifacts, but not attribute artifacts.
3. You can simulate hiding the 8 rightmost pixels of the screen by having a column made out of sprites. Probably not worth it due to the sprite limit. Maybe in a low-sprite situation like a world map or cutscene? This would hide horizontal attribute artifacts entirely.
4. By using an IRQ (or some other means) you can turn off rendering for the bottom 8 pixels on the screen. Not only does this hide vertical nametable artifacts (and partially hide vertical attribute artifacts) but you can even start your VBlank updates early as long as you are careful about the "rainbow stripe" effect of messing with your palettes in that space.
5. Instead of wastefully updating tiles on the edge of the screen every frame, you can store which row/column you updated last frame and not update again until the scroll has moved over to a new row/column.
6. Instead of updating tiles on the exact 8px offset, you can offset your calculations to update tiles when they are scrolled halfway though. This makes scrolling artifacts less visible by dividing it equally between both sides of the screen.
7. Instead of updating both the nametable and attribute table in one go, you can update them separately. You can then do nametable updates perfectly in the 8px "hidden" zone, while attribute updates can be done separately at a different scrolling offset to minimize visual color glitches. As a bonus you spread the VBlank work out over more frames which is a boon.
8. A more practical rather than technical trick is to avoid mixing attributes too much in your level design. If your clouds use the same attributes as your sky background, then you'll avoid constant attribute glitches in the sky as the player is moving, as the game has no need to switch back and forth between the two attributes as the clouds swosh past.
9. Few games are diehard about keeping the player in the dead center of the screen. By allowing a little "bias" you can avoid nasty situations where standing on a particular platform shows you constant attribute glitches on the vertical axis, because the game's engine simply scrolls a few pixels extra up or down before stopping, to align itself better.
Edit: Oh wait I totally forgot the obvious Statusbar coverup. It's essentially the same as point 4 on my list, but with a thicker statusbar you can cover up even the attribute glitches perfectly.