Oh look the installer runs at 260+ fps now

This commit is contained in:
SerpentSpirale 2022-03-20 17:50:49 +01:00 committed by Boulay Mathias
parent 8c7bba530e
commit d8482499a3
4 changed files with 78 additions and 125 deletions

View File

@ -5,17 +5,18 @@ import android.graphics.*;
import android.text.*;
import android.util.*;
import android.view.*;
import android.widget.RelativeLayout;
import java.util.*;
import net.kdt.pojavlaunch.utils.*;
import org.lwjgl.glfw.*;
public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {
public static final int AWT_CANVAS_WIDTH = 600;
public static final int AWT_CANVAS_HEIGHT = 420;
private final int MAX_SIZE = 100;
private final double NANOS = 1000000000.0;
private int mScaleFactor;
private int[] mScales;
private int mWidth, mHeight;
private boolean mIsDestroyed = false;
private final TextPaint mFpsPaint;
@ -35,16 +36,19 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex
mFpsPaint = new TextPaint();
mFpsPaint.setColor(Color.WHITE);
mFpsPaint.setTextSize(20);
setSurfaceTextureListener(this);
initScaleFactors();
post(this::refreshSize);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture texture, int w, int h) {
getSurfaceTexture().setDefaultBufferSize(AWT_CANVAS_WIDTH, AWT_CANVAS_HEIGHT);
mWidth = w;
mHeight = h;
mIsDestroyed = false;
new Thread(this, "AndroidAWTRenderer").start();
}
@ -57,12 +61,14 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int w, int h) {
getSurfaceTexture().setDefaultBufferSize(AWT_CANVAS_WIDTH, AWT_CANVAS_HEIGHT);
mWidth = w;
mHeight = h;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture texture) {
getSurfaceTexture().setDefaultBufferSize(AWT_CANVAS_WIDTH, AWT_CANVAS_HEIGHT);
}
@Override
@ -83,14 +89,12 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex
if (rgbArray != null) {
canvas.save();
canvas.scale(mScaleFactor, mScaleFactor);
canvas.translate(-mScales[0], -mScales[1]);
canvas.drawBitmap(rgbArray, 0, CallbackBridge.physicalWidth, 0, 0, CallbackBridge.physicalWidth, CallbackBridge.physicalHeight, true, null);
canvas.drawBitmap(rgbArray, 0, AWT_CANVAS_WIDTH, 0, 0, AWT_CANVAS_WIDTH, AWT_CANVAS_HEIGHT, true, null);
canvas.restore();
}
}
canvas.drawText("FPS: " + (Math.round(fps() * 10) / 10) + ", attached=" + mAttached + ", drawing=" + mDrawing, 50, 50, mFpsPaint);
canvas.drawText("FPS: " + (Math.round(fps() * 10) / 10) + ", attached=" + mAttached + ", drawing=" + mDrawing, 0, 20, mFpsPaint);
surface.unlockCanvasAndPost(canvas);
}
} catch (Throwable throwable) {
@ -99,31 +103,6 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex
surface.release();
}
/** Computes the scale to better fit the screen */
void initScaleFactors(){
initScaleFactors(0);
}
void initScaleFactors(int forcedScale){
//Could be optimized
if(forcedScale < 1) { //Auto scale
int minDimension = Math.min(CallbackBridge.physicalHeight, CallbackBridge.physicalWidth);
mScaleFactor = Math.max(((3 * minDimension) / 1080) - 1, 1);
}else{
mScaleFactor = forcedScale;
}
int[] scales = new int[2]; //Left, Top
scales[0] = (CallbackBridge.physicalWidth/2);
scales[0] -= scales[0]/mScaleFactor;
scales[1] = (CallbackBridge.physicalHeight/2);
scales[1] -= scales[1]/mScaleFactor;
mScales = scales;
}
/** Calculates and returns frames per second */
private double fps() {
long lastTime = System.nanoTime();
@ -135,4 +114,18 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex
}
return difference > 0 ? mTimes.size() / difference : 0.0;
}
/** Make the view fit the proper aspect ratio of the surface */
private void refreshSize(){
ViewGroup.LayoutParams layoutParams = getLayoutParams();
if(getHeight() < getWidth()){
layoutParams.width = AWT_CANVAS_WIDTH * getHeight() / AWT_CANVAS_HEIGHT;
}else{
layoutParams.height = AWT_CANVAS_HEIGHT * getWidth() / AWT_CANVAS_WIDTH;
}
setLayoutParams(layoutParams);
}
}

View File

@ -14,8 +14,6 @@ import net.kdt.pojavlaunch.prefs.*;
import net.kdt.pojavlaunch.utils.*;
import org.lwjgl.glfw.*;
import static net.kdt.pojavlaunch.utils.MathUtils.map;
import com.kdt.LoggerView;
public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouchListener {
@ -26,12 +24,9 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
private LinearLayout mTouchPad;
private ImageView mMousePointerImageView;
private GestureDetector gestureDetector;
private GestureDetector mGestureDetector;
private boolean mSkipDetectMod, mIsVirtualMouseEnabled;
private int mScaleFactor;
private int[] mScaleFactors = initScaleFactors();
@SuppressLint("ClickableViewAccessibility")
@Override
@ -45,7 +40,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
mLoggerView = findViewById(R.id.launcherLoggerView);
mMousePointerImageView = findViewById(R.id.main_mouse_pointer);
mTextureView = findViewById(R.id.installmod_surfaceview);
gestureDetector = new GestureDetector(this, new SingleTapConfirm());
mGestureDetector = new GestureDetector(this, new SingleTapConfirm());
mTouchPad.setFocusable(false);
mTouchPad.setVisibility(View.GONE);
@ -79,7 +74,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
mouseX = mMousePointerImageView.getX();
mouseY = mMousePointerImageView.getY();
if (gestureDetector.onTouchEvent(event)) {
if (mGestureDetector.onTouchEvent(event)) {
sendScaledMousePosition(mouseX,mouseY);
AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON1_DOWN_MASK);
} else {
@ -99,7 +94,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
mTextureView.setOnTouchListener((v, event) -> {
float x = event.getX();
float y = event.getY();
if (gestureDetector.onTouchEvent(event)) {
if (mGestureDetector.onTouchEvent(event)) {
sendScaledMousePosition(x, y);
AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON1_DOWN_MASK);
return true;
@ -208,8 +203,14 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
}
void sendScaledMousePosition(float x, float y){
AWTInputBridge.sendMousePos((int) map(x,0,CallbackBridge.physicalWidth, mScaleFactors[0], mScaleFactors[2]),
(int) map(y,0,CallbackBridge.physicalHeight, mScaleFactors[1], mScaleFactors[3]));
// Clamp positions, then scale them
x = androidx.core.math.MathUtils.clamp(x, mTextureView.getX(), mTextureView.getX() + mTextureView.getWidth());
y = androidx.core.math.MathUtils.clamp(y, mTextureView.getY(), mTextureView.getY() + mTextureView.getHeight());
AWTInputBridge.sendMousePos(
(int) MathUtils.map(x, mTextureView.getX(), mTextureView.getX() + mTextureView.getWidth(), 0, AWTCanvasView.AWT_CANVAS_WIDTH),
(int) MathUtils.map(y, mTextureView.getY(), mTextureView.getY() + mTextureView.getHeight(), 0, AWTCanvasView.AWT_CANVAS_HEIGHT)
);
}
public void forceClose(View v) {
@ -269,49 +270,6 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
int[] initScaleFactors(){
return initScaleFactors(true);
}
int[] initScaleFactors(boolean autoScale){
//Could be optimized
if(autoScale) { //Auto scale
int minDimension = Math.min(CallbackBridge.physicalHeight, CallbackBridge.physicalWidth);
mScaleFactor = Math.max(((3 * minDimension) / 1080) - 1, 1);
}
int[] scales = new int[4]; //Left, Top, Right, Bottom
scales[0] = (CallbackBridge.physicalWidth/2);
scales[0] -= scales[0]/ mScaleFactor;
scales[1] = (CallbackBridge.physicalHeight/2);
scales[1] -= scales[1]/ mScaleFactor;
scales[2] = (CallbackBridge.physicalWidth/2);
scales[2] += scales[2]/ mScaleFactor;
scales[3] = (CallbackBridge.physicalHeight/2);
scales[3] += scales[3]/ mScaleFactor;
return scales;
}
public void scaleDown(View view) {
mScaleFactor = Math.max(mScaleFactor - 1, 1);
mScaleFactors = initScaleFactors(false);
mTextureView.initScaleFactors(mScaleFactor);
sendScaledMousePosition(mMousePointerImageView.getX(), mMousePointerImageView.getY());
}
public void scaleUp(View view) {
mScaleFactor = Math.min(mScaleFactor + 1, 6);
mScaleFactors = initScaleFactors(false);
mTextureView.initScaleFactors(mScaleFactor);
sendScaledMousePosition(mMousePointerImageView.getX(), mMousePointerImageView.getY());
}
private int doCustomInstall(File modFile, String javaArgs) throws IOException {
mSkipDetectMod = true;
return launchJavaRuntime(modFile, javaArgs);

View File

@ -174,7 +174,7 @@ public final class Tools {
public static void getCacioJavaArgs(List<String> javaArgList, boolean isHeadless) {
javaArgList.add("-Djava.awt.headless="+isHeadless);
// Caciocavallo config AWT-enabled version
javaArgList.add("-Dcacio.managed.screensize=" + CallbackBridge.physicalWidth + "x" + CallbackBridge.physicalHeight);
javaArgList.add("-Dcacio.managed.screensize=" + AWTCanvasView.AWT_CANVAS_WIDTH + "x" + AWTCanvasView.AWT_CANVAS_HEIGHT);
// javaArgList.add("-Dcacio.font.fontmanager=net.java.openjdk.cacio.ctc.CTCFontManager");
javaArgList.add("-Dcacio.font.fontmanager=sun.awt.X11FontManager");
javaArgList.add("-Dcacio.font.fontscaler=sun.font.FreetypeFontScaler");

View File

@ -1,23 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<RelativeLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_width="match_parent">
android:background="#000000">
<net.kdt.pojavlaunch.AWTCanvasView
android:layout_height="match_parent"
android:id="@+id/installmod_surfaceview"
android:layout_width="match_parent"
android:id="@+id/installmod_surfaceview"/>
android:layout_height="match_parent"
android:foregroundGravity="bottom"
app:layout_constraintBottom_toBottomOf="@+id/main_touchpad"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/main_touchpad"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/main_mouse_pointer"
@ -35,67 +45,59 @@
android:background="@drawable/control_button"
android:onClick="forceClose"
android:text="@string/control_forceclose"
android:layout_marginEnd="2dp"/>
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/installmod_btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/installmod_btn2"
android:layout_marginTop="2dp"
android:background="@drawable/control_button"
android:onClick="openLogOutput"
android:text="@string/control_viewout"
android:layout_marginEnd="2dp"/>
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintRight_toLeftOf="@id/installmod_btn2"
app:layout_constraintTop_toBottomOf="@+id/installmod_btn2" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/installmod_btn3"
android:layout_marginTop="2dp"
android:background="@drawable/control_button"
android:onClick="toggleVirtualMouse"
android:text="@string/control_mouse"
android:layout_marginEnd="2dp"/>
<Button
android:id="@+id/installmod_scale_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginStart="2dp"
android:background="@drawable/control_button"
android:onClick="scaleDown"
android:text="@string/control_scaledown" />
<Button
android:id="@+id/installmod_scale_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:layout_toEndOf="@+id/installmod_scale_down"
android:background="@drawable/control_button"
android:onClick="scaleUp"
android:text="@string/control_scaleup" />
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintRight_toLeftOf="@id/installmod_btn3"
app:layout_constraintTop_toBottomOf="@+id/installmod_btn3" />
<Button
android:id="@+id/installmod_mouse_pri"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="2dp"
android:background="@drawable/control_button"
android:text="@string/control_primary"
android:layout_marginStart="2dp"/>
app:layout_constraintBottom_toTopOf="@+id/installmod_mouse_sec"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:layout_height="wrap_content"
android:id="@+id/installmod_mouse_sec"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@id/installmod_mouse_pri"
android:background="@drawable/control_button"
android:text="@string/control_secondary"
android:id="@+id/installmod_mouse_sec"
android:layout_toRightOf="@id/installmod_mouse_pri"
android:layout_alignParentBottom="true"
android:layout_marginStart="2dp"/>
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/installmod_mouse_pri"
app:layout_constraintStart_toStartOf="parent" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.kdt.LoggerView
android:id="@+id/launcherLoggerView"