繁体   English   中英

使用BitmapFactory.decodeByteArray制作动画时帧速率不均匀

[英]uneven frame rate when making animation using BitmapFactory.decodeByteArray

我想逐帧播放动画。 我有一个ArrayList byeArr,它包含jpeg图片并逐个解码它们以在surfaceview上显示。

tim = new CountDownTimer(1,1)
{
int i = 0;

@Override
public void onFinish()
{

    if ( i < byeArr.size() )
    {
        bitMap = BitmapFactory.decodeByteArray ( byeArr.get(i) , 0,  byeArr.get(i).length );
            /// bitMap is a bitmap that is displayed on screen.

        lastFrameMs = System.currentTimeMillis() - lastFrameSysTime;
        totalFr = totalFr + lastFrameMs;
        Log.e("LF", "frame: "+ String.valueOf(i) + " = " + String.valueOf(lastFrameMs) +"ms");

        lastFrameSysTime = System.currentTimeMillis();
        i++;
        tim.start();

    }
...

例如,如果我想要15 FPS帧很少,我应该将CountDownTimer设置为1000/15 - lastFrameMs,其中lastFrameMs将是绘制一帧的时间。

这会很好用,它会以恒定的速度绘制帧,但问题是它们没有。 每帧可以在25到65毫秒之间的任何地方...

11-14 19:00:52.402: E/LF(26270): frame: 0 = 60ms
11-14 19:00:52.429: E/LF(26270): frame: 1 = 27ms
11-14 19:00:52.488: E/LF(26270): frame: 2 = 55ms
11-14 19:00:52.519: E/LF(26270): frame: 3 = 32ms
11-14 19:00:52.574: E/LF(26270): frame: 4 = 57ms
11-14 19:00:52.605: E/LF(26270): frame: 5 = 30ms
11-14 19:00:52.664: E/LF(26270): frame: 6 = 56ms
11-14 19:00:52.695: E/LF(26270): frame: 7 = 33ms
11-14 19:00:52.753: E/LF(26270): frame: 8 = 58ms
11-14 19:00:52.824: E/LF(26270): frame: 9 = 71ms
11-14 19:00:52.886: E/LF(26270): frame: 10 = 62ms
11-14 19:00:52.914: E/LF(26270): frame: 11 = 27ms
11-14 19:00:52.976: E/LF(26270): frame: 12 = 62ms
11-14 19:00:53.007: E/LF(26270): frame: 13 = 29ms
11-14 19:00:53.066: E/LF(26270): frame: 14 = 61ms
11-14 19:00:53.097: E/LF(26270): frame: 15 = 27ms
11-14 19:00:53.171: E/LF(26270): frame: 16 = 77ms
11-14 19:00:53.199: E/LF(26270): frame: 17 = 28ms
11-14 19:00:53.261: E/LF(26270): frame: 18 = 62ms
11-14 19:00:53.300: E/LF(26270): frame: 19 = 37ms
11-14 19:00:53.355: E/LF(26270): frame: 20 = 56ms
11-14 19:00:53.390: E/LF(26270): frame: 21 = 34ms
11-14 19:00:53.457: E/LF(26270): frame: 22 = 66ms
11-14 19:00:53.484: E/LF(26270): frame: 23 = 30ms
11-14 19:00:53.550: E/LF(26270): frame: 24 = 64ms
11-14 19:00:53.582: E/LF(26270): frame: 25 = 31ms
11-14 19:00:53.640: E/LF(26270): frame: 26 = 60ms
11-14 19:00:53.667: E/LF(26270): frame: 27 = 29ms
11-14 19:00:53.734: E/LF(26270): frame: 28 = 66ms
11-14 19:00:53.769: E/LF(26270): frame: 29 = 33ms
11-14 19:00:53.828: E/LF(26270): frame: 30 = 60ms
11-14 19:00:53.871: E/LF(26270): frame: 31 = 43ms
11-14 19:00:53.929: E/LF(26270): frame: 32 = 58ms
11-14 19:00:53.933: E/- - -(26270):  - - - 
11-14 19:00:53.933: E/fps(26270): 21 FPS
11-14 19:00:53.933: E/avrg ms for frame(26270): 46

......任何想法可以做些什么呢?

谢谢!

您不应该在解码后立即显示它们。

在您的计时器中,解码位图然后在显示位图之前等待一段时间X. X是哪里

X = constantInterval - lastFrameMs.

如果X为负数,则立即绘制。

此外,如果它足够小,你应该考虑将动画存储在RAM中而不是解码它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM