2

我想知道我在这里做错了什么。

我创建了一个尺寸为 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);

    }

}
4

0 回答 0