Flimmern beim neuzeichnen trotz Offscreen-Bitmap ?



  • Da ich sehr viele ZeichenOperationen abzuarbeiten habe, habe ich mir eine Bimap als Membervariable angelegt, wo ich immer erst alles reinzeichne, bevor ich es auf die PaintBox zeichne. Trotzdem hat man mancmal so ein Flimmern bei der Ausgabe. Kann es sein, das das Bitmap (800*600) zu groß ist.

    void TfrmMain::DrawBackground()
    {
        if ( m_pBGLevelObject )
            m_pScreen->Canvas->Draw( 0, 0, RESOURCEMGR->GetResource( m_pBGLevelObject->GetAlias() ) );
        else
        {
            TRect rect;
            rect.Left = 0;
            rect.Top  = 0;
            rect.Right = 800;
            rect.Bottom = 600;
            m_pScreen->Canvas->Brush->Color = clBlack;
            m_pScreen->Canvas->FillRect( rect );
        }
    
        for( vecLevelObjectPtr::iterator it = m_vecLevelObjectContainer.begin(); it != m_vecLevelObjectContainer.end(); ++it )
        {
            CLevelObject *pObj = *it;
    
            if ( pObj != m_pLevelObject )
            {
                TRect quelle, ziel;
                quelle.Left = pObj->GetFrame() * pObj->GetWidth() - pObj->GetWidth();
                quelle.Top  = 0;
                quelle.Right = quelle.Left + pObj->GetWidth();
                quelle.Bottom = quelle.Top + pObj->GetHeight();
                ziel.Left = pObj->GetPosX();
                ziel.Top  = pObj->GetPosY();
                ziel.Right = pObj->GetPosX() + pObj->GetWidth();
                ziel.Bottom = pObj->GetPosY() + pObj->GetHeight();
                m_pScreen->Canvas->CopyRect( ziel, RESOURCEMGR->GetResource( pObj->GetAlias() )->Canvas , quelle );
            }
        }
    
    }
    
    //---------------------------------------------------------------------------
    
    //Zeichnen des Background Screens auf den Schirm
        LevelDisplay->Canvas->ClipRect.Left   = 0;
        LevelDisplay->Canvas->ClipRect.Top    = 0;
        LevelDisplay->Canvas->ClipRect.Right  = 800;
        LevelDisplay->Canvas->ClipRect.Bottom = 600;
    
        LevelDisplay->Canvas->Draw( 0, 0, m_pScreen );
    


  • Na klar ist das zu groß. Zeichne nur das, was neu ist.


Anmelden zum Antworten