After almost 9 years of using my Home Media Server project I have accumulated over 2500 individual videos. HMS is written in BrightScript, and runs on the Roku Players and TVs. When I originally wrote HMS I only had a few hundred videos, so loading times were short. On my older players it can now take several minutes before the user interface is ready to use. This can cause family members to randomly say things like "This is too slow" and "When are you going to fix it?"
HMS was using the
to display all of the categories and all of the videos at once. This required
loading them up-front, freezing the UI until it was complete. Adding a dialog
to indicate how many had been loaded helped, for a while, but watching it count
gets boring quickly. I looked at several ways to speed up loading, including
simplifying the regex code for parsing out the
href links, loading only some
of the categories first, and not populating the screen array used for
searching. But none of them yielded the results I was looking for.
Modifying the regex didn't speed things up, and loading a partial screen didn't
work out. There is an event you can catch, called
isListItemFocused which I
thought would allow me to do progressive loading of the next few screens as the
user scrolled down through the categories. It ends up that populating a new
category also triggers this event, causing it to loop. And because of
BrightScript's design I couldn't use a lock to keep it from then populating the
next few, and the next few, etc. until it had loaded all of them. No
improvement to be found there!
SceneGraph or roPosterScreen
Roku has introduced a new framework, called SceneGraph, which may be able to do what I need, but that would take a complete rewrite as well as learning a new framework. Instead I took a look at the other primary BrightScript screen component, roPosterScreen. I've never really been a fan of this layout, but I gave it a try. Experiments showed that the item list was re-loaded whenever a new category is selected, and that I didn't need to load everything at startup. This was exactly what I needed.
The rewrite was pretty simple after I decided to drop support for searching. I don't use it much and it means I don't have to load everything at startup just for the search. Now it populates the categories from the top level directories, and then it only loads the movies for the last selected category, retrieved from the keystore server. The movies are cached so that they can be displayed quickly when re-visiting a category.
roGridScreen and the
roPosterScreen components are deprecated,
with removal planned for January 1st, 2019. My older roku players are no longer
receiving updates so this won't be a problem with them, but I will have to move
to SceneGraph sometime before this. Probably during Christmas Vacation 2018.