зеркало из https://github.com/mozilla/pluotsorbet.git
240 строки
6.6 KiB
Java
240 строки
6.6 KiB
Java
package benchmark;
|
|
|
|
import com.sun.cldchi.jvm.JVM;
|
|
|
|
import javax.microedition.lcdui.*;
|
|
import javax.microedition.lcdui.game.Sprite;
|
|
import javax.microedition.midlet.*;
|
|
|
|
public class GraphicsBench extends MIDlet {
|
|
interface TestInfo {
|
|
String getDescription();
|
|
void executeFrame(Graphics g, long numOps);
|
|
}
|
|
|
|
class TestCanvas extends Canvas implements Runnable {
|
|
TestCanvas(Display d) {
|
|
display = d;
|
|
|
|
Image img = Image.createImage(getWidth(), getHeight());
|
|
offscreenBuffer = img.getGraphics();
|
|
|
|
// NOTE: When adding new tests, append them to the end
|
|
// of this array
|
|
tests = new TestInfo[2];
|
|
tests[0] = new DrawRegionTransNoneCenter(getWidth(), getHeight());
|
|
tests[1] = new DrawStringBaselineCenter(getWidth(), getHeight());
|
|
|
|
currentTest = tests[0];
|
|
}
|
|
|
|
protected void paint(Graphics screenG) {
|
|
if (currentTest != null) {
|
|
if (isOffscreen) {
|
|
long frameStartTime = JVM.monotonicTimeMillis();
|
|
currentTest.executeFrame(offscreenBuffer, numOpsPerFrame);
|
|
lastFrameTime = JVM.monotonicTimeMillis() - frameStartTime;
|
|
} else {
|
|
long frameStartTime = JVM.monotonicTimeMillis();
|
|
currentTest.executeFrame(screenG, numOpsPerFrame);
|
|
lastFrameTime = JVM.monotonicTimeMillis() - frameStartTime;
|
|
}
|
|
}
|
|
}
|
|
|
|
void startNextTest() {
|
|
if (isOffscreen) {
|
|
isOffscreen = false;
|
|
if (nextTestIndex < tests.length) {
|
|
currentTest = tests[nextTestIndex];
|
|
System.out.println(currentTest.getDescription());
|
|
nextTestIndex++;
|
|
} else {
|
|
System.out.println("DONE");
|
|
return;
|
|
}
|
|
} else {
|
|
isOffscreen = true;
|
|
System.out.println("Offscreen " + currentTest.getDescription());
|
|
}
|
|
|
|
repaint();
|
|
display.callSerially(this);
|
|
}
|
|
|
|
protected void showNotify() {
|
|
startNextTest();
|
|
}
|
|
|
|
public void run() {
|
|
totalFrameTime += lastFrameTime;
|
|
numSamples++;
|
|
if (numSamples < targetSamples) {
|
|
repaint();
|
|
display.callSerially(this);
|
|
return;
|
|
}
|
|
|
|
avgFrameTime = (totalFrameTime * 1000) / numSamples;
|
|
System.out.println("\tOps per second: " + ((numOpsPerFrame * 1000000) / avgFrameTime));
|
|
numSamples = 0;
|
|
totalFrameTime = 0;
|
|
|
|
startNextTest();
|
|
}
|
|
|
|
private final long targetSamples = 240;
|
|
private final long numOpsPerFrame = 500;
|
|
private long lastFrameTime = 0;
|
|
private long totalFrameTime = 0;
|
|
private long avgFrameTime = 0;
|
|
private long numSamples = 0;
|
|
private TestInfo[] tests;
|
|
private TestInfo currentTest;
|
|
private int nextTestIndex = 0;
|
|
private Display display;
|
|
private Graphics offscreenBuffer;
|
|
private boolean isOffscreen = true;
|
|
}
|
|
|
|
public void startApp() {
|
|
Display d = Display.getDisplay(this);
|
|
TestCanvas test = new TestCanvas(d);
|
|
test.setFullScreenMode(true);
|
|
d.setCurrent(test);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Implement actual tests below
|
|
//
|
|
|
|
class DrawRegionTransNoneCenter implements TestInfo {
|
|
DrawRegionTransNoneCenter(int w, int h) {
|
|
width = w;
|
|
height = h;
|
|
|
|
int rectWidth = width / 2;
|
|
int rectHeight = height / 2;
|
|
|
|
srcImages = new Image[2];
|
|
|
|
srcImages[0] = Image.createImage(width, height);
|
|
Graphics srcG = srcImages[0].getGraphics();
|
|
srcG.setColor(255, 0, 0);
|
|
srcG.fillRect(0, 0, rectWidth, rectHeight);
|
|
srcG.setColor(0, 255, 0);
|
|
srcG.fillRect(rectWidth, 0, rectWidth, rectHeight);
|
|
srcG.setColor(0, 0, 255);
|
|
srcG.fillRect(rectWidth, rectHeight, rectWidth, rectHeight);
|
|
srcG.setColor(255, 255, 0);
|
|
srcG.fillRect(0, rectHeight, rectWidth, rectHeight);
|
|
|
|
|
|
srcImages[1] = Image.createImage(width, height);
|
|
Graphics src2G = srcImages[1].getGraphics();
|
|
src2G.setColor(0, 255, 255);
|
|
src2G.fillRect(0, 0, rectWidth, rectHeight);
|
|
src2G.setColor(255, 255, 255);
|
|
src2G.fillRect(rectWidth, 0, rectWidth, rectHeight);
|
|
src2G.setColor(0, 0, 0);
|
|
src2G.fillRect(rectWidth, rectHeight, rectWidth, rectHeight);
|
|
src2G.setColor(255, 0, 255);
|
|
src2G.fillRect(0, rectHeight, rectWidth, rectHeight);
|
|
}
|
|
|
|
public void executeFrame(Graphics g, long numOps) {
|
|
for (long j = 0; j < numOps; j++) {
|
|
g.drawRegion(srcImages[curImageIndex], 0, 0, width, height, Sprite.TRANS_NONE, width / 2, height / 2, Graphics.VCENTER|Graphics.HCENTER);
|
|
curImageIndex = (curImageIndex + 1) % srcImages.length;
|
|
}
|
|
curImageIndex = (curImageIndex + 1) % srcImages.length;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
|
|
private int i = 0;
|
|
private int width;
|
|
private int height;
|
|
private Image[] srcImages;
|
|
private int curImageIndex = 0;
|
|
private final String description = "Graphics.drawRegion TRANS_NONE centered";
|
|
}
|
|
|
|
class DrawStringBaselineCenter implements TestInfo {
|
|
DrawStringBaselineCenter(int w, int h) {
|
|
width = w;
|
|
height = h;
|
|
}
|
|
|
|
public void executeFrame(Graphics g, long numOps) {
|
|
for (int j = 0; j < numOps; j++) {
|
|
g.drawString(string, j%width, j%height, Graphics.BASELINE|Graphics.HCENTER);
|
|
}
|
|
}
|
|
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
|
|
private int width;
|
|
private int height;
|
|
private final String description = "Graphics.drawString baseline centered";
|
|
private final String string = "String string = new String(\"string\");";
|
|
}
|
|
|
|
//
|
|
// End impl of actual tests
|
|
//
|
|
|
|
public void pauseApp() {
|
|
}
|
|
|
|
public void destroyApp(boolean unconditional) {
|
|
}
|
|
|
|
// Future tests to consider:
|
|
//
|
|
// ImageDataFactory.createImmutableImageDecodeImage
|
|
// ImageDataFactory.createImmutableImageDataRegion
|
|
// ImageDataFactory.createImmutableImageDataCopy
|
|
// ImageDataFactory.createMutableImageData
|
|
// ImageDataFactory.createImmutableImageDecodeRGBImage
|
|
// ImageData.getRGB
|
|
// DirectUtils.setPixels
|
|
// DirectGraphicsImp.getPixels
|
|
// DirectGraphicsImp.drawPixels
|
|
// Graphics.render
|
|
// Graphics.renderRegion
|
|
// Graphics.drawSubstring
|
|
// Graphics.drawChars
|
|
// Graphics.drawChar
|
|
// Graphics.fillTriangle
|
|
// Graphics.drawRect
|
|
// Graphics.fillRect
|
|
// Graphics.drawRoundRect
|
|
// Graphics.fillRoundRect
|
|
// Graphics.drawArc
|
|
// Graphics.fillArc
|
|
// Graphics.drawLine
|
|
// Graphics.drawRGB
|
|
//
|
|
// Font.stringWidth
|
|
// Font.charWidth
|
|
// Font.charsWidth
|
|
// Font.substringWidth
|
|
//
|
|
// Graphics.resetGC
|
|
// Graphics.reset
|
|
// Graphics.copyArea
|
|
// Graphics.setDimensions
|
|
// Graphics.setClip
|
|
// Graphics.clipRect
|
|
// Graphics.drawRegion
|
|
// Graphics.drawImage
|
|
}
|
|
|