android - 在 Canvas 中更好的帧率绘制位图?

标签 android opengl-es bitmap live-wallpaper

我正在拍摄动态壁纸中的动画。这是代码。它几乎遵循 CubeWallpaper 演示:

    void drawFrame() {
        final SurfaceHolder holder = getSurfaceHolder();
    final BufferedInputStream buf;
    final Bitmap bitmap, rbitmap;

        Canvas c = null;
        try {
            c = holder.lockCanvas();
            if (c != null) {
        try {
        buf = new 
            BufferedInputStream(assets.
                    open(folder+"/"
                         +imageList[ilen++])
                    );
        bitmap = BitmapFactory.
            decodeStream(buf);
        rbitmap = Bitmap.createBitmap
            (bitmap,
             0,0,imageWidth,imageHeight,
             transMatrix,false);
        c.drawBitmap(rbitmap,
                 paddingX,
                 paddingY,
                 null);
        if ( ilen >= imageCount ) ilen=0;
        }
        catch (Exception e) { e.printStackTrace(); }
            }
        } finally {
            if (c != null) holder.unlockCanvasAndPost(c);
        }

        // Reschedule the next redraw
        mHandler.removeCallbacks(mDrawCube);
        if (mVisible) {
            mHandler.postDelayed(mDrawCube, fps);
        }
    }

其中“transMatrix”是之前预定义的缩放和旋转矩阵。

它应该以 30fps 的速度呈现,但它当然不会那样做。我最初的猜测是 BufferedInputStream 是一个因素。当我与位图一起使用时,我可能应该缓存其中的一些。但是还有其他想法吗?我必须使用 OpenGL hack 来制作动态壁纸吗?

最佳答案

是的,BufferedInputStreamBitmapFactory 根本不应该在drawFrame() 中。您在每一帧上加载和创建资源,这是一种巨大的浪费。就像你说的那样,事先尽可能多地缓存,如果你发现在绘图过程中需要加载更多,请使用单独的线程来执行它,这样就不会减慢绘图速度。

关于android - 在 Canvas 中更好的帧率绘制位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165840/

相关文章:

android - OpenGL - 无论屏幕尺寸/比例如何,都呈现相同的尺寸

opengl-es - 片段着色器中线性过滤浮点纹理的伪影

android - 从 JSON URL 加载图像到 ListView

带有 cURL 的 Android NDK 包含错误

java - 如何检查 ImageView 是否加载了来自 URL 的图片

android - 不会触发后续的 onBind() 调用

android - 在 Chrome 和 Android 上呈现问题

java - 通过parse.com添加图片库

c++ - 如何使用 Libwebp 从 Webp 解码和编码?

android - 在Android上的HTML中嵌入youtube视频只有声音,没有视频