分享

Android:低FPS在surfaceview中绘制了许多位图

 印度阿三17 2019-06-12

我正在尝试创建一个弹壳游戏,我遇到了一些麻烦.大约500发子弹后我不能超过17 fps.所有更新逻辑代码大约需要1-4ms,而渲染代码大约需要40ms

现在我的代码是

private void drawEntities(Canvas canvas) {
    for (HashMap<UUID, Spatial> h: spatialList) {
        for (Spatial spatial: h.values()) {
            spatial.render(canvas);
            if(spatial.life > 0)
                spatial.life--;
            else if (spatial.life == 0)
                engine.deleteEntity(spatial.owner);
        }
    }
}

spatialList是一个arrayList,其中每个索引都是zLevel

显示实际子弹的空间是

public void render(Canvas canvas) {
    float angle = (float) (vel.getAngle() * (180 / Math.PI));
    matrix.reset();
    matrix.setTranslate(pos.x - bullet.getWidth() / 2, pos.y - bullet.getHeight() / 2);
    matrix.postRotate(angle   90,  pos.x, pos.y);
    canvas.drawBitmap(bullet, matrix, paint);
    canvas.drawCircle(pos.x, pos.y, col.getRadius(), paint);
}

我可以提供更多代码,但这些似乎是主要问题.我已经尝试了所有我能想到的东西,并且在网上找不到其他东西.我唯一能想到解决这个问题的方法就是从surfaceview切换到GLSurfaceview,但我真的认为有更好的方法而且我只是使用了错误的代码.

编辑:我注意到我的计时器关闭并取消了drawcircle并且在再次运行之后我得到了40ms~500左右,这对于合理的性能来说仍然有点太低.

TLDR; 500个实体= 17 fps.

解决方法:

您可能受到像素填充率的限制.测试设备上的显示器有多大(以像素为单位)?

一个简单的方法是使用setFixedSize()来减小SurfaceView Surface的大小.这将减少您触摸的像素数量.例here,视频here,博客文章here.

这通常是一个好主意,因为较新的设备似乎正在争夺荒谬的像素数.在软件中执行所有渲染的全屏游戏将在2560×1440显示器上挣扎,并且在4K时非常眩晕.将游戏“限制”为1080p并让显示缩放器完成繁重工作应该会有所帮助.根据游戏的性质,你可以将分辨率设置得更低,没有明显的质量损失.

另一件事是尝试消除drawBitmap()调用,检查你的时间,然后恢复它并消除drawCircle()调用,以查看是否有一个或另一个正在咀嚼大部分时间.

您可能会发现切换到OpenGL ES并不是那么糟糕. Grafika中的“硬件缩放器训练器”活动(来自上面链接的视频)显示了一些简单的位图渲染.用缩放的位图替换drawCircle(),你可能已经完成了大部分工作. (注意它在该活动中使用SurfaceView而不是GLSurfaceView用于GLES.)

来源:http://www./content-4-241751.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多