When you import a 3D model into your project in the Unity Editor, Unity converts the 3D model into an internal mesh format that's optimized specifically for the Unity engine (and stores this somewhere in the
Library folder inside your project directory).
You noticed that if you download a file into the
Resources folder in the Editor while the game is playing, you can't immediately access it using
Resources.Load<>. That's because the Editor hasn't yet parsed the model file into a mesh. Calling
AssetDatabase.Refresh tells the Editor to look for new files in the Resources folder and convert them into a Unity-friendly format (which is then stored somewhere in the
When you call
Resources.Load<>, Unity is not reading the original OBJ file and converting it into a mesh; it is loading the previously converted mesh. When you make a build, Unity only includes the converted mesh, not the original OBJ file.
All of the assets in the
Resources folder are packaged into a single Resources file when you make a build. In a build, the
Resources folder no longer exists - there is only the Resources file that contains the assets that were already converted into Unity-friendly formats by the Editor. There's no way to add new files to the
Resources folder in a build because it doesn't even exist in the build.
Resources.Load<> is not particularly fast - in fact, it's a messy and inefficient way of loading files at runtime. It just seems fast compared to a runtime file importer because it doesn't have to import or parse anything. If you're trying to benchmark it against a runtime model loader, you need to also include the amount of time that
AssetDatabase.Refresh() takes, because that is what actually parses and converts the mesh data from the OBJ file.
If "Runtime Obj Importer" is not fast enough, you'll either need to modify it yourself, or find a different library that can import OBJ files at runtime.