v0.4.2: various performance improvements to core classes

This commit is contained in:
Evan Debenham 2016-08-29 15:40:28 -04:00
parent 71c7c264ac
commit 926b02ce65
4 changed files with 31 additions and 42 deletions

View File

@ -47,14 +47,14 @@ public class Attribute {
} }
public void vertexPointer( int size, int stride, FloatBuffer ptr ) { public void vertexPointer( int size, int stride, FloatBuffer ptr ) {
GLES20.glVertexAttribPointer( location, size, GLES20.GL_FLOAT, false, stride * Float.SIZE / 8, ptr ); GLES20.glVertexAttribPointer( location, size, GLES20.GL_FLOAT, false, stride * 4, ptr );
} }
public void vertexBuffer( int size, int stride, int offset) { public void vertexBuffer( int size, int stride, int offset) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
GLES20.glVertexAttribPointer(location, size, GLES20.GL_FLOAT, false, stride * Float.SIZE / 8, offset * Float.SIZE / 8); GLES20.glVertexAttribPointer(location, size, GLES20.GL_FLOAT, false, stride * 4, offset * 4);
} else { } else {
FroyoGLES20Fix.glVertexAttribPointer(location, size, GLES20.GL_FLOAT, false, stride * Float.SIZE / 8, offset * Float.SIZE / 8); FroyoGLES20Fix.glVertexAttribPointer(location, size, GLES20.GL_FLOAT, false, stride * 4, offset * 4);
} }
} }
} }

View File

@ -44,14 +44,16 @@ public class Matrix {
} while (n > 0); } while (n > 0);
} }
private static float[] identity = new float[]{
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
public static void setIdentity( float[] m ) { public static void setIdentity( float[] m ) {
for (int i=0 ; i < 16 ; i++) { System.arraycopy(identity, 0, m, 0, identity.length);
m[i] = 0f;
}
for (int i = 0; i < 16; i += 5) {
m[i] = 1f;
}
} }
public static void rotate( float[] m, float a ) { public static void rotate( float[] m, float a ) {

View File

@ -28,8 +28,6 @@ import java.util.Arrays;
public class Uniform { public class Uniform {
private int location; private int location;
private float[] prevVal = new float[4];
public Uniform(int location) { public Uniform(int location) {
this.location = location; this.location = location;
@ -56,16 +54,6 @@ public class Uniform {
} }
public void value4f(float v1, float v2, float v3, float v4) { public void value4f(float v1, float v2, float v3, float v4) {
if (v1 == prevVal[0] &&
v2 == prevVal[1] &&
v3 == prevVal[2] &&
v4 == prevVal[3])
return;
prevVal[0] = v1;
prevVal[1] = v2;
prevVal[2] = v3;
prevVal[3] = v4;
GLES20.glUniform4f(location, v1, v2, v3, v4); GLES20.glUniform4f(location, v1, v2, v3, v4);
} }
@ -74,10 +62,6 @@ public class Uniform {
} }
public void valueM4(float[] value) { public void valueM4(float[] value) {
if (Arrays.equals(prevVal, value))
return;
System.arraycopy(value, 0, prevVal, 0, 4);
GLES20.glUniformMatrix4fv(location, 1, false, value, 0); GLES20.glUniformMatrix4fv(location, 1, false, value, 0);
} }
} }

View File

@ -79,18 +79,22 @@ public class Visual extends Gizmo {
public void draw() { public void draw() {
updateMatrix(); updateMatrix();
} }
//FIXME this is recomputing a lot of stuff every frame
// would be far better to redo this only when changes happen
protected void updateMatrix() { protected void updateMatrix() {
Matrix.setIdentity( matrix ); Matrix.setIdentity( matrix );
Matrix.translate( matrix, x, y ); Matrix.translate( matrix, x, y );
Matrix.translate( matrix, origin.x, origin.y ); if (origin.x != 0 || origin.y != 0)
Matrix.translate( matrix, origin.x, origin.y );
if (angle != 0) { if (angle != 0) {
Matrix.rotate( matrix, angle ); Matrix.rotate( matrix, angle );
} }
if (scale.x != 1 || scale.y != 1) { if (scale.x != 1 || scale.y != 1) {
Matrix.scale( matrix, scale.x, scale.y ); Matrix.scale( matrix, scale.x, scale.y );
} }
Matrix.translate( matrix, -origin.x, -origin.y ); if (origin.x != 0 || origin.y != 0)
Matrix.translate( matrix, -origin.x, -origin.y );
} }
public PointF point() { public PointF point() {
@ -128,20 +132,19 @@ public class Visual extends Gizmo {
} }
protected void updateMotion() { protected void updateMotion() {
float elapsed = Game.elapsed; if (acc.x != 0)
speed.x += acc.x * Game.elapsed;
float d = (GameMath.speed( speed.x, acc.x ) - speed.x) / 2; if (speed.x != 0)
speed.x += d; x += speed.x * Game.elapsed;
x += speed.x * elapsed;
speed.x += d; if (acc.y != 0)
speed.y += acc.y * Game.elapsed;
d = (GameMath.speed( speed.y, acc.y ) - speed.y) / 2; if (speed.y != 0)
speed.y += d; y += speed.y * Game.elapsed;
y += speed.y * elapsed;
speed.y += d; if (angularSpeed != 0)
angle += angularSpeed * Game.elapsed;
angle += angularSpeed * elapsed;
} }
public void alpha( float value ) { public void alpha( float value ) {