Fix PlayAnim issue with images gradually loading into cache

Instead of only drawing images on first start, load them into cache.

This resolves a logical problem when images don't load fast enough,
where the animation would load some frames each time until all images
loaded into cache.

In practice this could play back with severe frame skipping many times
times before all images were loaded making playback smooth.

Part of a fix for T81751.
This commit is contained in:
Campbell Barton 2021-05-07 17:54:52 +10:00
parent 8cd0ac8223
commit 3ee49c8711
1 changed files with 31 additions and 5 deletions

View File

@ -634,6 +634,14 @@ static void build_pict_list_ex(
}
}
else {
/* Load images into cache until the cache is full,
* this resolves choppiness for images that are slow to load, see: T81751. */
#ifdef USE_FRAME_CACHE_LIMIT
bool fill_cache = true;
#else
bool fill_cache = false;
#endif
int count = 0;
int fp_framenr;
@ -720,15 +728,33 @@ static void build_pict_list_ex(
pupdate_time();
if (ptottime > 1.0) {
const bool display_imbuf = ptottime > 1.0;
if (display_imbuf || fill_cache) {
/* OCIO_TODO: support different input color space */
ImBuf *ibuf = ibuf_from_picture(picture);
if (ibuf) {
playanim_toscreen(ps, picture, ibuf, fontid, fstep);
IMB_freeImBuf(ibuf);
if (display_imbuf) {
playanim_toscreen(ps, picture, ibuf, fontid, fstep);
}
#ifdef USE_FRAME_CACHE_LIMIT
if (fill_cache) {
picture->ibuf = ibuf;
frame_cache_add(picture);
fill_cache = !frame_cache_limit_exceeded();
}
else
#endif
{
IMB_freeImBuf(ibuf);
}
}
if (display_imbuf) {
pupdate_time();
ptottime = 0.0;
}
pupdate_time();
ptottime = 0.0;
}
/* create a new filepath each time */