rnd-20061101-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 1 Nov 2006 20:11:26 +0000 (21:11 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:53:41 +0000 (10:53 +0200)
* some optimizations on startup speed by reducing initial text output

ChangeLog
src/conftime.h
src/init.c
src/libgame/misc.c
src/libgame/setup.c
src/libgame/sound.c
src/libgame/system.c
src/libgame/system.h
src/libgame/text.c

index 2af341284f2c76c22db8ea74f49b8f183ff51a71..3a9a419f2b7cf0424a0cd8cbf06bccd506900fda 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2006-11-01
+       * some optimizations on startup speed by reducing initial text output
+
 2006-10-30
        * added caching of custom artwork information for faster startup times
 
index 7bf99c14bd899efed71ab47d8c787f1783a77565..8f08f072512ed6ecca7a74817551ca650d231ce0 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2006-10-31 00:28]"
+#define COMPILE_DATE_STRING "[2006-11-01 21:07]"
index aabc7026b630dd834afa213b6a4685ac9c16cf95..2ebf076c47e8402ed417236cb36957563fe70735 100644 (file)
@@ -4580,7 +4580,7 @@ void InitGfx()
   DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
   DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED);
 
-  DrawInitText("Loading graphics:", 120, FC_GREEN);
+  DrawInitText("Loading graphics", 120, FC_GREEN);
 }
 
 void RedrawBackground()
@@ -4595,7 +4595,6 @@ void InitGfxBackground()
 {
   int x, y;
 
-  drawto = backbuffer;
   fieldbuffer = bitmap_db_field;
   SetDrawtoField(DRAW_BACKBUFFER);
 
@@ -4910,8 +4909,7 @@ void OpenAll()
   InitJoysticks();
 
   InitVideoDisplay();
-  InitVideoBuffer(&backbuffer, &window, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH,
-                 setup.fullscreen);
+  InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
 
   InitEventFilter(FilterMouseMotionEvents);
 
@@ -4920,8 +4918,11 @@ void OpenAll()
 
   InitGfx();
 
+  // debug_print_timestamp(0, "INIT");
   InitLevelInfo();
+  // debug_print_timestamp(0, "TIME InitLevelInfo:        ");
   InitLevelArtworkInfo();
+  // debug_print_timestamp(0, "TIME InitLevelArtworkInfo: ");
 
   InitImages();                        /* needs to know current level directory */
   InitSound(NULL);             /* needs to know current level directory */
index 0115b5d9fb95f3ca633032656bcb0673138a62f0..f9b8b2570134b840e1cd41f418e5a207c12cedc9 100644 (file)
@@ -2490,7 +2490,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
   char *filename_base = UNDEFINED_FILENAME, *filename_local;
   int i, j;
 
-  DrawInitText("Loading artwork config:", 120, FC_GREEN);
+  DrawInitText("Loading artwork config", 120, FC_GREEN);
   DrawInitText(ARTWORKINFO_FILENAME(artwork_info->type), 150, FC_YELLOW);
 
   /* always start with reliable default values */
@@ -2567,9 +2567,9 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
 {
   char *init_text[] =
   {
-    "Loading graphics:",
-    "Loading sounds:",
-    "Loading music:"
+    "Loading graphics",
+    "Loading sounds",
+    "Loading music"
   };
 
   ListNode *node;
@@ -2787,6 +2787,8 @@ void NotifyUserAboutErrorFile()
 /* the following is only for debugging purpose and normally not used         */
 /* ------------------------------------------------------------------------- */
 
+#if DEBUG
+
 #define DEBUG_NUM_TIMESTAMPS   3
 
 void debug_print_timestamp(int counter_nr, char *message)
@@ -2799,10 +2801,10 @@ void debug_print_timestamp(int counter_nr, char *message)
   counter[counter_nr][0] = Counter();
 
   if (message)
-    printf("%s %.2f seconds\n", message,
+    printf("%s %.3f seconds\n", message,
           (float)(counter[counter_nr][0] - counter[counter_nr][1]) / 1000);
 
-  counter[counter_nr][1] = Counter();
+  counter[counter_nr][1] = counter[counter_nr][0];
 }
 
 void debug_print_parent_only(char *format, ...)
@@ -2821,3 +2823,4 @@ void debug_print_parent_only(char *format, ...)
     printf("\n");
   }
 }
+#endif
index 9a65d0f1252ba861c81c66bd2b186831605c1cb4..b116457e575d5df7addfa73e9571b0027c985395 100644 (file)
@@ -86,14 +86,16 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
 
 #define MAX_COOKIE_LEN                         256
 
+
 static void setTreeInfoToDefaults(TreeInfo *, int);
 static int compareTreeInfoEntries(const void *, const void *);
 
 static int token_value_position   = TOKEN_VALUE_POSITION_DEFAULT;
 static int token_comment_position = TOKEN_COMMENT_POSITION_DEFAULT;
 
-static SetupFileHash *artworkinfo_hash_old = NULL;
-static SetupFileHash *artworkinfo_hash_new = NULL;
+static SetupFileHash *artworkinfo_cache_old = NULL;
+static SetupFileHash *artworkinfo_cache_new = NULL;
+static boolean use_artworkinfo_cache = TRUE;
 
 
 /* ------------------------------------------------------------------------- */
@@ -158,6 +160,16 @@ static char *getLevelSetupDir(char *level_subdir)
   return levelsetup_dir;
 }
 
+static char *getCacheDir()
+{
+  static char *cache_dir = NULL;
+
+  if (cache_dir == NULL)
+    cache_dir = getPath2(getUserGameDataDir(), CACHE_DIRECTORY);
+
+  return cache_dir;
+}
+
 static char *getLevelDirFromTreeInfo(TreeInfo *node)
 {
   static char *level_dir = NULL;
@@ -797,7 +809,7 @@ void InitUserLevelDirectory(char *level_subdir)
   {
     createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE);
     createDirectory(getUserLevelDir(NULL), "main user level", PERMS_PRIVATE);
-    createDirectory(getUserLevelDir(level_subdir), "user level",PERMS_PRIVATE);
+    createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE);
 
     SaveUserLevelInfo();
   }
@@ -807,7 +819,13 @@ void InitLevelSetupDirectory(char *level_subdir)
 {
   createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE);
   createDirectory(getLevelSetupDir(NULL), "main level setup", PERMS_PRIVATE);
-  createDirectory(getLevelSetupDir(level_subdir), "level setup",PERMS_PRIVATE);
+  createDirectory(getLevelSetupDir(level_subdir), "level setup", PERMS_PRIVATE);
+}
+
+void InitCacheDirectory()
+{
+  createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE);
+  createDirectory(getCacheDir(), "cache data", PERMS_PRIVATE);
 }
 
 
@@ -2117,36 +2135,38 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
 
 
 /* -------------------------------------------------------------------------- */
-/* functions for handling custom artwork info cache                           */
+/* functions for handling level and custom artwork info cache                 */
 /* -------------------------------------------------------------------------- */
 
-#define ARTWORKINFO_CACHE_FILENAME     "cache.conf"
-
 static void LoadArtworkInfoCache()
 {
-  if (artworkinfo_hash_old == NULL)
+  InitCacheDirectory();
+
+  if (artworkinfo_cache_old == NULL)
   {
-    char *filename = getPath2(getSetupDir(), ARTWORKINFO_CACHE_FILENAME);
+    char *filename = getPath2(getCacheDir(), ARTWORKINFO_CACHE_FILE);
 
     /* try to load artwork info hash from already existing cache file */
-    artworkinfo_hash_old = loadSetupFileHash(filename);
+    artworkinfo_cache_old = loadSetupFileHash(filename);
 
     /* if no artwork info cache file was found, start with empty hash */
-    if (artworkinfo_hash_old == NULL)
-      artworkinfo_hash_old = newSetupFileHash();
+    if (artworkinfo_cache_old == NULL)
+      artworkinfo_cache_old = newSetupFileHash();
 
     free(filename);
   }
 
-  if (artworkinfo_hash_new == NULL)
-    artworkinfo_hash_new = newSetupFileHash();
+  if (artworkinfo_cache_new == NULL)
+    artworkinfo_cache_new = newSetupFileHash();
 }
 
 static void SaveArtworkInfoCache()
 {
-  char *filename = getPath2(getSetupDir(), ARTWORKINFO_CACHE_FILENAME);
+  char *filename = getPath2(getCacheDir(), ARTWORKINFO_CACHE_FILE);
+
+  InitCacheDirectory();
 
-  saveSetupFileHash(artworkinfo_hash_new, filename);
+  saveSetupFileHash(artworkinfo_cache_new, filename);
 
   free(filename);
 }
@@ -2203,22 +2223,17 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type)
   char *type_string = ARTWORK_DIRECTORY(type);
   char *token_prefix = getCacheTokenPrefix(type_string, identifier);
   char *token_main = getCacheToken(token_prefix, "CACHED");
-  char *cache_entry = getHashEntry(artworkinfo_hash_old, token_main);
+  char *cache_entry = getHashEntry(artworkinfo_cache_old, token_main);
   boolean cached = (cache_entry != NULL && strEqual(cache_entry, "true"));
   TreeInfo *artwork_info = NULL;
 
-#if 0
-  printf("::: '%s' in cache: %d\n", token_main, cached);
-#endif
+  if (!use_artworkinfo_cache)
+    return NULL;
 
   if (cached)
   {
     int i;
 
-#if 0
-    printf("::: LOADING existing hash entry for '%s' ...\n", identifier);
-#endif
-
     artwork_info = newTreeInfo();
     setTreeInfoToDefaults(artwork_info, type);
 
@@ -2227,18 +2242,14 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type)
     for (i = 0; artworkinfo_tokens[i].type != -1; i++)
     {
       char *token = getCacheToken(token_prefix, artworkinfo_tokens[i].text);
-      char *value = getHashEntry(artworkinfo_hash_old, token);
-
-#if 0
-      printf("::: - setting '%s' => '%s'\n", token, value);
-#endif
+      char *value = getHashEntry(artworkinfo_cache_old, token);
 
       setSetupInfo(artworkinfo_tokens, i, value);
 
       /* check if cache entry for this item is invalid or incomplete */
       if (value == NULL)
       {
-#if 0
+#if 1
        printf("::: - WARNING: cache entry '%s' invalid\n", token);
 #endif
 
@@ -2257,21 +2268,21 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type)
 
     /* check if corresponding "levelinfo.conf" file has changed */
     token_main = getCacheToken(token_prefix, "TIMESTAMP_LEVELINFO");
-    cache_entry = getHashEntry(artworkinfo_hash_old, token_main);
+    cache_entry = getHashEntry(artworkinfo_cache_old, token_main);
 
     if (modifiedFileTimestamp(filename_levelinfo, cache_entry))
       cached = FALSE;
 
     /* check if corresponding "<artworkinfo>.conf" file has changed */
     token_main = getCacheToken(token_prefix, "TIMESTAMP_ARTWORKINFO");
-    cache_entry = getHashEntry(artworkinfo_hash_old, token_main);
+    cache_entry = getHashEntry(artworkinfo_cache_old, token_main);
 
     if (modifiedFileTimestamp(filename_artworkinfo, cache_entry))
       cached = FALSE;
 
 #if 0
     if (!cached)
-      printf("::: '%s': INVALIDATED FROM CACHE\n", identifier);
+      printf("::: '%s': INVALIDATED FROM CACHE BY TIMESTAMP\n", identifier);
 #endif
 
     checked_free(filename_levelinfo);
@@ -2298,11 +2309,7 @@ static void setArtworkInfoCacheEntry(TreeInfo *artwork_info,
   boolean set_cache_timestamps = TRUE;
   int i;
 
-#if 0
-  printf("::: adding '%s' to cache!\n", token_main);
-#endif
-
-  setHashEntry(artworkinfo_hash_new, token_main, "true");
+  setHashEntry(artworkinfo_cache_new, token_main, "true");
 
   if (set_cache_timestamps)
   {
@@ -2314,10 +2321,10 @@ static void setArtworkInfoCacheEntry(TreeInfo *artwork_info,
     char *timestamp_artworkinfo = getFileTimestamp(filename_artworkinfo);
 
     token_main = getCacheToken(token_prefix, "TIMESTAMP_LEVELINFO");
-    setHashEntry(artworkinfo_hash_new, token_main, timestamp_levelinfo);
+    setHashEntry(artworkinfo_cache_new, token_main, timestamp_levelinfo);
 
     token_main = getCacheToken(token_prefix, "TIMESTAMP_ARTWORKINFO");
-    setHashEntry(artworkinfo_hash_new, token_main, timestamp_artworkinfo);
+    setHashEntry(artworkinfo_cache_new, token_main, timestamp_artworkinfo);
 
     checked_free(filename_levelinfo);
     checked_free(filename_artworkinfo);
@@ -2332,13 +2339,7 @@ static void setArtworkInfoCacheEntry(TreeInfo *artwork_info,
     char *value = getSetupValue(artworkinfo_tokens[i].type,
                                artworkinfo_tokens[i].value);
     if (value != NULL)
-    {
-      setHashEntry(artworkinfo_hash_new, token, value);
-
-#if 0
-      printf("::: - setting '%s' => '%s'\n\n", token, value);
-#endif
-    }
+      setHashEntry(artworkinfo_cache_new, token, value);
   }
 }
 
@@ -2404,8 +2405,6 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
   if (strEqual(leveldir_new->name, ANONYMOUS_NAME))
     setString(&leveldir_new->name, leveldir_new->subdir);
 
-  DrawInitText(leveldir_new->name, 150, FC_YELLOW);
-
   if (leveldir_new->identifier == NULL)
     leveldir_new->identifier = getStringCopy(leveldir_new->subdir);
 
@@ -2456,6 +2455,9 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     (leveldir_new->user_defined || !leveldir_new->handicap ?
      leveldir_new->last_level : leveldir_new->first_level);
 
+  if (leveldir_new->level_group)
+    DrawInitText(leveldir_new->name, 150, FC_YELLOW);
+
 #if 0
   /* !!! don't skip sets without levels (else artwork base sets are missing) */
 #if 1
@@ -2481,7 +2483,7 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     /* create node to link back to current level directory */
     createParentTreeInfoNode(leveldir_new);
 
-    /* step into sub-directory and look for more level series */
+    /* recursively step into sub-directory and look for more level series */
     LoadLevelInfoFromLevelDir(&leveldir_new->node_group,
                              leveldir_new, directory_path);
   }
@@ -2569,7 +2571,7 @@ void LoadLevelInfo()
 {
   InitUserLevelDirectory(getLoginName());
 
-  DrawInitText("Loading level series:", 120, FC_GREEN);
+  DrawInitText("Loading level series", 120, FC_GREEN);
 
   LoadLevelInfoFromLevelDir(&leveldir_first, NULL, options.level_directory);
   LoadLevelInfoFromLevelDir(&leveldir_first, NULL, getUserLevelDir(NULL));
@@ -2669,10 +2671,6 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
     if (strEqual(artwork_new->name, ANONYMOUS_NAME))
       setString(&artwork_new->name, artwork_new->subdir);
 
-#if 0
-    DrawInitText(artwork_new->name, 150, FC_YELLOW);
-#endif
-
     if (artwork_new->identifier == NULL)
       artwork_new->identifier = getStringCopy(artwork_new->subdir);
 
@@ -2729,7 +2727,9 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
     setString(&artwork_new->name_sorting, artwork_new->name);
   }
 
+#if 0
   DrawInitText(artwork_new->name, 150, FC_YELLOW);
+#endif
 
   pushTreeInfo(node_first, artwork_new);
 
@@ -2821,7 +2821,7 @@ void LoadArtworkInfo()
 {
   LoadArtworkInfoCache();
 
-  DrawInitText("Looking for custom artwork:", 120, FC_GREEN);
+  DrawInitText("Looking for custom artwork", 120, FC_GREEN);
 
   LoadArtworkInfoFromArtworkDir(&artwork.gfx_first, NULL,
                                options.graphics_directory,
@@ -2944,6 +2944,11 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
        setArtworkInfoCacheEntry(artwork_new, level_node, type);
     }
 
+#if 1
+    if (level_node->level_group)
+      DrawInitText(level_node->name, 150, FC_YELLOW);
+#endif
+
     if (level_node->node_group != NULL)
       LoadArtworkInfoFromLevelInfo(artwork_node, level_node->node_group);
 
@@ -2953,7 +2958,7 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
 
 void LoadLevelArtworkInfo()
 {
-  DrawInitText("Looking for custom level artwork:", 120, FC_GREEN);
+  DrawInitText("Looking for custom level artwork", 120, FC_GREEN);
 
   LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, leveldir_first_all);
   LoadArtworkInfoFromLevelInfo(&artwork.snd_first, leveldir_first_all);
index be88d8e105196a769f585d32f2505effff036eb8..a01ce29dc1565f8b72592caa42fc009563af6d77 100644 (file)
@@ -1792,7 +1792,7 @@ void LoadCustomMusic_NoConf(void)
   }
 
   if (draw_init_text)
-    DrawInitText("Loading music:", 120, FC_GREEN);
+    DrawInitText("Loading music", 120, FC_GREEN);
 
   while ((dir_entry = readdir(dir)) != NULL)   /* loop until last dir entry */
   {
index 55046b8890a428a037ed9b3437c1405d1979db0c..5ccb5eb71257414f36e6dba3ae7d1a6682fcbdde 100644 (file)
@@ -321,8 +321,7 @@ void CloseVideoDisplay(void)
 #endif
 }
 
-void InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window,
-                    int width, int height, int depth, boolean fullscreen)
+void InitVideoBuffer(int width, int height, int depth, boolean fullscreen)
 {
   video.width = width;
   video.height = height;
@@ -334,10 +333,12 @@ void InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window,
   video.fullscreen_mode_current = NULL;
 
 #if defined(TARGET_SDL)
-  SDLInitVideoBuffer(backbuffer, window, fullscreen);
+  SDLInitVideoBuffer(&backbuffer, &window, fullscreen);
 #else
-  X11InitVideoBuffer(backbuffer, window);
+  X11InitVideoBuffer(&backbuffer, &window);
 #endif
+
+  drawto = backbuffer;
 }
 
 Bitmap *CreateBitmapStruct(void)
index 73d67f0bf165109b57fb8345720d14420f56f5bb..5d80bff569438af43135976481d66b3df2193b7b 100644 (file)
 #define TAPES_DIRECTORY                "tapes"
 #define SCORES_DIRECTORY       "scores"
 #define DOCS_DIRECTORY         "docs"
+#define CACHE_DIRECTORY                "cache"
 
 #if !defined(PLATFORM_MSDOS)
 #define GFX_CLASSIC_SUBDIR     "gfx_classic"
 #define GRAPHICSINFO_FILENAME  "graphicsinfo.conf"
 #define SOUNDSINFO_FILENAME    "soundsinfo.conf"
 #define MUSICINFO_FILENAME     "musicinfo.conf"
+#define ARTWORKINFO_CACHE_FILE "artworkinfo.cache"
 #define LEVELFILE_EXTENSION    "level"
 #define TAPEFILE_EXTENSION     "tape"
 #define SCOREFILE_EXTENSION    "score"
 #define GRAPHICSINFO_FILENAME  "gfxinfo.cnf"
 #define SOUNDSINFO_FILENAME    "sndinfo.cnf"
 #define MUSICINFO_FILENAME     "musinfo.cnf"
+#define ARTWORKINFO_CACHE_FILE "artinfo.cac"
 #define LEVELFILE_EXTENSION    "lvl"
 #define TAPEFILE_EXTENSION     "tap"
 #define SCOREFILE_EXTENSION    "sco"
@@ -1061,7 +1064,7 @@ void SetDoorBackgroundBitmap(Bitmap *);
 
 void InitVideoDisplay(void);
 void CloseVideoDisplay(void);
-void InitVideoBuffer(DrawBuffer **,DrawWindow **, int,int,int, boolean);
+void InitVideoBuffer(int, int, int, boolean);
 Bitmap *CreateBitmapStruct(void);
 Bitmap *CreateBitmap(int, int, int);
 void FreeBitmap(Bitmap *);
index ccf32e700bbd070d6d753cad2a7d9599db773427..01689a73a5e85f9cef2a424f00157076185a0c18 100644 (file)
@@ -187,14 +187,20 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y)
 
 void DrawInitText(char *text, int ypos, int font_nr)
 {
-  if (window &&
+  if (window != NULL &&
       gfx.num_fonts > 0 &&
       gfx.font_bitmap_info[font_nr].bitmap != NULL)
   {
-    ClearRectangle(window, 0, ypos, video.width, getFontHeight(font_nr));
-    DrawTextExt(window, (video.width - getTextWidth(text, font_nr)) / 2, ypos,
-               text, font_nr, BLIT_OPAQUE);
-    FlushDisplay();
+    int x = (video.width - getTextWidth(text, font_nr)) / 2;
+    int y = ypos;
+    int width = video.width;
+    int height = getFontHeight(font_nr);
+
+    ClearRectangle(drawto, 0, y, width, height);
+    DrawTextExt(drawto, x, y, text, font_nr, BLIT_OPAQUE);
+
+    /* this makes things significantly faster than directly drawing to window */
+    BlitBitmap(drawto, window, 0, y, width, height, 0, y);
   }
 }