嘿,我正处于与我一直在努力的应用程序的十字路口。
这是一个游戏和一个'街机/动作',但是我使用Surfaceview而不是Open GL对它进行了编码(当游戏从原始设计中彻底改变时,它就是这样)。
我发现自己受到了性能问题的困扰,甚至在游戏中也没有,只是在第一个活动中,这是一个动画菜单(全屏幕背景,屏幕上漂浮着大约8个精灵)。
即使有这么少的精灵,我也无法获得完美平稳的动作。它们平稳地移动了一段时间,然后瞬间变得“波涛汹涌”或“生涩”。
我注意到(据我所知)背景(预先缩放的图像)需要大约7到8毫秒来绘制。这合理吗?我尝试过不同的绘图方式,例如:
canvas.drawBitmap(scaledBackground, 0, 0, null);
以上代码产生的结果与:
大致相同 canvas.drawBitmap(scaledBackground, null, screen, null);
但是,如果我将持有人改为:
getHolder().setFormat(PixelFormat.RGBA_8888);
位图的绘制最高可达13 MS(我假设因为它必须转换为RGB_8888格式。
奇怪的是渲染和逻辑以非常稳定的30fps移动,它不会丢弃任何帧,并且在运行时没有发生垃圾收集。
我已经尝试了几乎所有我能想到的事情来让我的精灵顺利移动
我最近在我的游戏循环中加入了插值:
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 );
}
由于
答案 0 :(得分:2)
您不应该使用Canvas绘制快速精灵,尤其是在绘制全屏图像时。太久了,我从经验告诉你。我相信Canvas不是硬件加速,这是你永远无法获得良好性能的主要原因。当屏幕上有~15时,即使是简单的精灵也开始变慢。切换到OpenGL,进行正交投影,并为每个Sprite制作纹理四边形。相信我,我做到了,这是值得的。
编辑:实际上,OpenGL的方式是使用GLSurfaceView而不是SurfaceView。您可以创建自己的类,从中派生,实现surfaceCreated,surfaceDestroyed和surfaceChanged,然后从Renderer派生并连接它们。渲染器处理onDraw()函数,它将渲染,GLSurfaceView管理渲染方式(位深度,渲染模式等)