Alright, I think I found the solution. It will take a long time to set up depending on how you currently have things organized (or are reorganizing), but it should work.
You will want to make a local script in replicated first and do something like this:
local ContentProvider = game:GetService("ContentProvider")
local IDS = {
"http://www.roblox.com/asset/?id=2675785344",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6266766341",
"http://www.roblox.com/asset/?id=6273789895",
"http://www.roblox.com/asset/?id=6264447407",
"http://www.roblox.com/asset/?id=6264448504",
"http://www.roblox.com/asset/?id=6264450933",
"http://www.roblox.com/asset/?id=2675785344",
"http://www.roblox.com/asset/?id=6255989403",
"http://www.roblox.com/asset/?id=6255989836",
"http://www.roblox.com/asset/?id=6255990255",
"http://www.roblox.com/asset/?id=6255990700",
"http://www.roblox.com/asset/?id=6255991107",
"http://www.roblox.com/asset/?id=6255992210",
"http://www.roblox.com/asset/?id=6255993954",
"http://www.roblox.com/asset/?id=6255994471"
-- this is the amount of IDS I tested, but you will need to put all of them in here.
}
local function checkFailed(contentId, Status)
if Status == Enum.AssetFetchStatus.Failure then
print("Failed to load", contentId)
end
end
ContentProvider:PreloadAsync(IDS, checkFailed)
I tested it, and it did preload the images in the table. The TV part the images were supposed to change on reacted much sooner than they did the first time, and there was little to no blacking out for the selected images to save. Now do keep in mind that because you have so many images to preload, you might need to create multiple tables and preload each table separately once you hit the max object limit in a table. I hope this helps!
Edit: alternatively, you could just make the check function do it for every part that has a decal named (whatever you want it to be) and then just make it change the decal of each of those.
Edit edit: After doing just a little more research and testing, I don’t think it’s actually possible to change the decal on 20+ parts every 20th of a second. Roblox itself can’t handle things changing that fast, even if it’s preloaded. You are probably better off making an animation of what you want to show, then using a ViewportFrame to display it. Sorry for all the confusion.