嘿所有我正在处理我一直在努力的应用程序的十字路口.
这是一个游戏和一个“街机/动作”,但是我使用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 );
}
谢谢
最佳答案 您不应该使用Canvas绘制快速精灵,尤其是在绘制全屏图像时.太久了,我从经验告诉你.我相信Canvas不是硬件加速,这是你永远无法获得良好性能的主要原因.当屏幕上有~15时,即使是简单的精灵也开始变慢.切换到OpenGL,进行正交投影,并为每个Sprite制作纹理四边形.相信我,我做到了,值得付出努力.
编辑:实际上,OpenGL方法不是使用SurfaceView,而是使用GLSurfaceView.您可以创建自己的类,从中派生,实现surfaceCreated,surfaceDestroyed和surfaceChanged,然后从Renderer派生并连接它们.渲染器处理onDraw()函数,它将渲染,GLSurfaceView管理渲染方式(位深度,渲染模式等)