-1

この稲妻は、常に稲妻を追加および削除しているため、ゲームのパフォーマンスに大きな影響を与えています。また、各稲妻のストライクは、次を使用する 3 つのアンチエイリアス行で構成されています。

void ccDrawSmoothLine(CGPoint pos1, CGPoint pos2, float width)
{
    GLfloat lineVertices[12], curc[4];
    GLint   ir, ig, ib, ia;
    CGPoint dir, tan;

    // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
    // Needed states: GL_VERTEX_ARRAY,
    // Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    //glEnable(GL_LINE_SMOOTH);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    pos1.x *= CC_CONTENT_SCALE_FACTOR();
    pos1.y *= CC_CONTENT_SCALE_FACTOR();
    pos2.x *= CC_CONTENT_SCALE_FACTOR();
    pos2.y *= CC_CONTENT_SCALE_FACTOR();
    width *= CC_CONTENT_SCALE_FACTOR();

    width = width*2;
    dir.x = pos2.x - pos1.x;
    dir.y = pos2.y - pos1.y;
    float len = sqrtf(dir.x*dir.x+dir.y*dir.y);
    if(len<0.00001)
        return;
    dir.x = dir.x/len;
    dir.y = dir.y/len;
    tan.x = -width*dir.y;
    tan.y = width*dir.x;

    lineVertices[0] = pos1.x + tan.x;
    lineVertices[1] = pos1.y + tan.y;
    lineVertices[2] = pos2.x + tan.x;
    lineVertices[3] = pos2.y + tan.y;
    lineVertices[4] = pos1.x;
    lineVertices[5] = pos1.y;
    lineVertices[6] = pos2.x;
    lineVertices[7] = pos2.y;
    lineVertices[8] = pos1.x - tan.x;
    lineVertices[9] = pos1.y - tan.y;
    lineVertices[10] = pos2.x - tan.x;
    lineVertices[11] = pos2.y - tan.y;

    glGetFloatv(GL_CURRENT_COLOR,curc);
    ir = 255.0*curc[0];
    ig = 255.0*curc[1];
    ib = 255.0*curc[2];
    ia = 255.0*curc[3];

    const GLubyte lineColors[] = {
        ir, ig, ib, 0,
        ir, ig, ib, 0,
        ir, ig, ib, ia,
        ir, ig, ib, ia,
        ir, ig, ib, 0,
        ir, ig, ib, 0,
    };

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, lineVertices);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, lineColors);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
    glDisableClientState(GL_COLOR_ARRAY);

    // restore default state
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);
}

FPS は約 40 に低下し、その後 60 に戻ります。ラインをテクスチャ マッピングすると、ゲームのパフォーマンスが向上する可能性があると読みました。

私はこれを数週間理解しようとしてきましたが、運がありません。誰かがこれで私を助けてくれますか?

これは私の現在の ccDrawLines と draw メソッドです

-(void) draw
{
    numPoints_ = 0;
    glColor4ub(_color.r, _color.g, _color.b, _opacity);

    if (_opacity != 255)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    drawLightning(_strikePoint2, _strikePoint, _displacement, _minDisplacement, _seed, lightningPoints_, &numPoints_);
    ccDrawLines(lightningPoints_, numPoints_, texture);

    if (_opacity != 255)
        glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);

    glColor4f(1.0, 1.0, 1.0, 1.0);
}

void ccDrawLines( CGPoint* points, uint numberOfPoints, CCTexture2D* texture )
{
    //layout of points [0] = origin, [1] = destination and so on

    ccVertex2F vertices[numberOfPoints];
    if (CC_CONTENT_SCALE_FACTOR() != 1 )
    {
        for (int i = 0; i < numberOfPoints; i++)
        {
            vertices[i].x = points[i].x * CC_CONTENT_SCALE_FACTOR();
            vertices[i].y= points[i].y * CC_CONTENT_SCALE_FACTOR();
        }
        glVertexPointer(2, GL_FLOAT, 0, vertices);
    }
    else glVertexPointer(2, GL_FLOAT, 0, points);

    ccTex2F texCoords[numberOfPoints];

    float width = texture.pixelsWide;
    float height = texture.pixelsHigh;

    if (CC_CONTENT_SCALE_FACTOR() != 1 )
    {
        for (int i = 0; i < numberOfPoints; i++)
        {
            texCoords[i].u = (vertices[i].x * CC_CONTENT_SCALE_FACTOR()) / width;
            texCoords[i].v = (vertices[i].y * CC_CONTENT_SCALE_FACTOR()) / height;
        }
        glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    }
    else glTexCoordPointer(2, GL_FLOAT, 0, points);

    // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
    // Needed states: GL_VERTEX_ARRAY,
    // Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
    glPushMatrix();
    glBindTexture(GL_TEXTURE_2D, [texture name]);
    glDisableClientState(GL_COLOR_ARRAY);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, numberOfPoints);

    // restore default state
    glEnableClientState(GL_COLOR_ARRAY);

    glPopMatrix();
}

テクスチャは、小さな青い点が付いた 32x32 の .png ファイルです。

ccDrawLines を見ると、線をテクスチャ マップするコードが追加されています。それに関する問題は、線のギャップ、複数の線が描かれていること、そして見た目がひどいことです.


編集: ラインをテクスチャ マップせず、ccDrawSmoothLine を使用することにしました。

私がしたことは、ゲームレイヤーの初期化で稲妻を割り当てることだけでした

lightningStrike_ = [Lightning lightningWithStrikePoint:ccp(-100, -100) strikePoint2:ccp(-100, -100)];
[self addChild:lightningStrike_ z:1];

次に、_strikePoint および _strikePoint2 プロパティを設定し、strikeRandom メソッドを呼び出すインスタンス メソッドを作成しました。

-(Lightning *)lightningStrike:(CGPoint)p end:(CGPoint)p2
{
    lightningStrike_.strikePoint = ccp(p.x, p.y);
    lightningStrike_.strikePoint2 = ccp(p2.x, p2.y);
    [lightningStrike_ strikeRandom];

    return lightningStrike_;
}

使用法:

[self lightningStrike:ccp(100, 100) end:ccp(100, 100)];

これにより、FPS の低下が修正されました。24 時間後、私は回答し、私自身の回答を受け入れます。

4

1 に答える 1

0

編集: ラインをテクスチャ マップせず、ccDrawSmoothLine を使用することにしました。

私がしたことは、ゲームレイヤーの初期化で稲妻を割り当てることだけでした

lightningStrike_ = [稲妻 lightningWithStrikePoint:ccp(-100, -100) attackPoint2:ccp(-100, -100)]; [self addChild:lightningStrike_ z:1];

次に、_strikePoint および _strikePoint2 プロパティを設定し、strikeRandom メソッドを呼び出すインスタンス メソッドを作成しました。

-(Lightning *)lightningStrike:(CGPoint)p end:(CGPoint)p2 { lightningStrike_.strikePoint = ccp(px, py); lightningStrike_.strikePoint2 = ccp(p2.x, p2.y); [lightningStrike_strikeRandom];

    lightningStrike_ を返します。}

使用法:

[自己雷:ccp(100, 100) end:ccp(100, 100)];

これにより、FPS の低下が修正されました。24 時間後、私は回答し、私自身の回答を受け入れます。

于 2012-05-16T12:20:39.960 に答える