android - 切换到 OpenGL 会提高渲染速度吗?

标签 android opengl-es surfaceview

我已经为我的游戏做了一些简单的基准测试。

事实证明,我的 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 );
}
  1. 我可以通过使用 OpenGL 提高性能吗?
  2. 我可以在 View 中使用不同的层或其他东西来提高性能吗?不知道那会如何工作,因为它最终都是像素。但是……
  3. 关于性能的任何其他提示?

最佳答案

脏矩形的大小影响更新的屏幕部分,而不是渲染的部分——它不是剪辑矩形。如果您在脏矩形外绘制像素,它们将被绘制,但在将前一帧复制到外部区域时不会被覆盖。

为了提高性能,您的代码只需要接触矩形内的像素。否则矩形外的区域实际上被绘制了两次。

Canvas 渲染到 SurfaceView 表面永远不会硬件加速。您几乎肯定会通过使用 OpenGL ES 提高性能。您还需要学习 OpenGL ES,这并非易事。

如果你想要hardware-accelerated Canvas rendering ,您可以使用自定义 View 而不是 SurfaceView 表面。

更新:对于软件渲染来说,保持较低的更新像素数更为重要。考虑以较低的分辨率和放大进行渲染。参见 this articleGrafika 中的“硬件定标器练习器” .

有关 Android 图形架构的更多详细信息,请参阅 this document .

关于android - 切换到 OpenGL 会提高渲染速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26208466/

相关文章:

android - 在绘制框架中使用多个着色器程序进行渲染(在 OpenGL-ES 2.0 中)

android - 在 android 媒体记录器中预览显示

android视频,听到声音但没有视频

android - 在现有数据库内容上使用 ActiveAndroid

android - Unity SignReleaseBundle失败

ios - OpenGL ES FBO 缩放

opengl - 片段着色器中的 "Interleaved rendering"

android - 恢复到 SurfaceView 显示黑屏

交叉(错误符号)图像下的android按钮文本

android - 一种尺寸适合所有屏幕分辨率