1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Optimise object_get_length to use entryCache (#3592)

This commit is contained in:
janisozaur
2016-05-14 02:15:17 +02:00
committed by Ted John
parent 81efb92d53
commit 7537c03d3f
3 changed files with 16 additions and 12 deletions

View File

@@ -1764,12 +1764,12 @@ void object_free_scenario_text()
}
}
int object_get_length(rct_object_entry *entry)
uintptr_t object_get_length(const rct_object_entry *entry)
{
return (int)object_get_next(entry) - (int)entry;
return (uintptr_t)object_get_next(entry) - (uintptr_t)entry;
}
rct_object_entry *object_get_next(rct_object_entry *entry)
rct_object_entry *object_get_next(const rct_object_entry *entry)
{
uint8 *pos = (uint8*)entry;

View File

@@ -115,10 +115,10 @@ int object_load_chunk(int groupIndex, rct_object_entry *entry, int* chunk_size);
void object_unload_chunk(rct_object_entry *entry);
int object_get_scenario_text(rct_object_entry *entry);
void object_free_scenario_text();
int object_get_length(rct_object_entry *entry);
uintptr_t object_get_length(const rct_object_entry *entry);
int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b);
int object_calculate_checksum(const rct_object_entry *entry, const uint8 *data, int dataLength);
rct_object_entry *object_get_next(rct_object_entry *entry);
rct_object_entry *object_get_next(const rct_object_entry *entry);
int write_object_file(SDL_RWops* rw, rct_object_entry* entry);
void reset_loaded_objects();
int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index);

View File

@@ -108,6 +108,11 @@ static void get_plugin_path(utf8 *outPath)
strcat(outPath, "plugin.dat");
}
static uintptr_t object_get_length_cached(const rct_object_entry **entryCache, const size_t index)
{
return (uintptr_t)entryCache[index + 1] - (uintptr_t)entryCache[index];
}
static rct_object_entry **_entryCache = NULL;
static int object_comparator(const void *left, const void *right)
@@ -123,14 +128,15 @@ static void object_list_sort()
{
rct_object_entry **objectBuffer, *newBuffer, *entry, *destEntry;
rct_object_filters *newFilters = NULL, *destFilter = NULL;
int numObjects, bufferSize, entrySize;
int numObjects, bufferSize;
size_t entrySize;
objectBuffer = &gInstalledObjects;
numObjects = gInstalledObjectsCount;
_entryCache = malloc(numObjects * sizeof(rct_object_entry*));
size_t *sortLUT = malloc(numObjects * sizeof(size_t));
_entryCache = malloc((numObjects + 1)* sizeof(rct_object_entry*));
size_t *sortLUT = malloc((numObjects + 1) * sizeof(size_t));
entry = *objectBuffer;
// This loop initialises entry cache, so it doesn't have to be called 17M
// times, but only a few thousand.
@@ -138,10 +144,8 @@ static void object_list_sort()
do {
_entryCache[i] = entry;
sortLUT[i] = i;
} while (++i < numObjects && (entry = object_get_next(entry)));
} while (i++ < numObjects && (entry = object_get_next(entry)));
qsort(sortLUT, numObjects, sizeof(size_t), object_comparator);
// Get size of last entry so buffer is allocated properly.
entry = object_get_next(entry);
// Get buffer size
bufferSize = (uintptr_t)entry - (uintptr_t)*objectBuffer;
@@ -156,7 +160,7 @@ static void object_list_sort()
// Copy over sorted objects
for (int i = 0; i < numObjects; i++) {
entrySize = object_get_length(_entryCache[sortLUT[i]]);
entrySize = object_get_length_cached((const rct_object_entry **)_entryCache, sortLUT[i]);
memcpy(destEntry, _entryCache[sortLUT[i]], entrySize);
destEntry = (rct_object_entry*)((uintptr_t)destEntry + entrySize);
if (_installedObjectFilters)