From ca3b84197441e351ef490d61cbae14ef661a1bbe Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Thu, 1 Jul 2021 15:01:53 -0700 Subject: [PATCH] gltfio: Add fast path for native material providers. --- .../gltfio-android/src/main/cpp/AssetLoader.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/android/gltfio-android/src/main/cpp/AssetLoader.cpp b/android/gltfio-android/src/main/cpp/AssetLoader.cpp index 74863714e8..39aed8b8e7 100644 --- a/android/gltfio-android/src/main/cpp/AssetLoader.cpp +++ b/android/gltfio-android/src/main/cpp/AssetLoader.cpp @@ -169,10 +169,23 @@ extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_gltfio_AssetLoader_nCreateAssetLoader(JNIEnv* env, jclass, jlong nativeEngine, jobject provider, jlong nativeEntities) { Engine* engine = (Engine*) nativeEngine; - MaterialProvider* materials = new JavaMaterialProvider(env, provider); + MaterialProvider* materialProvider = nullptr; + + // First check for a fast path that passes a native MaterialProvider into the loader. + // This drastically reduces the number of JNI calls while the asset is being loaded. + jclass klass = env->GetObjectClass(provider); + jmethodID getNativeObject = env->GetMethodID(klass, "getNativeObject", "()J"); + if (getNativeObject) { + materialProvider = (MaterialProvider*) env->CallLongMethod(provider, getNativeObject); + } + + if (materialProvider == nullptr) { + materialProvider = new JavaMaterialProvider(env, provider); + } + EntityManager* entities = (EntityManager*) nativeEntities; NameComponentManager* names = new NameComponentManager(*entities); - return (jlong) AssetLoader::create({engine, materials, names, entities}); + return (jlong) AssetLoader::create({engine, materialProvider, names, entities}); } extern "C" JNIEXPORT void JNICALL