diff --git a/README.md b/README.md index eb80c92..f0c3e63 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,43 @@ # DemoFX -Performance test platform for JavaFX. +Performance test platform for JavaFX. Effects can be layered and scheduled on a timeline. Videos of the demo effects: -Part I : https://www.youtube.com/watch?v=N1rihYA8c2M +* Part I : https://www.youtube.com/watch?v=N1rihYA8c2M +* Part II: https://www.youtube.com/watch?v=WZf0j4GUFYM +* Part III: https://www.youtube.com/watch?v=9jztG_l8qrk +* Christmas Demo 2017: https://youtu.be/npxfaHAAjBQ +* More Moiré: https://www.youtube.com/watch?v=B48aeSd379w -Part II: https://www.youtube.com/watch?v=WZf0j4GUFYM +Used to discover the best techniques for optimising JavaFX performance on the Raspberry Pi and Desktop. -Part III: https://www.youtube.com/watch?v=9jztG_l8qrk +## Compile -Christmas Demo 2017: https://youtu.be/npxfaHAAjBQ +### Gradle -More Moiré: https://www.youtube.com/watch?v=B48aeSd379w +``` +./gradlew jar +``` -Used to discover the best techniques for optimising JavaFX performance on the Raspberry Pi and Desktop. +### Maven -Compile with gradle: ``` -./gradlew jar +mvn clean package ``` -Run with: +## Run + +Get the latest OpenFX from [the Gluon website](https://gluonhq.com/products/javafx/), +e.g. in `/opt/javafx-sdk-16`. + +![](screenshots/colorbackground-stars.jpg) +![](screenshots/rainbow-bounce.jpg) + + ``` -./run.sh [options] +bash run_on_mac.sh [options] -e comma separated list of effects (See SimpleEffectFactory) -t run for t seconds @@ -47,9 +60,10 @@ rawplayer, raytrace, rings, rotations, sea, sheet, shift, sierpinski, sinelines, sprite3d, spritewave, squares, starfield, starfieldsprite, stars, texcube, texsphere, textbounce, textlabel, textlayers, textring, textwave, textwavesprite, tiles, triangles, tubestack, tunnel, twister, typetext, vumeter, wordsearch - ``` + Examples: + ``` # Default settings ./run.sh @@ -81,14 +95,17 @@ Examples: #More Moiré scripted demo ./run.sh -s moire -f true -w 1280 -h 720 ``` + In order to run in another java version, like java 9. JAVA_HOME should be set. In MAC: + ``` export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home ./run.sh ``` If the frame rate is not vsynced on Ubuntu then run: + ``` export _JAVA_OPTIONS="-Dquantum.multithreaded=false" ``` diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 97e84eb..0000000 --- a/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -apply plugin: 'java' - -targetCompatibility = '1.8' -sourceCompatibility = '1.8' - -jar { - manifest { - attributes 'Main-Class': 'com.chrisnewland.demofx.DemoFXApplication' - } -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 8c0fb64..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 1081cc3..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Apr 10 15:27:10 PDT 2013 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/gradlew b/gradlew deleted file mode 100755 index 91a7e26..0000000 --- a/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index aec9973..0000000 --- a/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..978e768 --- /dev/null +++ b/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + com.chrisnewland + demofx + 0.0.1 + + + UTF-8 + 11 + 11 + + + + + org.openjfx + javafx-controls + 11.0.2 + + + org.openjfx + javafx-media + 11.0.2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 11 + + + + + maven-assembly-plugin + 2.2.1 + + + jar-with-dependencies + + + + true + com.chrisnewland.demofx.DemoFXApplication + + + + + + make-assembly + package + + single + + + + + + + diff --git a/run.sh b/run.sh deleted file mode 100755 index ac305c6..0000000 --- a/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -export CLASSPATH=build/libs/DemoFX.jar - -# May need to set -Xmx1024m on low RAM machines -"$JAVA_HOME/bin/java" -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -Xloggc:demofx.gc.log -jar $CLASSPATH $@ diff --git a/run_on_mac.sh b/run_on_mac.sh new file mode 100755 index 0000000..268915a --- /dev/null +++ b/run_on_mac.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# May need to set -Xmx1024m on low RAM machines +java -XX:+PrintGCDetails -Xloggc:demofx.gc.log \ + -Djava.library.path=/opt/javafx-sdk-16/lib \ + -Dmonocle.platform.traceConfig=true \ + -Dmonocle.platform=EGL \ + -Dprism.verbose=true \ + -Djavafx.verbose=true \ + -p /opt/javafx-sdk-16/lib \ + --add-modules javafx.controls \ + -jar target/demofx-0.0.1-jar-with-dependencies.jar $@ \ No newline at end of file diff --git a/run_on_raspberrypi.sh b/run_on_raspberrypi.sh new file mode 100755 index 0000000..57a8758 --- /dev/null +++ b/run_on_raspberrypi.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# May need to set -Xmx1024m on low RAM machines +java -XX:+PrintGCDetails -Xloggc:demofx.gc.log \ + -Dmonocle.egl.lib=/opt/arm32fb-sdk/lib/libgluon_drm.so \ + -Djava.library.path=/opt/arm32fb-sdk/lib \ + -Dmonocle.platform.traceConfig=true \ + -Dmonocle.platform=EGL \ + -Dprism.verbose=true \ + -Djavafx.verbose=true \ + -p /opt/arm32fb-sdk/lib \ + --add-modules javafx.controls \ + -jar target/demofx-0.0.1-jar-with-dependencies.jar $@ diff --git a/screenshots/colorbackground-stars.jpg b/screenshots/colorbackground-stars.jpg new file mode 100644 index 0000000..a49561a Binary files /dev/null and b/screenshots/colorbackground-stars.jpg differ diff --git a/screenshots/rainbow-bounce.jpg b/screenshots/rainbow-bounce.jpg new file mode 100644 index 0000000..b1deb5e Binary files /dev/null and b/screenshots/rainbow-bounce.jpg differ diff --git a/src/main/java/com/chrisnewland/demofx/DemoFX.java b/src/main/java/com/chrisnewland/demofx/DemoFX.java index 801eff4..0a1f7c0 100755 --- a/src/main/java/com/chrisnewland/demofx/DemoFX.java +++ b/src/main/java/com/chrisnewland/demofx/DemoFX.java @@ -4,21 +4,15 @@ */ package com.chrisnewland.demofx; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import com.chrisnewland.demofx.effect.IEffect; -import com.chrisnewland.demofx.effect.effectfactory.*; +import com.chrisnewland.demofx.effect.effectfactory.IEffectFactory; +import com.chrisnewland.demofx.effect.effectfactory.SimpleEffectFactory; import com.chrisnewland.demofx.effect.effectfactory.demoscript.Christmas; import com.chrisnewland.demofx.effect.effectfactory.demoscript.DemoFX3; import com.chrisnewland.demofx.effect.effectfactory.demoscript.Moire; import com.chrisnewland.demofx.effect.spectral.ISpectralEffect; import com.chrisnewland.demofx.measurement.MeasurementChartBuilder; import com.chrisnewland.demofx.measurement.Measurements; - import javafx.animation.AnimationTimer; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -35,10 +29,15 @@ import javafx.scene.media.AudioSpectrumListener; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; +import javafx.stage.Stage; + +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.List; public class DemoFX implements AudioSpectrumListener, ISpectrumDataProvider { - private DemoConfig config; + private final DemoConfig config; private Label statsLabel; private Label fxLabel; @@ -51,7 +50,7 @@ public class DemoFX implements AudioSpectrumListener, ISpectrumDataProvider private static final int SAMPLES_PER_SECOND = 60; - private float[] spectrumData = new float[SPECTRUM_BANDS]; + private final float[] spectrumData = new float[SPECTRUM_BANDS]; private MediaPlayer mediaPlayer; @@ -358,11 +357,23 @@ else if (lookupBuilder.charAt(lookupBuilder.length() - 1) == ',') builder.append(lookupBuilder.toString()); + builder.append(" | Java: ").append(getJavaVersion()); + builder.append(" | JavaFX: ").append(getJavaFxVersion()); + return builder.toString(); } + private String getJavaVersion() { + return System.getProperty("java.version"); + } + + private String getJavaFxVersion() { + return System.getProperty("javafx.version"); + } + private String getUsedPipeline() { + /* try { // JDK9 forbidden: @@ -383,12 +394,13 @@ private String getUsedPipeline() { System.out.println("Ignored exception while getting PrismSettings.tryOrder"); } - + */ return "Unknown"; } @SuppressWarnings("unchecked") private String getPrismTryOrder() { + /* Object result = null; // Java 7 returns String[] @@ -428,6 +440,8 @@ else if (result instanceof List) } return builder.toString(); + */ + return "Unknown"; } @Override public int getBandCount() diff --git a/src/main/java/com/chrisnewland/demofx/effect/video/VideoStream.java b/src/main/java/com/chrisnewland/demofx/effect/video/VideoStream.java index 0ef9bd7..8c6d6e3 100644 --- a/src/main/java/com/chrisnewland/demofx/effect/video/VideoStream.java +++ b/src/main/java/com/chrisnewland/demofx/effect/video/VideoStream.java @@ -77,7 +77,7 @@ public void writeProcessedFrame(PixelWriter pixelWriter) // http://stackoverflow.com/questions/4041840/function-to-convert-ycbcr-to-rgb public synchronized void snapshotVideo() { - buf = player.impl_getLatestFrame(); + /*buf = player.impl_getLatestFrame(); if (buf != null) { @@ -86,7 +86,7 @@ public synchronized void snapshotVideo() buf.getBufferForPlane(VideoDataBuffer.PACKED_FORMAT_PLANE).asIntBuffer().get(rawFrameData); buf.releaseFrame(); - } + }*/ } public int[] getRawFrameData()