[freeciv-ai] Re: [Freeciv-Dev] (PR#10301) cachemap is way too big
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: |
undisclosed-recipients: ; |
Subject: |
[freeciv-ai] Re: [Freeciv-Dev] (PR#10301) cachemap is way too big |
From: |
"Jason Short" <jdorje@xxxxxxxxxxxxxxxxxxxxx> |
Date: |
Sat, 25 Sep 2004 18:11:02 -0700 |
Reply-to: |
rt@xxxxxxxxxxx |
<URL: http://rt.freeciv.org/Ticket/Display.html?id=10301 >
Jason Short wrote:
> <URL: http://rt.freeciv.org/Ticket/Display.html?id=10301 >
>
> Jason Short wrote:
>
>><URL: http://rt.freeciv.org/Ticket/Display.html?id=10301 >
>>
>>In aisettler.c, the cachemap is declared to a static size of 520,200 bytes.
>>
>>This seems excessive, since if it were allocated dynamically it would
>>normally have a size of 32,000 bytes.
>
>
> On a related note, the cache_map is used (in cityresult_fill) before it
> is initialized (in ai_settler_init).
This patch fixes both problems. It reduces the memory usage of the
server by 500k. Autogames are identical.
(Why does the cache_map get all values initialized to -1?)
(Along with the citymap patch, this reduced the memory footprint of a
random civserver autogame I ran from 12.3 to 11.6 Mb.)
jason
? new
? orig
Index: ai/aisettler.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aisettler.c,v
retrieving revision 1.4
diff -u -r1.4 aisettler.c
--- ai/aisettler.c 26 Aug 2004 22:08:42 -0000 1.4
+++ ai/aisettler.c 26 Sep 2004 01:05:04 -0000
@@ -98,7 +98,8 @@
char food;
char trade;
char shield;
-} cachemap[MAP_MAX_WIDTH][MAP_MAX_HEIGHT];
+} *cachemap;
+#define CACHEMAP(x, y) (cachemap[map_pos_to_index((x), (y))])
/**************************************************************************
Fill cityresult struct with useful info about the city spot. It must
@@ -150,7 +151,7 @@
result->tile[i][j].trade = 0;
result->tile[i][j].food = 0;
sum = 0;
- } else if (cachemap[map_x][map_y].sum <= 0 || city_center) {
+ } else if (CACHEMAP(map_x, map_y).sum <= 0 || city_center) {
/* We cannot read city center from cache */
/* Food */
@@ -175,16 +176,16 @@
if (!city_center && virtual_city) {
/* real cities and any city center will give us spossibly
* skewed results */
- cachemap[map_x][map_y].sum = sum;
- cachemap[map_x][map_y].trade = result->tile[i][j].trade;
- cachemap[map_x][map_y].shield = result->tile[i][j].shield;
- cachemap[map_x][map_y].food = result->tile[i][j].food;
+ CACHEMAP(map_x, map_y).sum = sum;
+ CACHEMAP(map_x, map_y).trade = result->tile[i][j].trade;
+ CACHEMAP(map_x, map_y).shield = result->tile[i][j].shield;
+ CACHEMAP(map_x, map_y).food = result->tile[i][j].food;
}
} else {
- sum = cachemap[map_x][map_y].sum;
- result->tile[i][j].shield = cachemap[map_x][map_y].shield;
- result->tile[i][j].trade = cachemap[map_x][map_y].trade;
- result->tile[i][j].food = cachemap[map_x][map_y].food;
+ sum = CACHEMAP(map_x, map_y).sum;
+ result->tile[i][j].shield = CACHEMAP(map_x, map_y).shield;
+ result->tile[i][j].trade = CACHEMAP(map_x, map_y).trade;
+ result->tile[i][j].food = CACHEMAP(map_x, map_y).food;
}
result->tile[i][j].reserved = reserved;
@@ -445,9 +446,10 @@
/**************************************************************************
Prime settler engine.
**************************************************************************/
-void ai_settler_init(struct player *pplayer)
+void ai_settler_init(void)
{
- memset(&cachemap, -1, sizeof(cachemap));
+ cachemap = fc_realloc(cachemap, MAX_MAP_INDEX * sizeof(*cachemap));
+ memset(cachemap, -1, MAX_MAP_INDEX * sizeof(*cachemap));
}
/**************************************************************************
Index: ai/aisettler.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aisettler.h,v
retrieving revision 1.1
diff -u -r1.1 aisettler.h
--- ai/aisettler.h 5 Aug 2004 11:34:18 -0000 1.1
+++ ai/aisettler.h 26 Sep 2004 01:05:04 -0000
@@ -38,7 +38,7 @@
struct cityresult *result);
void find_best_city_placement(struct unit *punit, struct cityresult *best,
bool look_for_boat, bool use_virt_boat);
-void ai_settler_init(struct player *pplayer);
+void ai_settler_init(void);
void print_cityresult(struct player *pplayer, struct cityresult *cr,
struct ai_data *ai);
Index: server/srv_main.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/srv_main.c,v
retrieving revision 1.198
diff -u -r1.198 srv_main.c
--- server/srv_main.c 21 Sep 2004 05:51:12 -0000 1.198
+++ server/srv_main.c 26 Sep 2004 01:05:05 -0000
@@ -571,11 +571,9 @@
nocity_send = TRUE;
/* AI end of turn activities */
+ ai_settler_init(); /* This must be done before auto_settlers_init. */
auto_settlers_init();
players_iterate(pplayer) {
- if (pplayer->ai.control) {
- ai_settler_init(pplayer);
- }
auto_settlers_player(pplayer);
if (pplayer->ai.control) {
ai_do_last_activities(pplayer);
|
|