我想知道我在这里做错了什么。
我创建了一个尺寸为 1080x1080 的位图:
Bitmap level = Bitmap.createBitmap(1080, 1080, Config.ARGB_8888);
然后我在其中画了一些线条和矩形并将其放在 SurfaceView 的画布上:
c.drawBitmap(LevelBitmap.level, 0, 0, null);
这个操作在我的谷歌电视 NSZ-GS7 上需要 20 毫秒。很长。
将 surfaceCreated 中的 pixelformat 设置为 RGBX_8888 或 RGBA_8888 会使事情变得更糟,绘制需要 30 毫秒。
holder.setFormat(PixelFormat.RGBX_8888);
设置为 RGB_888
holder.setFormat(PixelFormat.RGB_888);
当我画东西时导致空指针异常
只有位图的 Config.RGB_565 和窗口的 PixelFormat.RGB_565 的组合才能在可接受的 10 毫秒内将位图绘制到画布上,但 RGB_565 的质量非常糟糕。
我错过了什么吗?Google TV 不能支持 32 位图形吗?它的“自然”像素和位图格式是什么?我在谷歌上错过了关于这个主题的任何文档吗?
这是我用来测量时间的请求的 onDraw 方法:
private static void doDraw(Canvas c) {
if (LevelBitmap.level == null){
LevelBitmap.createBitmap();
}
long time = System.currentTimeMillis();
c.drawBitmap(LevelBitmap.level, 0, 0, null);
Log.e("Timer:",""+(System.currentTimeMillis()-time) );
if(true) return;
这里是创建位图的类:
public final class LevelBitmap {
public static Bitmap level;
public static void createBitmap() {
level = Bitmap.createBitmap(GameViewThread.mCanvasHeight, GameViewThread.mCanvasHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(level);
canvas.scale(GameViewThread.fieldScaleFactor, GameViewThread.fieldScaleFactor);
canvas.translate(500, 500);
// floor covering
int plankWidth = 50;
int plankSpace = 500;
short size = TronStatics.FIELDSIZE;
for (int i = plankSpace; i < size; i = i + plankSpace) {
canvas.drawRect(i, 0, i + plankWidth, size, GameViewThread.bgGrey);
canvas.drawRect(0, i, size, i + plankWidth, GameViewThread.bgGrey);
}
// draw field
canvas.drawRect(-10, -10, TronStatics.FIELDSIZE + 10, TronStatics.FIELDSIZE + 10, GameViewThread.wallPaint);
}
}