gpt4 book ai didi

Android:低 FPS 在表面 View 中绘制许多位图

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:20 28 4
gpt4 key购买 nike

我正在尝试创建一个弹幕游戏,但遇到了一些麻烦。大约 500 发子弹后,我无法获得超过 17 fps。所有这些更新逻辑代码大约需要 1-4 毫秒,而渲染代码大约需要 40 毫秒

现在我的代码是

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 是一个数组列表,其中每个索引都是一个 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 .

这样做通常是个好主意,因为较新的设备似乎正朝着荒谬的像素数方向发展。一款在软件中执行所有渲染的全屏游戏将在 2560x1440 显示器上挣扎,并且在 4K 下表现不佳。将游戏“限制”为 1080p 并让显示缩放器完成繁重的工作应该会有所帮助。根据游戏的性质,您可以将分辨率设置得更低,而不会明显降低质量。

要尝试的另一件事是消除 drawBitmap() 调用,检查您的计时,然后恢复它并消除 drawCircle() 调用,看看是否有一个或另一个正在消耗大部分时间。

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

关于Android:低 FPS 在表面 View 中绘制许多位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30451466/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com