Re: RFC Speeding up graphics

From: Dom Lachowicz (domlachowicz_at_yahoo.com)
Date: Fri Dec 12 2003 - 17:04:31 EST

  • Next message: msevior_at_physics.unimelb.edu.au: "Re: RFC Speeding up graphics"

    Hi Hub,

    I've suggested #1 before when talking with Phearbear
    on IRC. I think that he even started on some code too.
    IMO, we need something like:

    /* only invoked from a "helper class" described below
    */
    private void GR_Graphics::beginDraw();
    private void GR_Graphics::endDraw();

    /* implemented in platform-specific classes */
    virtual void GR_Graphics::_beginDraw() = 0;
    virtual void GR_Graphics::_endDraw() = 0;

    These should have an integer count so that they can be
    invoked "recursively", but the actual drawing won't
    happen until the last "endDraw()" which will commit
    the operation.

    Further, I think that we need a "GR_GraphicsLocker"
    class. Its purpose is to manage calling beginDraw()
    and endDraw() for us. For example:

    void FV_View::drawFoo ()
    {
      // beginDraw() implicitly called
      GR_GraphicsLocker lock (getGraphics());

      if (!needsToBeDrawn)
        return; // endDraw() implicitly called
      else {
         getGraphics()->drawLine ();
         ...
      }

      // endDraw() implicitly called
    }

    So yes, please do option #1. It will help us all out a
    lot.

    Best regards,
    Dom

    --- Hubert Figuiere <hfiguiere_at_teaser.fr> wrote:
    >
    > Hi,
    >
    > While porting AbiWord to MacOS X, I found out a few
    > performance
    > problems, mostly due to MacOS X Core Graphics layer,
    > but also to some
    > design issues in the GR_Graphics class and its use,
    > in the Abi
    > framework.
    >
    > The main problem is that for each graphics operation
    > we need:
    > -to setup a graphic context (costly)
    > -setup the graphic properties (line size, etc) and
    > clipping
    > -do our stuff
    > -reset everything
    > All of this, at least on MacOS X, but I'm sure that
    > it does too on
    > other platforms, it is *costly*. I actually found
    > myself some huge
    > bottleneck elsewhere to reduce the overhead, but
    > there is still too
    > much IMHO.
    >
    > I thought about a solution and found actually 2 that
    > would work for
    > any platform, with both pros and cons.
    >
    > Solution 1, probably the preferred one:
    > -Surround any drawing with startDraw()/endDraw()
    > calls (everywhere in
    > XP code)
    > -implement these 2 methods to do the setup pre and
    > post draw.
    > (GR_Graphics subclass)
    >
    > Pro:
    > -simple and efficient
    > -minimum platform work (initial can be empty
    > implementations)
    > Cons:
    > -need to track any drawing
    >
    > Solution 2, the smarter but more complex:
    > -Implement all the drawing operation in XP land
    > (GR_Graphics) to stack
    > them up in a graphic pipeline
    > -Implement in GR_Graphics::sync() culling of the
    > whole graphic pipeline
    > -Make sure we call sync() after each drawing (not
    > each operations)
    >
    > Pro:
    > -much smarter and elegant
    > -can be really efficient
    > Cons
    > -large platform rework effort
    > -complex and probably harder to debug
    >
    > What are your opinions ? If no one object, I'm going
    > to spend time on
    > solution 1 as I really need to speed up graphics.
    >
    >
    > Hub
    > --
    > AbiWord maintainer - Lille, France
    > http://www.figuiere.net/hub/
    > GPG fingerprint: 6C44 DB3E 0BF3 EAF5 B433 239A 5FEE
    > 05E6 A56E 15A3

    __________________________________
    Do you Yahoo!?
    Protect your identity with Yahoo! Mail AddressGuard
    http://antispam.yahoo.com/whatsnewfree



    This archive was generated by hypermail 2.1.4 : Fri Dec 12 2003 - 17:10:26 EST