嘿所有我正在处理我一直在努力的应用程序的十字路口.
这是一个游戏和一个“街机/动作”,但是我使用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 );
}
谢谢