On my retina MBP (10.8) I get 60fps for es2 and 44fps for sw. Are you running a newer version of MacOS?

                        ...jim

On 3/31/15 3:40 PM, Chris Newland wrote:
Hi Hervé,

That's a valid question :)

Probably because

a) All my non-UI graphics experience is with immediate-mode / raster systems

b) I'm interested in using JavaFX for particle effects / demoscene /
gaming so assumed (perhaps wrongly?) that scenegraph was not the way to go
for that due to the very large number of nodes.

Numbers for my Sierpinski filled triangle example:

System: 2011 iMac Core i7 3.4GHz / 20GB RAM / AMD Radeon HD 6970M 1024 MB

java -Dprism.order=es2 -cp target/classes/
com.chrisnewland.demofx.standalone.Sierpinski
fps: 1
fps: 23
fps: 18
fps: 25
fps: 18
fps: 23
fps: 23
fps: 19
fps: 25

java -Dprism.order=sw -cp target/classes/
com.chrisnewland.demofx.standalone.Sierpinski
fps: 1
fps: 54
fps: 60
fps: 60
fps: 60
fps: 60
fps: 60
fps: 60
fps: 60
fps: 60
fps: 60

There are never more than 2500 filled triangles on screen. JDK is 1.8.0_40

I would say there is a performance problem here? (or at least a need for
documentation so as to set expectations for gc.fillPolygon).

Best regards,

Chris




On Tue, March 31, 2015 22:00, Hervé Girod wrote:
Why don't you use Nodes rather than Canvas ?


Sent from my iPhone


On Mar 31, 2015, at 22:31, Chris Newland <cnewl...@chrisnewland.com>
wrote:


Hi Jim,


Thanks, that makes things much clearer.


I was surprised how much was going on under the hood of GraphicsContext
  and hoped it was just magic glue that gave the best of GPU
acceleration where available and immediate-mode-like simple rasterizing
where not.

I've managed to find an anomaly with GraphicsContext.fillPolygon where
the software pipeline achieves the full 60fps but ES2 can only manage
30-35fps. It uses lots of overlapping filled triangles so I expect
suffers from the problem you've described.

SSCCE:
https://github.com/chriswhocodes/DemoFX/blob/master/src/main/java/com/ch
risnewland/demofx/standalone/Sierpinski.java

Was full frame rate canvas drawing an expected use case for JavaFX or
would I be better off with Graphics2D?

Thanks,


Chris


On Mon, March 30, 2015 20:04, Jim Graham wrote:
Hi Chris,



drawLine() is a very simple primitive that can be optimized with a
GPU
shader.  It either looks like a (potentially rotated) rectangle or a
rounded rect - and we have optimized shaders for both cases.  A large
  number of drawLine() calls turns into simply accumulating a large
vertex list and uploading it to the GPU with an appropriate shader
which is very fast.

drawPolygon() is a very complex operation that involves things like:

- dealing with line joins between segments that don't exist for
drawLine() - dealing with only rendering common points of intersection
  once

To handle all of that complexity we have to involve a rasterizer that
  takes the entire collection of lines, analyzes the stroke attributes
and interactions and computes a coverage mask for each pixel in the
region. We do that in software currently for all pipelines.

For the ES2 pipeline Line.v.Poly is dominated by pure GPU vs CPU path
  rasterization.

For the SW pipeline, drawLine is a simplified case of drawPolygon and
so the overhead of lots of calls to drawLine() dominates its
performance.

I would expect ES2 to blow the SW pipeline out of the water with
drawLine() performance (as long as there are no additional rendering
primitives interspersed in the set of lines).

But, both should be on the same footing for the drawPolygon case.
Does
the ES2 pipeline compare similarly (hopefully better than) the SW
pipeline for the polygon case?

One thing I noticed is that we have no optimized case for drawLine()
on the SW pipeline.  It generates a path containing a single MOVETO
and LINETO and feeds it to the generalized path rasterizer when it
could instead compute the rounded/square rectangle and render it more
directly.  If we added that support then I'd expect the SW pipeline to
perform the set of drawLine calls faster than drawPolygon as well...

...jim



On 3/28/15 3:22 AM, Chris Newland wrote:


Hi Robert,



I've not filed a Jira yet as I was hoping to find time to
investigate thoroughly but when I saw your question I thought I'd
better add my findings.

I believe the issue is in the ES2Pipeline as if I run with
-Dprism.order=sw then strokePolygon outperforms the series of
strokeLine commands as expected:

java -cp target/DemoFX.jar -Dprism.order=sw
com.chrisnewland.demofx.DemoFXApplication -c 500 -m line Result:
44fps



java -cp target/DemoFX.jar -Dprism.order=sw
com.chrisnewland.demofx.DemoFXApplication -c 500 -m poly Result:
60fps



Will see if I can find the root cause as I've got plenty more
examples where ES2Pipeline performs horribly on my Mac which should
have no problem throwing around a few thousand polys.

I realise there's a *lot* of indirection involved in making JavaFX
support such a wide range of underlying graphics systems but I do
think there's a bug here.

Will file a Jira if I can contribute a bit more than "feels slow"
;)



Cheers,



Chris



On Sat, March 28, 2015 10:06, Robert Krüger wrote:


This is consistent with what I am observing. Is this something
that Oracle
is aware of? Looking at Jira, I don't see that anyone is working
on this:



https://javafx-jira.kenai.com/issues/?jql=status%20in%20(Open%2C%
20%2
2In%
20Progress%22%2C%20Reopened)%20AND%20labels%20in%20(macosx)%20%20A
ND%2
0la
bels%20in%20(performance)

Given that one of the One of the main reasons to use JFX for me
is to be able to develop with one code base for at least OSX and
Windows and
the official statement what JavaFX is for, i.e.

"JavaFX is a set of graphics and media packages that enables
developers to design, create, test, debug, and deploy rich client
applications that operate consistently across diverse platforms"

and the fact that this is clearly not the case currently (8u40)
as soon as I do something else than simple forms, I run into
performance/quality problems on the Mac, I am a bit unsure what
to make of all that. Is Mac OSX a second-class citizen as far as
dev resources are concerned?

Tobi and Chris, have you filed Jira Issues on Mac graphics
performance that can be tracked?

I will file an issue with a simple test case and hope for the
best.






On Fri, Mar 27, 2015 at 11:08 PM, Chris Newland
<cnewl...@chrisnewland.com>
wrote:




Possibly related:




I can reproduce a massive (90%) performance drop on OSX between
  drawing a wireframe polygon on a Canvas using a series of
gc.strokeLine(double x1, double y1, double x2, double y2)
commands versus using a single gc.strokePolygon(double[]
xPoints, double[] yPoints, int count) command.

Creating the polygons manually with strokeLine() is
significantly faster using the ES2Pipeline on OSX.

This is reproducible in a little GitHub JavaFX benchmarking
project I've
created: https://github.com/chriswhocodes/DemoFX




Build with ant




Run with:




# use strokeLine
./run.sh -c 5000 -m line
result: 60 (sixty) fps




# use strokePolygon
./run.sh -c 5000 -m poly
result: 6 (six) fps




System is 2011 iMac 27" / Mavericks / 3.4GHz Core i7 / 20GB RAM
/
Radeon
6970M 1024MB




Looking at the code paths in
javafx.scene.canvas.GraphicsContext:




gc.strokeLine() maps to writeOp4(x1, y1, x2, y2,
NGCanvas.STROKE_LINE)



gc.strokePolygon() maps to writePoly(xPoints, yPoints, nPoints,
  true, NGCanvas.STROKE_PATH) which involves significantly more
work with adding to and flushing a GrowableDataBuffer.

I've not had time to dig any deeper than this but it's surely a
bug when building a poly manually is 10x faster than using the
convenience method.

Cheers,




Chris




On Fri, March 27, 2015 21:26, Tobias Bley wrote:



In my opinion the whole graphics performance on MacOSX
isn’t good at all with JavaFX….


Am 27.03.2015 um 22:10 schrieb Robert Krüger
<krue...@lesspain.de>:





The bad full screen performance is without the arcs. It is
just one call to fillRect, two to strokeOval and one to
fillOval, that's all. I will build a simple test case and
file an issue.

On Fri, Mar 27, 2015 at 9:58 PM, Jim Graham
<james.gra...@oracle.com>
wrote:





Hi Robert,





Please file a Jira issue with a simple test case.  Arcs
are handled as a generalized shape rather than via a
predetermined shader, but it shouldn't be that slow.
Something else may
be going on.

Another test might be to replace the arcs with rectangles
or ellipses and see if the performance changes...

...jim






On 3/27/15 1:52 PM, Robert Krüger wrote:





Hi,





I have a super-simple animation implemented using
AnimationTimer
and Canvas where the canvas just performs a few draw
operations, i.e. fills the screen with a color and then
  draws and fills 2-3 circles and I have already
observed that each drawing operation I add, results in
significant CPU load (e.g. when I draw < 10 arcs in
addition to the circles, the CPU load goes up to 30-40%
on a Mac Book Pro
for a Canvas size of 600x600(!).



Now I tested the animation in full screen mode (only
with a few circles) and playback is unusable for a
serious application (very choppy). Is 2D canvas
performance known to be very bad on Mac or
am I doing something wrong? Are there workarounds for
this?

Thanks,





Robert



--
Robert Krüger
Managing Partner
Lesspain GmbH & Co. KG





www.lesspain-software.com


--
Robert Krüger
Managing Partner
Lesspain GmbH & Co. KG




www.lesspain-software.com





Reply via email to