[Add] Using the pack cache now, initial loading is a lot faster.
This commit is contained in:
parent
ba26575890
commit
44db60f32b
6
src/ai.c
6
src/ai.c
@ -101,7 +101,7 @@ static int ai_accel(lua_State* L); /* Accelerate. */
|
||||
|
||||
/* Internal C routines. */
|
||||
static void ai_run(lua_State* L, const char* funcname);
|
||||
static int ai_loadProfile(char* filename);
|
||||
static int ai_loadProfile(const char* filename);
|
||||
static void ai_freetask(Task* t);
|
||||
static void ai_setMemory(void);
|
||||
static void ai_create(Pilot* pilot, char* param);
|
||||
@ -383,7 +383,7 @@ void ai_destroy(Pilot* p) {
|
||||
* @return 0 on no errors.
|
||||
*/
|
||||
int ai_init(void) {
|
||||
char** files;
|
||||
const char** files;
|
||||
uint32_t nfiles, i;
|
||||
|
||||
/* Get the file list. */
|
||||
@ -412,7 +412,7 @@ int ai_init(void) {
|
||||
* @param[in] filename File to create the profile from.
|
||||
* @return 0 on no error.
|
||||
*/
|
||||
static int ai_loadProfile(char* filename) {
|
||||
static int ai_loadProfile(const char* filename) {
|
||||
char* buf = NULL;
|
||||
uint32_t bufsize = 0;
|
||||
lua_State* L;
|
||||
|
95
src/ldata.c
95
src/ldata.c
@ -22,13 +22,13 @@
|
||||
#define START_DATA "../dat/start.xml" /**< Path to module start file. */
|
||||
|
||||
/* Packfile. */
|
||||
static char* ldata_filename = NULL; /**< Packfile name. */
|
||||
static Packfile_t* ldata_pack = NULL; /**< Actual packfile. */
|
||||
static char* ldata_packName = NULL; /**< Name of the ldata module. */
|
||||
static char* ldata_filename = NULL; /**< Packfile name. */
|
||||
static Packcache_t* ldata_cache = NULL; /**< Actual packfile. */
|
||||
static char* ldata_packName = NULL; /**< Name of the ldata module. */
|
||||
|
||||
/* File list. */
|
||||
static char** ldata_fileList = NULL; /**< List of the files in the packfile. */
|
||||
static uint32_t ldata_fileNList = 0; /**< Number of files in ldata_fileList. */
|
||||
static const char** ldata_fileList = NULL; /**< List of the files in the packfile. */
|
||||
static uint32_t ldata_fileNList = 0; /**< Number of files in ldata_fileList. */
|
||||
|
||||
/**
|
||||
* @brief Check to see if path is a ldata file.
|
||||
@ -59,30 +59,43 @@ static int ldata_openPackfile(void) {
|
||||
int nfiles;
|
||||
size_t len;
|
||||
|
||||
if(lfile_fileExists("%s-%d.%d.%d", LDATA_FILENAME, VMAJOR, VMINOR, VREV)) {
|
||||
ldata_filename = malloc(PATH_MAX);
|
||||
snprintf(ldata_filename, PATH_MAX, "%s-%d.%d.%d", LDATA_FILENAME, VMAJOR,
|
||||
VMINOR, VREV);
|
||||
}
|
||||
else if(lfile_fileExists(LDATA_DEF))
|
||||
ldata_filename = strdup(LDATA_DEF);
|
||||
else {
|
||||
files = lfile_readDir(&nfiles, ".");
|
||||
len = strlen(LDATA_FILENAME);
|
||||
for(i = 0; i < nfiles; i++) {
|
||||
if(strncmp(files[i], LDATA_FILENAME, len)==0) {
|
||||
/* Must be packed. */
|
||||
if(pack_check(files[i]))
|
||||
continue;
|
||||
|
||||
ldata_filename = strdup(files[i]);
|
||||
break;
|
||||
}
|
||||
/* Try to find the ldata file. */
|
||||
if(ldata_filename == NULL) {
|
||||
/* Check ldata with version appended. */
|
||||
if(lfile_fileExists("%s-%d.%d.%d", LDATA_FILENAME, VMAJOR, VMINOR, VREV)) {
|
||||
ldata_filename = malloc(PATH_MAX);
|
||||
snprintf(ldata_filename, PATH_MAX, "%s-%d.%d.%d",
|
||||
LDATA_FILENAME, VMAJOR, VMINOR, VREV);
|
||||
}
|
||||
/* Check default ldata. */
|
||||
else if(lfile_fileExists(LDATA_DEF))
|
||||
ldata_filename = strdup(LDATA_DEF);
|
||||
/* Try to open any ldata in path. */
|
||||
else {
|
||||
files = lfile_readDir(&nfiles, ".");
|
||||
len = strlen(LDATA_FILENAME);
|
||||
for(i = 0; i < nfiles; i++) {
|
||||
if(strncmp(files[i], LDATA_FILENAME, len)==0) {
|
||||
/* Must be a packfile. */
|
||||
if(pack_check(files[i]))
|
||||
continue;
|
||||
|
||||
ldata_filename = strdup(files[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Clean up. */
|
||||
for(i = 0; i < nfiles; i++)
|
||||
free(files[i]);
|
||||
free(files);
|
||||
}
|
||||
for(i = 0; i < nfiles; i++)
|
||||
free(files[i]);
|
||||
free(files);
|
||||
}
|
||||
|
||||
/* Open the cache. */
|
||||
ldata_cache = pack_openCache(ldata_filename);
|
||||
if(ldata_cache == NULL)
|
||||
WARN("Unalbe to create Packcache from '%s'.", ldata_filename);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -98,8 +111,6 @@ int ldata_open(void) {
|
||||
* @brief Close and clean up the ldata file.
|
||||
*/
|
||||
void ldata_close(void) {
|
||||
unsigned int i;
|
||||
|
||||
/* Destroy the name. */
|
||||
if(ldata_packName != NULL) {
|
||||
free(ldata_packName);
|
||||
@ -108,26 +119,23 @@ void ldata_close(void) {
|
||||
|
||||
/* Destroy the list. */
|
||||
if(ldata_fileList != NULL) {
|
||||
for(i = 0; i < ldata_fileNList; i++)
|
||||
free(ldata_fileList[i]);
|
||||
|
||||
free(ldata_fileList);
|
||||
/* No need to free memory since cache does that. */
|
||||
ldata_fileList = NULL;
|
||||
ldata_fileNList = 0;
|
||||
}
|
||||
|
||||
/* Close the packfile. */
|
||||
/*
|
||||
pack_close(ldata_pack);
|
||||
ldata_pack = NULL;
|
||||
*/
|
||||
if(ldata_cache) {
|
||||
pack_closeCache(ldata_cache);
|
||||
ldata_cache = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the ldata's name.
|
||||
* @return The ldata's name.
|
||||
*/
|
||||
char* ldata_name(void) {
|
||||
const char* ldata_name(void) {
|
||||
char* buf;
|
||||
uint32_t size;
|
||||
xmlNodePtr node;
|
||||
@ -172,15 +180,16 @@ char* ldata_name(void) {
|
||||
* @brief Read a file from the ldata.
|
||||
*/
|
||||
void* ldata_read(const char* filename, uint32_t* filesize) {
|
||||
if(ldata_filename == NULL)
|
||||
if(ldata_cache == NULL)
|
||||
ldata_openPackfile();
|
||||
return pack_readfile(ldata_filename, filename, filesize);
|
||||
|
||||
return pack_readfileCached(ldata_cache, filename, filesize);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the list of files in the ldata.
|
||||
*/
|
||||
char** ldata_list(const char* path, uint32_t* nfiles) {
|
||||
const char** ldata_list(const char* path, uint32_t* nfiles) {
|
||||
(void)path;
|
||||
|
||||
if(ldata_fileList != NULL) {
|
||||
@ -188,10 +197,10 @@ char** ldata_list(const char* path, uint32_t* nfiles) {
|
||||
return ldata_fileList;
|
||||
}
|
||||
|
||||
if(ldata_filename == NULL)
|
||||
if(ldata_cache == NULL)
|
||||
ldata_openPackfile();
|
||||
|
||||
ldata_fileList = pack_listfiles(ldata_filename, &ldata_fileNList);
|
||||
ldata_fileList = pack_listfilesCached(ldata_cache, &ldata_fileNList);
|
||||
*nfiles = ldata_fileNList;
|
||||
return ldata_fileList;
|
||||
}
|
||||
|
@ -8,9 +8,9 @@ void ldata_close(void);
|
||||
/* General. */
|
||||
int ldata_check(char* path);
|
||||
int ldata_setPath(char* path);
|
||||
char* ldata_name(void);
|
||||
const char* ldata_name(void);
|
||||
|
||||
/* Individual file functions. */
|
||||
void* ldata_read(const char* filename, uint32_t* filesize);
|
||||
char** ldata_list(const char* path, uint32_t* nfiles);
|
||||
const char** ldata_list(const char* path, uint32_t* nfiles);
|
||||
|
||||
|
@ -285,8 +285,8 @@ int main(int argc, char** argv) {
|
||||
void loadscreen_load(void) {
|
||||
int i;
|
||||
char file_path[PATH_MAX];
|
||||
char** loadscreens;
|
||||
char** files;
|
||||
const char** loadscreens;
|
||||
const char** files;
|
||||
uint32_t nfiles;
|
||||
size_t len;
|
||||
int nload;
|
||||
|
@ -164,7 +164,7 @@ static void music_free(void) {
|
||||
* @return 0 on success.
|
||||
*/
|
||||
static int music_find(void) {
|
||||
char** files;
|
||||
const char** files;
|
||||
uint32_t nfiles, i;
|
||||
char tmp[64];
|
||||
int len;
|
||||
|
80
src/pack.c
80
src/pack.c
@ -144,7 +144,6 @@ Packcache_t* pack_openCache(const char* packfile) {
|
||||
cache->index[i] = strdup(buf);
|
||||
READ(cache, &cache->start[i], 4);
|
||||
DEBUG("'%s' found at %d", filename, cache->start[i]);
|
||||
break;
|
||||
}
|
||||
/* Return the built cache. */
|
||||
return cache;
|
||||
@ -220,7 +219,7 @@ Packfile_t* pack_openFromCache(Packcache_t* cache, const char* filename) {
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return file;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -599,32 +598,14 @@ long pack_tell(Packfile_t* file) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesize)
|
||||
*
|
||||
* @brief Read an entire file into memory.
|
||||
* @param packfile Name of the packfile to read from.
|
||||
* @param filename Name of the packed file to read.
|
||||
* @param filesize Is set to the size of the file.
|
||||
* @return A pointer to the sata in the file or NULL if an error accured.
|
||||
* @brief Read a file from a packfile.
|
||||
*/
|
||||
void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesize) {
|
||||
Packfile_t* file;
|
||||
static void* pack_readfilePack(Packfile_t* file,
|
||||
const char* filename, uint32_t* filesize) {
|
||||
void* buf;
|
||||
char* str;
|
||||
int size, bytes;
|
||||
|
||||
/* Initialize size to 0. */
|
||||
if(filesize)
|
||||
*filesize = 0;
|
||||
|
||||
/* Open the packfile. */
|
||||
file = pack_open(packfile, filename);
|
||||
if(file == NULL) {
|
||||
ERR("Opening packfile '%s'.", packfile);
|
||||
return NULL;
|
||||
}
|
||||
DEBUG("Opened file '%s' from '%s'", filename, packfile);
|
||||
|
||||
/* Read the entire file. */
|
||||
size = file->end - file->start;
|
||||
buf = malloc(size+1);
|
||||
@ -634,8 +615,8 @@ void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesi
|
||||
return NULL;
|
||||
}
|
||||
if((bytes = pack_read(file, buf, size)) != size) {
|
||||
ERR("Reading '%s' from packfile '%s'. Expected %d bytes got %d bytes",
|
||||
filename, packfile, size, bytes);
|
||||
ERR("Reading '%s' from packfile. Expected %d bytes got %d bytes",
|
||||
filename, size, bytes);
|
||||
free(buf);
|
||||
free(file);
|
||||
return NULL;
|
||||
@ -675,6 +656,32 @@ void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesi
|
||||
return buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read an entire file into memory.
|
||||
* @param packfile Name of the packfile to read from.
|
||||
* @param filename Name of the packed file to read.
|
||||
* @param filesize Is set to the size of the file.
|
||||
* @return A pointer to the sata in the file or NULL if an error accured.
|
||||
*/
|
||||
void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesize) {
|
||||
Packfile_t* file;
|
||||
|
||||
/* Initialize size to 0. */
|
||||
if(filesize)
|
||||
*filesize = 0;
|
||||
|
||||
/* Open the packfile. */
|
||||
file = pack_open(packfile, filename);
|
||||
if(file == NULL) {
|
||||
ERR("Opening packfile '%s'.", packfile);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DEBUG("Opened file '%s' from '%s'", filename, packfile);
|
||||
|
||||
return pack_readfilePack(file, filename, filesize);
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn char** pack_listfiles(const char* packfile, uint32_t* nfiles)
|
||||
*
|
||||
@ -732,6 +739,29 @@ char** pack_listfiles(const char* packfile, uint32_t* nfiles) {
|
||||
return filenames;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read an entire file from the cache.
|
||||
*/
|
||||
void* pack_readfileCached(Packcache_t* cache, const char* filename, uint32_t* filesize) {
|
||||
Packfile_t* file;
|
||||
|
||||
file = pack_openFromCache(cache, filename);
|
||||
if(file == NULL)
|
||||
ERR("Unable to create packfile from packcache.");
|
||||
return pack_readfilePack(file, filename, filesize);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the list of files in a packcache.
|
||||
* @param cache Cache to get list of files from.
|
||||
* @param nfiles Number of files in the list.
|
||||
* @return A read only list of the files from the pack cache.
|
||||
*/
|
||||
const char** pack_listfilesCached(Packcache_t* cache, uint32_t* nfiles) {
|
||||
*nfiles = cache->nindex;
|
||||
return (const char**)cache->index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Closes a packfile.
|
||||
* @param file Packfile to close.
|
||||
|
@ -33,4 +33,6 @@ int pack_close(Packfile_t* file);
|
||||
/* Fancy stuff. */
|
||||
void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesize);
|
||||
char** pack_listfiles(const char* packfile, uint32_t* nfiles);
|
||||
void* pack_readfileCached(Packcache_t* cache, const char* filename, uint32_t* filesize);
|
||||
const char** pack_listfilesCached(Packcache_t* cache, uint32_t* nfiles);
|
||||
|
||||
|
@ -80,7 +80,7 @@ static alVoice* voice_pool = NULL; /**< Pool of free voices. */
|
||||
/* General prototypes. */
|
||||
static void print_MixerVersion(void);
|
||||
static int sound_makeList(void);
|
||||
static Mix_Chunk* sound_load(char* filename);
|
||||
static Mix_Chunk* sound_load(const char* filename);
|
||||
static void sound_free(alSound* snd);
|
||||
/* Voices. */
|
||||
static void voice_markStopped(int channel);
|
||||
@ -425,7 +425,7 @@ int sound_updateListener(double dir, double x, double y) {
|
||||
* @brief Make the list of available sounds.
|
||||
*/
|
||||
static int sound_makeList(void) {
|
||||
char** files;
|
||||
const char** files;
|
||||
uint32_t nfiles, i;
|
||||
char tmp[64];
|
||||
int len;
|
||||
@ -489,7 +489,7 @@ int sound_volume(const double vol) {
|
||||
*
|
||||
* @sa sound_makeList
|
||||
*/
|
||||
static Mix_Chunk* sound_load(char* filename) {
|
||||
static Mix_Chunk* sound_load(const char* filename) {
|
||||
void* wavdata;
|
||||
unsigned int size;
|
||||
SDL_RWops* rw;
|
||||
|
Loading…
Reference in New Issue
Block a user