Buffer duplo quando não está desenhando OnPaint (): por que não funciona?

Estou trabalhando em um aplicativo de desenho vetorial simples em C # / .net. O desenho é feito em um painel, mas não estou usando o evento OnPaint () para tudo isso - na verdade, o OnPaint () apenas chama outro método que realmente desenha tudo no documento.

Tentei adicionar buffer duplo, mas quando defino DoubleBuffered como true, o problema de flicker é ainda pior. Por que é isso? Se eu quiser fazer um buffer duplo do controle, preciso absolutamente fazer todo o meu desenho no evento OnPaint (), com o objeto Graphics fornecido, em vez de usar Panel.CreateGraphics () e depois desenhar para isso?

Edição: Este é o código básico que estou usando.

private void doc_Paint(object sender, PaintEventArgs e)
{
    g = doc.CreateGraphics();
    Render(ScaleFactor, Offset);
}    

private void Render(float ScaleFactor, PointF offset)
{
    foreach (Line X in Document.Lines) { DrawLine(X.PointA, X.PointB, X.Color, X.LineWidth); }
}
private void DrawLine(PointF A, PointF B, Color Color, float Width)
{
    Pen p = new Pen(Color, Width);
    PointF PA = new PointF(((A.X + Offset.X) * ScaleFactor), ((A.Y + Offset.Y) * ScaleFactor));
    PointF PB = new PointF(((B.X + Offset.X) * ScaleFactor), ((B.Y + Offset.Y) * ScaleFactor));
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    g.DrawLine(p, PA, PB);
}

A ideia geral é que as duas variáveis, ScaleFactor e Offset, se refiram ao nível de zoom e ao nível de panorâmica na interface do usuário. g é um objeto gráfico.

questionAnswers(2)

yourAnswerToTheQuestion