Downloading external PNGs and caching them as textures?

I am working on a cross-platform app for iOS / Android, that comes with 100 sprite icons that are 512x512. We want to continue to add icons that users can download, reaching probably 1000 icons or more in the future. I was hoping I could just download PNGs and add to a growing folder on the device but in some initial testing using the StreamingAssets folder, loading PNGs from the device at run-time creates bad performance hiccups that are not acceptable, that do not happen if they are in “resources” folder.

I understand AssetBundles exist, but they are not cross platform, which makes them either worthless or at best, a huge pain to maintain different bundles for every platform. Also, from my understanding after reading in forums, the entire bundle is loaded into memory, so if we do ten 100 icon asset bundles, and I need to pull 5 from each bundle, it will most likely kill any mobile device memory trying to load 1000 (512x512) textures at once just so I can grab 5 from each pack. I would also rather be able to grab just the relevant icons needed for a specific level based on a DB that may change, instead of having to pre-package them.

The only other thing I could think of is perhaps creating texture assets at run-time out of the PNGs and caching those, but I don’t see any mechanism to do that? At least that way there’s only a processing time when they are first downloaded, if it were possible.

I feel like I am missing something obvious here on the “right” way to do this and would greatly appreciate any help.

I was able to vastly improve the loading of PNGs at run-time with two changes:

  1. Using POT2 256x256 PNGs, no mipmaps… I was originally loading a 400x400 PNG into a 512x512.
  2. Using WWW asynchronously to hide load times

Loading two PNGs now takes about 0.1 seconds on low-end devices, but I can hide it fairly easily and I only need to do this every few seconds. I still don’t know if this is the “best” way, and open to any suggestions, but this works at least.