我为自己的游戏做了一些简单的基准测试。
事实证明我在updateGame()函数中花费的平均时间是:1-4毫秒
我的renderGame()函数花费的平均时间:15-17ms。
我使用SurfaceView和脏矩形。然而,脏矩形的大小似乎并没有影响奇怪的性能。
无论如何,renderGame()函数是这里的瓶颈,让我无法达到我需要的45-60 FPS。 我也使用三星S4 Mini,所以它是一款相当强大的手机,所以底端手机会更糟糕。
我的渲染功能如下所示:
@Override
public void render( double interpolation, Canvas canvas )
{
canvas.drawColor( Color.TRANSPARENT, PorterDuff.Mode.CLEAR );
canvas.drawBitmap( background, null, backgroundRect, null );
for ( int i = 0; i < theGameEdges.length; i++ )
{
theGameEdges[ i ].draw( canvas );
}
for ( int i = 0; i < obstacles.length; i++ )
{
obstacles[ i ].draw( canvas );
}
for ( int i = 0; i < holes.length; i++ )
{
holes[ i ].draw( canvas );
}
for ( int i = 0; i < goalFlags.length; i++ )
{
goalFlags[ i ].draw( canvas );
}
balls = level.getBallPositions();
for ( int i = 0; i < balls.length; i++ )
{
SilverBallRect[ i ].set(
balls[ i ].X + theOffsetX,
balls[ i ].Y + theOffsetTopY,
balls[ i ].X + ballSize + theOffsetX,
balls[ i ].Y + ballSize + theOffsetTopY
);
canvas.drawBitmap( SilverBall, null, SilverBallRect[ i ], null );
}
stringBuilder.setLength( 0 );
stringBuilder.append( timeString ).append( engine.getTimeSeconds() );
canvas.drawText( stringBuilder, 0, stringBuilder.length(), textX, textY, theTextPaint );
}
答案 0 :(得分:1)
脏脏矩形的大小影响更新的屏幕部分,而不是渲染的部分 - 它不是剪辑矩形。如果在脏矩形之外绘制像素,它们将被绘制,但在将前一帧复制到外部区域时不会被覆盖。
为了提高性能,您的代码只需要触摸rect内的像素。否则,矩形之外的区域将被有效地绘制两次。
对SurfaceView表面的画布渲染永远不会硬件加速。几乎可以肯定,使用OpenGL ES可以提高性能。您还需要学习OpenGL ES,这不是一件容易的事。
如果您需要hardware-accelerated Canvas rendering,则可以使用自定义视图而不是SurfaceView曲面。
更新:对于软件渲染来说,保持更新的像素数较低非常重要。考虑以较低的分辨率和升级进行渲染。请参阅this article和&#34;硬件缩放器练习器&#34;在Grafika。
有关Android图形架构的更多详细信息,请参阅this document。