我已经为我的游戏做了一些简单的基准测试。
事实证明,我的 updateGame() 函数平均花费的时间是:1-4 毫秒
在我的 renderGame() 函数中花费的平均时间:15-17 毫秒。
我使用 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 );
}
- 我可以通过使用 OpenGL 提高性能吗?
- 我可以在 View 中使用不同的层或其他东西来提高性能吗?不知道那会如何工作,因为它最终都是像素。但是……
- 关于性能的任何其他提示?
最佳答案
脏矩形的大小影响更新的屏幕部分,而不是渲染的部分——它不是剪辑矩形。如果您在脏矩形外绘制像素,它们将被绘制,但在将前一帧复制到外部区域时不会被覆盖。
为了提高性能,您的代码只需要接触矩形内的像素。否则矩形外的区域实际上被绘制了两次。
Canvas 渲染到 SurfaceView 表面永远不会硬件加速。您几乎肯定会通过使用 OpenGL ES 提高性能。您还需要学习 OpenGL ES,这并非易事。
如果你想要hardware-accelerated Canvas rendering ,您可以使用自定义 View 而不是 SurfaceView 表面。
更新:对于软件渲染来说,保持较低的更新像素数更为重要。考虑以较低的分辨率和放大进行渲染。参见 this article和 Grafika 中的“硬件定标器练习器” .
有关 Android 图形架构的更多详细信息,请参阅 this document .
关于android - 切换到 OpenGL 会提高渲染速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26208466/