我刚刚发现了一些事情,我想知道怎么做和为什么。我正在为Android开发一个小型的街机游戏。我决定忽略OpenGL,使用标准的SurfaceView和Drawable来完成它,因为它应该是轻型的(大约10个精灵)。我有我加载的绘图,我使用方法绘制并传递我的画布。每个精灵都是这样被吸引到屏幕上的。事实证明,画4-5个大精灵(200X400左右)需要很长时间才能买不到全新的手机型号。足够长的时间让我的游戏不能玩。我们说的是50到60毫秒的时间来用这种方法画出一幅画面。除了画画,我真的什么也不做,没有地方可以削减成本。所以我决定试着用位图代替。但是,在这里,我需要预先设置大小,因为位图中没有'setBounds‘方法。没有问题,我调整了尺寸,以适应我当前的屏幕负载,问题解决了。
好的。所以我有位图。我现在用Canvas.DrawBitmap来画画。我用新的抽签方法。我得到了400%的性能提升!,而不是50-60毫秒,整个抽签循环现在需要8-12毫秒。--怎么回事?是实际的Drawable.Draw减慢了速度。
对我来说,这是个好消息,因为我真的不想学OpenGL让我的游戏可以玩,但我无法停止对它的怀疑--好吗?我的方法有问题吗?为什么在任何地方都没提到?
发布于 2010-11-28 12:22:43
当您需要不断地迭代时,应该使用SurfaceView的Canvas,而Drawable并不是为了这个目的而使用的。
发布于 2017-07-24 07:44:30
Canvas.drawBitmap所做的工作比Drawable.draw少得多,所以速度更快。
Drawable.draw
既然Drawable是一个抽象类,那么让我们来看看BitmapDrawable
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进行比较。它要短很多。
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,以保持您的位图快速绘制。
https://stackoverflow.com/questions/4296441
复制相似问题