Solved

Alternatives for LineTo() ?

Posted on 1997-03-25
2
330 Views
Last Modified: 2013-12-26
I am the author of an After Dark freeeware screensaver
module called 'The Swarm' which is a straightforward port of
the classic Unix 'xswarm' program. (You can go to
http://www.cp.tn.tudelft.nl/leo/kronto.html for some
screenshots of the module, or for downloading it).

The bees in the swarm are simply coloured line segments.
Every frame of the animation, I draw the bees into a GWorld,
I calculate the enclosing rectangle of the entire swarm, and
I blit that onto the real screen using CopyBits (after
blacking out the previous frame's rectangle first).

This approach yields acceptable performance for
not-too-large swarms, even on 68k machines. However, what
has always been bugging me about my implementation from the
very beginning, is that if I profile the code it turns out
that in a frame of the animation the most time is *not*
spend on the two CopyBits calls (as I had been expecting),
but rather on the LineTo calls used to draw the individual
bee line segments.

I find it hard to believe that drawing twenty or thirty line
segments into a GWorld would be that performance-intensive
(and it is not the function call overhead either, I've
checked that).

So, can anybody out there explain to me *why* LineTo is so
computation-intensive, or better yet: suggest an alternative
approach for drawing lines that might yield better results?
0
Comment
Question by:Leo Breebaart
2 Comments
 
LVL 2

Accepted Solution

by:
AdamS earned 100 total points
ID: 1291418
Using LineTo to draw the bees is like ..... is like......Im at loss for an analogy...

LineTo doesnt just put lines one the bitmap. It does other things. If you want to optimize your drawing  even more then write directly to the bitmap. You have the address of the bitmap.

You can use the following to write to B&W bitmaps:

void BitSet(Ptr bytePtr, long bitNum);
Boolean BitTst(Ptr bytePtr, long bitNum)

I used this for my application that put sampled sound onto a scope on the screen.

For color...its a bit more complicated but you can figure it out. Each pixel is the concatenation of the Red Green and Blue components (right aligned). Red is the most significant bits, blue is the least significant bits. Higher order bytes come first in the pixel data. The pixel data itself is stored in the baseAddr field of the PixMap.

Note, you can get all this information from the Quickdraw part of Think Reference.

Ok hows this for an analogy. Using LineTo to draw every piece of the bee is like breaking out a new roll toilet paper every time you want to wipe yourself.

0
 

Author Comment

by:Leo Breebaart
ID: 1291419
Adam's answer essentially boils down to: "implement your
own LineTo function which draws directly to the bitmap".
Fair enough, but I do think I would have appreciated a slightly more helpful answer than "for color its a bit more complicated but you can figure it out"...
Also, he didn't really answer the part of my question that
asked *why* LineTo is so slow. "It does other things", he says. Like WHAT??? Why doesn't Apple provide an optimized line-drawing
routine of their own? What's the bottleneck in LineTo? Won't I run into the same bottleneck if I naively start to implement
my own version?
With this in mind I have to say that although Adam's answer is useful as confirmation of what I already suspected, it's not *quite* as helpful an answer as I had been hoping for.
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
function returning CString in a regular win32 DLL 8 176
matchUp  challenge 9 105
How to convert MFC::CString to UTF8 wchar_t* 10 202
Thin secure Windows 10 5 93
Introduction: Displaying information on the statusbar.   Continuing from the third article about sudoku.   Open the project in visual studio. Status bar – let’s display the timestamp there.  We need to get the timestamp from the document s…
Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

785 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question