首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: Canvas.DrawBitmap与Drawable.Draw --极大地提高了性能

Android: Canvas.DrawBitmap与Drawable.Draw --极大地提高了性能
EN

Stack Overflow用户
提问于 2010-11-28 11:07:05
回答 2查看 11.5K关注 0票数 19

我刚刚发现了一些事情,我想知道怎么做和为什么。我正在为Android开发一个小型的街机游戏。我决定忽略OpenGL,使用标准的SurfaceView和Drawable来完成它,因为它应该是轻型的(大约10个精灵)。我有我加载的绘图,我使用方法绘制并传递我的画布。每个精灵都是这样被吸引到屏幕上的。事实证明,画4-5个大精灵(200X400左右)需要很长时间才能买不到全新的手机型号。足够长的时间让我的游戏不能玩。我们说的是50到60毫秒的时间来用这种方法画出一幅画面。除了画画,我真的什么也不做,没有地方可以削减成本。所以我决定试着用位图代替。但是,在这里,我需要预先设置大小,因为位图中没有'setBounds‘方法。没有问题,我调整了尺寸,以适应我当前的屏幕负载,问题解决了。

好的。所以我有位图。我现在用Canvas.DrawBitmap来画画。我用新的抽签方法。我得到了400%的性能提升!,而不是50-60毫秒,整个抽签循环现在需要8-12毫秒。--怎么回事?是实际的Drawable.Draw减慢了速度。

对我来说,这是个好消息,因为我真的不想学OpenGL让我的游戏可以玩,但我无法停止对它的怀疑--好吗?我的方法有问题吗?为什么在任何地方都没提到?

EN

回答 2

Stack Overflow用户

发布于 2010-11-28 12:22:43

当您需要不断地迭代时,应该使用SurfaceViewCanvas,而Drawable并不是为了这个目的而使用的。

票数 4
EN

Stack Overflow用户

发布于 2017-07-24 07:44:30

Canvas.drawBitmap所做的工作比Drawable.draw少得多,所以速度更快。

Drawable.draw

既然Drawable是一个抽象类,那么让我们来看看BitmapDrawable

代码语言:javascript
复制
public void draw(Canvas canvas) {
    final Bitmap bitmap = mBitmapState.mBitmap;
    if (bitmap == null) {
        return;
    }
    final BitmapState state = mBitmapState;
    final Paint paint = state.mPaint;
    if (state.mRebuildShader) {
        final Shader.TileMode tmx = state.mTileModeX;
        final Shader.TileMode tmy = state.mTileModeY;
        if (tmx == null && tmy == null) {
            paint.setShader(null);
        } else {
            paint.setShader(new BitmapShader(bitmap,
                    tmx == null ? Shader.TileMode.CLAMP : tmx,
                    tmy == null ? Shader.TileMode.CLAMP : tmy));
        }
        state.mRebuildShader = false;
    }
    final int restoreAlpha;
    if (state.mBaseAlpha != 1.0f) {
        final Paint p = getPaint();
        restoreAlpha = p.getAlpha();
        p.setAlpha((int) (restoreAlpha * state.mBaseAlpha + 0.5f));
    } else {
        restoreAlpha = -1;
    }
    final boolean clearColorFilter;
    if (mTintFilter != null && paint.getColorFilter() == null) {
        paint.setColorFilter(mTintFilter);
        clearColorFilter = true;
    } else {
        clearColorFilter = false;
    }
    updateDstRectAndInsetsIfDirty();
    final Shader shader = paint.getShader();
    final boolean needMirroring = needMirroring();
    if (shader == null) {
        if (needMirroring) {
            canvas.save();
            // Mirror the bitmap
            canvas.translate(mDstRect.right - mDstRect.left, 0);
            canvas.scale(-1.0f, 1.0f);
        }
        canvas.drawBitmap(bitmap, null, mDstRect, paint);
        if (needMirroring) {
            canvas.restore();
        }
    } else {
        updateShaderMatrix(bitmap, paint, shader, needMirroring);
        canvas.drawRect(mDstRect, paint);
    }
    if (clearColorFilter) {
        paint.setColorFilter(null);
    }
    if (restoreAlpha >= 0) {
        paint.setAlpha(restoreAlpha);
    }
}

您可以看到它甚至在内部调用canvas.drawBitmap

Canvas.drawBitmap

将其与Canvas.drawBitmap进行比较。它要短很多。

代码语言:javascript
复制
public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) {
    throwIfCannotDraw(bitmap);
    native_drawBitmap(mNativeCanvasWrapper, bitmap, left, top,
            paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity);
}

有几种不同的drawBitmap方法,但它们都比Drawable.draw方法短。小心陷阱like this,以保持您的位图快速绘制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4296441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档