author | peter1138 |
Thu, 20 Apr 2006 20:51:57 +0000 | |
changeset 3595 | a0acdb23e662 |
child 3668 | 42325f12e7d8 |
permissions | -rw-r--r-- |
3595
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
1 |
/* $Id$ */ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
2 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
3 |
#include "stdafx.h" |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
4 |
#include "openttd.h" |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
5 |
#include "pool.h" |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
6 |
#include "sprite.h" |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
7 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
8 |
enum { |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
9 |
SPRITEGROUP_POOL_BLOCK_SIZE_BITS = 4, /* (1 << 4) == 16 items */ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
10 |
SPRITEGROUP_POOL_MAX_BLOCKS = 8000, |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
11 |
}; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
12 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
13 |
static uint _spritegroup_count = 0; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
14 |
static MemoryPool _spritegroup_pool; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
15 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
16 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
17 |
static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item) |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
18 |
{ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
19 |
uint i; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
20 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
21 |
for (i = start_item; i <= end_item; i++) { |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
22 |
SpriteGroup *group = (SpriteGroup*)GetItemFromPool(&_spritegroup_pool, i); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
23 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
24 |
/* Free dynamically allocated memory */ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
25 |
switch (group->type) { |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
26 |
case SGT_REAL: |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
27 |
free(group->g.real.loaded); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
28 |
free(group->g.real.loading); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
29 |
break; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
30 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
31 |
case SGT_DETERMINISTIC: |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
32 |
free(group->g.determ.ranges); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
33 |
break; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
34 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
35 |
case SGT_RANDOMIZED: |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
36 |
free(group->g.random.groups); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
37 |
break; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
38 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
39 |
default: |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
40 |
break; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
41 |
} |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
42 |
} |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
43 |
} |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
44 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
45 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
46 |
/* Initialize the SpriteGroup pool */ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
47 |
static MemoryPool _spritegroup_pool = { "SpriteGr", SPRITEGROUP_POOL_MAX_BLOCKS, SPRITEGROUP_POOL_BLOCK_SIZE_BITS, sizeof(SpriteGroup), NULL, &SpriteGroupPoolCleanBlock, 0, 0, NULL }; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
48 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
49 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
50 |
/* Allocate a new SpriteGroup */ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
51 |
SpriteGroup *AllocateSpriteGroup(void) |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
52 |
{ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
53 |
/* This is totally different to the other pool allocators, as we never remove an item from the pool. */ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
54 |
if (_spritegroup_count == _spritegroup_pool.total_items) { |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
55 |
if (!AddBlockToPool(&_spritegroup_pool)) return NULL; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
56 |
} |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
57 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
58 |
return (SpriteGroup*)GetItemFromPool(&_spritegroup_pool, _spritegroup_count++); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
59 |
} |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
60 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
61 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
62 |
void InitializeSpriteGroupPool(void) |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
63 |
{ |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
64 |
CleanPool(&_spritegroup_pool); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
65 |
AddBlockToPool(&_spritegroup_pool); |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
66 |
|
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
67 |
_spritegroup_count = 0; |
a0acdb23e662
(svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff
changeset
|
68 |
} |