Improve Performance
This commit is contained in:
parent
28dbb2eacd
commit
6951ebe620
@ -102,6 +102,8 @@ else()
|
|||||||
# text-input-box
|
# text-input-box
|
||||||
src/text-input-box/TextInputBox.cpp
|
src/text-input-box/TextInputBox.cpp
|
||||||
src/text-input-box/TextInputScreen.cpp
|
src/text-input-box/TextInputScreen.cpp
|
||||||
|
# fps
|
||||||
|
src/fps/fps.cpp
|
||||||
)
|
)
|
||||||
# Install Splashes
|
# Install Splashes
|
||||||
install(
|
install(
|
||||||
|
11
mods/include/mods/fps/fps.h
Normal file
11
mods/include/mods/fps/fps.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern double fps;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@ -24,6 +24,7 @@ void init_touch();
|
|||||||
void init_atlas();
|
void init_atlas();
|
||||||
void init_title_screen();
|
void init_title_screen();
|
||||||
void init_skin();
|
void init_skin();
|
||||||
|
void init_fps();
|
||||||
#endif
|
#endif
|
||||||
void init_textures();
|
void init_textures();
|
||||||
void init_creative();
|
void init_creative();
|
||||||
|
2
mods/src/fps/README.md
Normal file
2
mods/src/fps/README.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# `fps` Mod
|
||||||
|
This mod tracks the game's FPS.
|
54
mods/src/fps/fps.cpp
Normal file
54
mods/src/fps/fps.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include <libreborn/libreborn.h>
|
||||||
|
#include <symbols/minecraft.h>
|
||||||
|
|
||||||
|
#include <mods/init/init.h>
|
||||||
|
#include <mods/misc/misc.h>
|
||||||
|
#include <mods/feature/feature.h>
|
||||||
|
#include <mods/fps/fps.h>
|
||||||
|
|
||||||
|
// Track FPS
|
||||||
|
#define NANOSECONDS_IN_SECOND 1000000000ll
|
||||||
|
static long long int get_time() {
|
||||||
|
struct timespec ts;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
|
||||||
|
long long int a = (long long int) ts.tv_nsec;
|
||||||
|
long long int b = ((long long int) ts.tv_sec) * NANOSECONDS_IN_SECOND;
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
double fps = 0;
|
||||||
|
static void update_fps(__attribute__((unused)) Minecraft *minecraft) {
|
||||||
|
static bool is_last_update_time_set = false;
|
||||||
|
static long long int last_update_time;
|
||||||
|
long long int time = get_time();
|
||||||
|
if (is_last_update_time_set) {
|
||||||
|
long long int update_time = time - last_update_time;
|
||||||
|
fps = ((double) NANOSECONDS_IN_SECOND) / ((double) update_time);
|
||||||
|
} else {
|
||||||
|
is_last_update_time_set = true;
|
||||||
|
}
|
||||||
|
last_update_time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print FPS
|
||||||
|
static void print_fps(__attribute__((unused)) Minecraft *minecraft) {
|
||||||
|
// Track Ticks
|
||||||
|
static int ticks = 0;
|
||||||
|
ticks++;
|
||||||
|
if (ticks == 20) {
|
||||||
|
// One Second Has Passed, Reset
|
||||||
|
ticks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print
|
||||||
|
if (ticks == 0) {
|
||||||
|
INFO("FPS: %f", fps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init
|
||||||
|
void init_fps() {
|
||||||
|
if (feature_has("Track FPS", server_disabled)) {
|
||||||
|
misc_run_on_update(update_fps);
|
||||||
|
misc_run_on_tick(print_fps);
|
||||||
|
}
|
||||||
|
}
|
@ -23,6 +23,7 @@ __attribute__((constructor)) static void init(int argc, char *argv[]) {
|
|||||||
init_atlas();
|
init_atlas();
|
||||||
init_title_screen();
|
init_title_screen();
|
||||||
init_skin();
|
init_skin();
|
||||||
|
init_fps();
|
||||||
#endif
|
#endif
|
||||||
init_textures();
|
init_textures();
|
||||||
init_creative();
|
init_creative();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <streambuf>
|
#include <streambuf>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
@ -90,6 +91,38 @@ ItemInstance *Item_getCraftingRemainingItem_injection(Item *self, ItemInstance *
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sort Chunks
|
||||||
|
struct chunk_data {
|
||||||
|
Chunk *chunk;
|
||||||
|
float distance;
|
||||||
|
};
|
||||||
|
#define MAX_CHUNKS_SIZE 24336
|
||||||
|
chunk_data data[MAX_CHUNKS_SIZE];
|
||||||
|
static void sort_chunks(Chunk **chunks_begin, Chunk **chunks_end, DistanceChunkSorter sorter) {
|
||||||
|
// Calculate Distances
|
||||||
|
int chunks_size = chunks_end - chunks_begin;
|
||||||
|
if (chunks_size > MAX_CHUNKS_SIZE) {
|
||||||
|
IMPOSSIBLE();
|
||||||
|
}
|
||||||
|
for (int i = 0; i < chunks_size; i++) {
|
||||||
|
Chunk *chunk = chunks_begin[i];
|
||||||
|
float distance = Chunk_distanceToSqr(chunk, (Entity *) sorter.mob);
|
||||||
|
if ((1024.0 <= distance) && chunk->y < 0x40) {
|
||||||
|
distance = distance * 10.0;
|
||||||
|
}
|
||||||
|
data[i].chunk = chunk;
|
||||||
|
data[i].distance = distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort
|
||||||
|
std::sort(data, data + chunks_size, [](chunk_data &a, chunk_data &b) {
|
||||||
|
return a.distance < b.distance;
|
||||||
|
});
|
||||||
|
for (int i = 0; i < chunks_size; i++) {
|
||||||
|
chunks_begin[i] = data[i].chunk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
void _init_misc_cpp() {
|
void _init_misc_cpp() {
|
||||||
// Implement AppPlatform::readAssetFile So Translations Work
|
// Implement AppPlatform::readAssetFile So Translations Work
|
||||||
@ -106,4 +139,7 @@ void _init_misc_cpp() {
|
|||||||
// Implement crafting remainders
|
// Implement crafting remainders
|
||||||
overwrite_call((void *) 0x2e230, (void *) PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection);
|
overwrite_call((void *) 0x2e230, (void *) PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection);
|
||||||
overwrite((void *) Item_getCraftingRemainingItem_non_virtual, (void *) Item_getCraftingRemainingItem_injection);
|
overwrite((void *) Item_getCraftingRemainingItem_non_virtual, (void *) Item_getCraftingRemainingItem_injection);
|
||||||
|
|
||||||
|
// Replace 2011 std::sort With Optimized(TM) Code
|
||||||
|
overwrite((void *) 0x51fac, (void *) sort_chunks);
|
||||||
}
|
}
|
||||||
|
@ -51,3 +51,11 @@ Who is StevePi?
|
|||||||
Why must you hurt me?
|
Why must you hurt me?
|
||||||
Wow! Modded MCPI!
|
Wow! Modded MCPI!
|
||||||
mcpi-revival.github.io!
|
mcpi-revival.github.io!
|
||||||
|
discord.gg/aDqejQGMMy!
|
||||||
|
Buckets!
|
||||||
|
Caves!
|
||||||
|
Multiplayer!
|
||||||
|
Where's my sound?
|
||||||
|
Animated Lava!
|
||||||
|
Made with Ghidra!
|
||||||
|
Python API!
|
||||||
|
@ -78,6 +78,8 @@ set(SRC
|
|||||||
src/level/Dimension.def
|
src/level/Dimension.def
|
||||||
src/level/MultiPlayerLevel.def
|
src/level/MultiPlayerLevel.def
|
||||||
src/level/LevelSummary.def
|
src/level/LevelSummary.def
|
||||||
|
src/level/DistanceChunkSorter.def
|
||||||
|
src/level/Chunk.def
|
||||||
src/item/ItemRenderer.def
|
src/item/ItemRenderer.def
|
||||||
src/item/ItemInHandRenderer.def
|
src/item/ItemInHandRenderer.def
|
||||||
src/item/AuxDataTileItem.def
|
src/item/AuxDataTileItem.def
|
||||||
|
5
symbols/src/level/Chunk.def
Normal file
5
symbols/src/level/Chunk.def
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
property int x = 0x4;
|
||||||
|
property int y = 0x8;
|
||||||
|
property int z = 0xc;
|
||||||
|
|
||||||
|
method float distanceToSqr(Entity *entity) = 0x47ba0;
|
5
symbols/src/level/DistanceChunkSorter.def
Normal file
5
symbols/src/level/DistanceChunkSorter.def
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
size 0x4;
|
||||||
|
|
||||||
|
property Mob *mob = 0x0;
|
||||||
|
|
||||||
|
method bool compare(Chunk *param_1, Chunk *param_2) = 0x5118c; // Actually Called _ZN19DistanceChunkSorterclEPK5ChunkS2_
|
Loading…
Reference in New Issue
Block a user