gpt4 book ai didi

android - 背景图像绘制时间太长(Canvas)生涩的 Sprite ......?

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:10 26 4
gpt4 key购买 nike

嘿,我正处于我一直在开发的应用程序的十字路口。

这是一款游戏,而且是一款“街机/ Action ”游戏,但我使用 Surfaceview 而不是 Open GL 对其进行了编码(由于游戏与原始设计发生了巨大变化,结果就是这样)。

我发现自己被性能问题困扰,甚至在游戏中也没有,但只是在第一个 Activity 中,它是一个动画菜单(全屏背景,大约有 8 个 Sprite 在屏幕上 float )。

即使使用这么少量的 Sprite ,我也无法获得完美流畅的运动。它们平稳地移动了一会儿,然后瞬间变得“断断续续”或“不稳定”。

我注意到(据我所知)绘制背景(预缩放图像)大约需要 7 到 8 毫秒。这合理吗?我尝试了不同的绘图方式,例如:

    canvas.drawBitmap(scaledBackground, 0, 0, null);

上面的代码产生的结果大致相同:

    canvas.drawBitmap(scaledBackground, null, screen, null);

但是,如果我将我的支架更改为:

    getHolder().setFormat(PixelFormat.RGBA_8888);

位图的绘制速度高达 13 毫秒(我假设是因为它必须转换为 RGB_8888 格式。

奇怪的是,渲染和逻辑以非常稳定的 30fps 移动,它不会丢失任何帧,并且在运行时不会发生垃圾收集。

我已经尝试了几乎所有我能想到的方法来让我的 Sprite 顺利移动

我最近在我的游戏循环中加入了插值:

    float interpolation = (float)(System.nanoTime() + skipTicks - nextGameTick)
/ (float)(skipTicks);

然后我将其传递到我的 draw() 方法中:

    onDraw(interpolate)

我在这方面取得了一些成功,它确实帮助解决了问题,但我对结果仍然不满意。

任何人都可以给我任何关于可能减少绘制位图所花费的时间的最终提示或关于可能导致此问题的任何其他提示,或者您认为这只是 Surfaceview 无法完成任务的情况,因此,我应该放弃应用程序并重新开始使用 Open GL 吗?

这是我的主要游戏循环:

int TICKS_PER_SECOND = 30;
int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
int MAX_FRAMESKIP = 10;

long next_game_tick = GetTickCount();
int loops;

bool game_is_running = true;
while( game_is_running ) {

loops = 0;
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
update_game();

next_game_tick += SKIP_TICKS;
loops++;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
display_game( interpolation );
}

谢谢

最佳答案

您不应该使用 Canvas 绘制快速 Sprite ,尤其是在绘制全屏图像时。时间太长了,我的经验告诉你。我相信 Canvas 没有硬件加速,这是您永远无法从中获得良好性能的主要原因。当屏幕上大约有 15 个时,即使是简单的 Sprite 也开始变慢。切换到 OpenGL,进行正交投影,并为每个 Sprite 制作一个带纹理的四边形。相信我,我做到了,这是值得的。

编辑:实际上,OpenGL 方法是使用 GLSurfaceView 而不是 SurfaceView。您创建自己的类,从它派生,实现 surfaceCreated、surfaceDestroyed 和 surfaceChanged,然后您也从 Renderer 派生并连接两者。 Renderer 处理一个 onDraw() 函数,这是将要渲染的内容,GLSurfaceView 管理您将如何渲染(位深度、渲染模式等)

关于android - 背景图像绘制时间太长(Canvas)生涩的 Sprite ......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057132/

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