[OpenSCAD] Can you give me any rendering advice...?

Dan Zuras 3D threedee at nonabelian.com
Sun Dec 26 18:50:41 CET 2010


> Subject: Re: [OpenSCAD] Can you give me any rendering advice...?
> From: Marius Kintel <marius at kintel.net>
> Date: Sun, 26 Dec 2010 18:08:17 +0100
> Cc: openscad at rocklinux.org
> To: Dan Zuras 3D <threedee at nonabelian.com>
> 
> On Dec 26, 2010, at 17:05 PM, Dan Zuras 3D wrote:
> >
> > 	Thank you for looking into the problem.
> > 	How dramatically?
> >
> Very dramatically. Think everything freezes for minutes while rendering, =
> without progress output.

	This is consistent with my observations
	of the problem.  Perhaps one can profile
	the CGAL behavior & see where it spends
	an inordinate amount of time when this
	crops up.  Just a suggestion.

> 
> >> measure where we don't render this preview if the number of objects ==
> 
> >> after CSG normalization exceeds 1000. This could be made configurable =
> in =
> >
> > 	Will this mitigate the problem or merely
> > 	cause OpenSCAD to crap out when it happens?
> >
> It would cause a freeze while rendering. This freeze could be remedied =
> by rendering off-screen while keeping a progress bar around.

	Doesn't sound like much of an improvement.
	Does it have some diagnostic value perhaps?

> 
> >> Also, the CGAL library used for geometric evaluation (F6) is =
> extremely =
> >> slow. This is a long-standing issue which I'm hoping to be able to =
> >
> > 	I believe I (& others) have run into variations
> > 	of this issue before.  While I also have no idea
> > 	how it happens I am well aware that it does.
> >
> As you correctly pointed out, this happens because arbitrary precision =
> floats are being used, which is just over the top computationally =
> expensive.

	Also over the top memory expensive.

> This is combined with CGAL wanting to have a so-called 3D Nef polyhedron =
> around for CSG operations to be available, which means we have to =
> evaluate everything to a single resulting polyhedron, which ends up =
> gobbling up even more CPU time as well as memory.
> As you also pointed out, there might very well be memory leaks in there =
> somewhere, or rather temporary accumulation of memory in some evaluation =
> loop. Combined with the performance issues, these things are a bit hard =
> to catch and haven't been a priority. Again, the latest refactoring job =
> will make it possible to run a lot more of this functionality in =
> isolation, which gives some hope.

	I have a possible clue for this as well.

	I run on Ubuntu 10.04 on a 2 CPU system
	with 4GB of memory.  And I routinely run
	the system monitor when I render things
	to keep track of CPU & memory usage.

	When the problem crops up & it dies or
	I must kill the job & try something else,
	I notice that a significant amount of
	the leaked memory is left over.  That
	is, Ubuntu has lost track of it as well.

	I can recover it with a reboot but it
	suggests that at least part of the
	problem lies within the kernal & how it
	manages funny malloc & realloc calls.

	So, in this case at least, the problem
	may lie as much with the kernel as with
	the rendering code that caused it.

	BTW, I believe that the nature of the
	ill treated memory calls are pointers
	that are bad enough to cause writes on
	the page link data.  This would cause
	both CGAL & the kernel to drop those
	pages from their free lists.  Bad all
	around.

> 
> CGAL is, in my experience, not stable when using normal or double =
> precision floating point numbers, so we'd have to look elsewhere for CSG =
> evaluation.

	I believe this instability may be due to
	some ill formed interpretation of the
	issue of when two points are the same
	point.  As we are rendering images in
	fields with merely thousands of pixels
	in them, I think a selectable epsilon
	that determines when 2 points are to be
	considered coincident would fix the
	problem.

	That is, one might have a (user changable)
	parameter such that if |x - y| < epsilon
	then x & y are to be considered as rendered
	to the same point.

	One need not change the values of x & y
	to some common value like (x + y)/2.  But
	just regard all points within that epsilon
	as being rendered to the same point.

	If one were to set the value of epsilon
	to something on the order of a pixel size
	many of the traditional rastering effects
	would start to happen.  But if one were to
	set it to something on the order of 1/100th
	or 1/1000the of a pixel, I suspect everything
	would be OK.

	And at ~1000 pixels on a screen & ~1/1000th
	of a pixel for the epsilon, something like
	~20 bits are needed.  This is far exceeded
	by the 53 bits of precision that a double
	precision number carries.  Even in the most
	extraordinary chains of roundoff error, two
	originally identical points will still be
	within such an epsilon when rendered.  And
	two points distinct enough to see will be
	easily outside that epsilon.

	It has been years since I wrote any graphics
	code of my own & this approach may be naive
	by modern standards but it seems a simple
	enough cure to me.

	If, perhaps, greatly different from what is
	currently being done.

> Unfortunately, in the world of geometric evaluation of CSG in 3D, this =
> appears to be a common issue, and I'd appreciate pointers to and =
> experience with other libraries which could help improving this. As an =
> intermediate resort, I've been thinking about using or implementing a =
> faster algorithm, and rather fall back to CGAL whenever that one fails. =
> It would naturally have to fail in a predictable and detectable fashion.
> 
>  -Marius

	An algorithm that makes far less use of its
	memory resources would automatically get
	faster even if somewhat more expensive
	computationally.

	It is a reasonable place to start.

	Yours,

				Dan


More information about the OpenSCAD mailing list