Doble búfer cuando no se dibuja en OnPaint (): ¿por qué no funciona?

Estoy trabajando en una aplicación de dibujo vectorial simple en C # /. Net. El dibujo se realiza en un panel, pero no estoy usando el evento OnPaint () para todo, de hecho, OnPaint () incluso solo llama a otro método que realmente dibuja todo en el documento.

Intenté agregar doble búfer, pero cuando configuro DoubleBuffered en verdadero, el problema de parpadeo es aún peor. ¿Por qué es esto? Si quiero duplicar el control del búfer, ¿tengo que hacer todo mi dibujo en el evento OnPaint (), con el objeto Graphics proporcionado, en lugar de usar Panel.CreateGraphics () y luego dibujar para eso?

EDITAR: Este es el código básico que estoy 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);
}

La idea general es que las dos variables, ScaleFactor y Offset, se refieren al nivel de zoom y al nivel de panorámica en la interfaz de usuario. g es un objeto de gráficos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta