Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Readium performance is very poor loading large ePub with hundreds of SMIL files. #181

Open
roomisalah opened this issue Jun 1, 2017 · 2 comments

Comments

@roomisalah
Copy link

Readium performance is very poor loading large ePub with hundreds of SMIL files. It is taking more than 18-20 seconds to show the first page which is not acceptable in the web-world.

After debugging, it has been noticed that Readium itself loads all the SMIL file at once and waits until all the SMIL file is loaded before showing up the first page.

Is there is any setting/way to deferred these calls and load SMIL data one by one after the page gets loaded? This way we can improve the performance.

I would appreciate if someone suggests improving the Readium performance?

Thanks in advance!

Below is the code snippet which loads all the SMIL data:
this.fillSmilData = function (callback) {
var that = this;

if (packageDocument.spineLength() <= 0) {
    callback();
    return;
}

var allFakeSmil = true;
var mo_map = [];
var parsingDeferreds = [];

for (var spineIdx = 0; spineIdx < packageDocument.spineLength(); spineIdx++) {
    var spineItem = packageDocument.getSpineItem(spineIdx);

    if (spineItem.media_overlay_id) {
        var manifestItemSMIL = packageDocument.manifest.getManifestItemByIdref(spineItem.media_overlay_id);

        if (!manifestItemSMIL) {
            console.error("Cannot find SMIL manifest item for spine/manifest item?! " + spineItem.media_overlay_id);
            continue;
        }
        //ASSERT manifestItemSMIL.media_type === "application/smil+xml"

        var parsingDeferred = $.Deferred();
        parsingDeferred.media_overlay_id = spineItem.media_overlay_id;
        parsingDeferreds.push(parsingDeferred);
        var smilJson = {};

        // Push the holder object onto the map early so that order isn't disturbed by asynchronicity:
        mo_map.push(smilJson);

        // The local parsingDeferred variable will have its value replaced on next loop iteration.
        // Must pass the parsingDeferred through async calls as an argument and it arrives back as myDeferred.
        that.parse(spineItem, manifestItemSMIL, smilJson, parsingDeferred, function (myDeferred, smilJson) {
            allFakeSmil = false;
            myDeferred.resolve();
        }, function (myDeferred, parseError) {
            //console.log('Error when parsing SMIL manifest item ' + manifestItemSMIL.href + ':');
            //console.log(parseError);
            myDeferred.resolve();
        });
    } else {
        mo_map.push(makeFakeSmilJson(spineItem));
    }
}

$.when.apply($, parsingDeferreds).done(function () {
    packageDocument.getMetadata().setMoMap(mo_map);
    if (allFakeSmil) {
        // console.log("No Media Overlays");
        packageDocument.getMetadata().setMoMap([]);
    }
    callback();
});

}

@harishag
Copy link

harishag commented Jun 2, 2017

We are all facing this issue. Any help in this area will be helpful. Load time for large books with SMIL is very high.

@danielweck
Copy link
Member

There are no plans to implement SMIL lazy-loading (ReadiumJS and ReadiumSDK/C++). However, this would certainly improve initial-load performance (possibly at the detriment of playback-time performance, but this could be mitigated with some look-ahead techniques).

Things to consider:

There might be functions in the Media Overlays engine (in readium-shared-js) that depend on having access to the entire SMIL timing tree across multiple spine items (I'm not sure, from the top of my head). I think there are also calculations (for total durations, IIRC) performed during full-publication parsing. Again, to be verified, I'm not sure anymore.

Although the loaded EPUB publications are passed as a monolithic JSON dataset to readium-shared-js, the exception to this rule of thumb is the table of contents (EPUB2 NCX / EPUB3 Navigation Document), which is loaded separately by the viewer instance. In other words, there is a precedent with regards to fetching resources from the EPUB container after the main JSON is generated. This model could be followed for the SMIL files too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants