Page 1 of 1

handleSchemeNotFound error on android

Posted: Fri Jul 17, 2015 6:15 pm
by fla666
hi guys, does anybody have encountered the "handleSchemeNotFound " problem on android ? i found that this will slow the apk start up time heavily before it can render normally .

on Google Nexus 5 mobile phone , the first call "RenderOneFrame" will take about 500ms , if modify "handleSchemeNotFound" to an empty function, the first "renderOneFrame" become fast , but nothing can be rendered on screen .

could somebody give me some suggestion on how to optimize the app start up time , how to resolve this "handleSchemeNotFound " error ? and will shader cache be help on android ? thanks !

in my app , i create all materials from code, and initialize the ShaderGenerator as following :

Code: Select all

initialiseRTShaderSystem(Ogre::SceneManager* sceneMgr)
            if (Ogre::RTShader::ShaderGenerator::initialize())
                mShaderGenerator = Ogre::RTShader::ShaderGenerator::getSingletonPtr();


                // Create and register the material manager listener if it doesn't exist yet.
                if (mMaterialMgrListener == NULL) {
                    mMaterialMgrListener = new ShaderGeneratorTechniqueResolverListener(mShaderGenerator);

            return true;
and ShaderGeneratorTechniqueResolverListener defined as following :

Code: Select all

class ShaderGeneratorTechniqueResolverListener : public MaterialManager::Listener

    ShaderGeneratorTechniqueResolverListener(RTShader::ShaderGenerator* pShaderGenerator)
        mShaderGenerator = pShaderGenerator;

    virtual Technique* handleSchemeNotFound(unsigned short schemeIndex, 
        const String& schemeName, Material* originalMaterial, unsigned short lodIndex, 
        const Renderable* rend)
        // Case this is the default shader generator scheme.
        if (schemeName == RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME)
            MaterialRegisterIterator itFind = mRegisteredMaterials.find(originalMaterial);
            bool techniqueCreated = false;

            // This material was not registered before.
            if (itFind == mRegisteredMaterials.end())
                techniqueCreated = mShaderGenerator->createShaderBasedTechnique(
            mRegisteredMaterials[originalMaterial] = techniqueCreated;

        return NULL;

    typedef std::map<Material*, bool>       MaterialRegisterMap;
    typedef MaterialRegisterMap::iterator   MaterialRegisterIterator;

    MaterialRegisterMap             mRegisteredMaterials;       // Registered material map.
    RTShader::ShaderGenerator*      mShaderGenerator;           // The shader generator instance.