1

私はゲーム(ここではベータ版)に取り組んでおり、私が持っている画像を使用して爆発を描いています。爆発が古くなるにつれて、サイズが大きくなり、なくなるまで透明になります。

私の問題は、これが私のコードのボトルネックのように見えることです。私は簡単に 60 FPS に到達しますが、爆発が発生し始めると、これは簡単に 30 FPS に低下する可能性があります。爆発のみを無効にすると、一定の 60FPS が得られます。

これらをより効果的にレンダリングするために OpenGL でできることはありますか?

それらをすべて順番に描画し、テクスチャと頂点を一度だけバインドします。

OpenGL 呼び出しを最適化するために知っておくべき一般的なことはありますか?

私のコードは Java で書かれています。この部分をネイティブ コードで書き直せば役に立ちますか?

すべての爆発を描画するメイン描画機能があります

public void draw() {
    GLES20.glUniform1i(GraphicsEngine.uEnableVortex, 0);
    for (Boom boom : mBooms) {
        boom.drawCloud();
    }
    mHugeBoom.drawCloud();
    GLES20.glUniform1i(GraphicsEngine.uEnableVortex, 1);

    // Prepare the data
    GLES20.glVertexAttribPointer(GraphicsEngine.aPositionHandle, 3,
            GLES20.GL_FLOAT, false, 12, mVerticesBuffer);
    GraphicsEngine.clearShape();

    // Disable textures
    GLES20.glUniform1i(GraphicsEngine.uEnableTextureHandle, 0);

    GLES20.glLineWidth(2.0f);

    for (Boom boom : mBooms) {
        boom.drawSparks();
    }
    mHugeBoom.drawSparks();
}

続いて「ブーム」

public void drawCloud(){
        if (mActive) {
            float pDone = mTotalTime / 600.0f / mSize;
            if (pDone <= 1.0f) {
                mBurst.setColor(mRGBA);
                mBurst.draw(mMMatrix);
            }
        }
    }

    public void drawSparks(){
        if (mActive) {
            for (Particle particle : mParticles) {
                particle.draw();
            }
        }
    }

実際の図面

public void draw(float[] MMatrix, boolean setColor) {
    // Prepare the triangle data
    GraphicsEngine.setShape(mShape);

    if (mTextureId != -1) {
        GraphicsEngine.bindTexture(mTextureId);
        if (mCustomTex) {
            GLES20.glVertexAttribPointer(GraphicsEngine.aTexCoordHandle, 2,
                    GLES20.GL_FLOAT, false, 8, mTextureBuffer);
            GLES20.glEnableVertexAttribArray(GraphicsEngine.aTexCoordHandle);
            GraphicsEngine.clearTexture();
        } else {
            GraphicsEngine.setTexture(mShape);
        }
    } else {
        GLES20.glUniform1i(GraphicsEngine.uEnableTextureHandle, 0);
    }

    // Apply a ModelView Projection transformation
    GLES20.glUniformMatrix4fv(GraphicsEngine.uMMatrixHandle, 1, false,
            MMatrix, 0);

    if (setColor)
        GLES20.glUniform4fv(GraphicsEngine.uColorHandle, 1, mRGBA, 0);

    GLES20.glDrawElements(GLES20.GL_TRIANGLES,
            GraphicsEngine.getNumIndicies(mShape),
            GLES20.GL_UNSIGNED_SHORT, GraphicsEngine.getIndicies(mShape));

}

読み込まれたテクスチャのリロードを防止するコード

public static void setShape(int i) {
    if (mState.shape != i) {
        GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT,
                false, 12, mShapes[i].vertices);
        mState.shape = i;
    }
}

public static void setTexture(int i) {
    if (mState.texture != i) {
        GLES20.glVertexAttribPointer(GraphicsEngine.aTexCoordHandle, 2,
                GLES20.GL_FLOAT, false, 8, mShapes[i].texture);
        mState.texture = i;
    }
}
4

0 に答える 0