Skip to content

Commit

Permalink
Reorder TileLayer. (#5638)
Browse files Browse the repository at this point in the history
Despite the split of TileSpec into TileDef and TileLayer, the
TileLayer struct is still 66 bytes large, and doesn't fit in
a single cacheline.

I'm moving the color member to cacheline 2, in the hope that it
is less used and the compiler loads all the hot members in a single
cacheline instead. Only color sits now in cacheline 2, all the
other members are in cacheline 1.

Note: is_color is probably rarely set, most nodes will likely
not use hardware coloring, but this may change in the future.
Ideally, this class is shrunk to 64 bytes.
  • Loading branch information
sofar authored and nerzhul committed Apr 29, 2017
1 parent 19960e2 commit 1ecc875
Showing 1 changed file with 23 additions and 18 deletions.
41 changes: 23 additions & 18 deletions src/client/tile.h
Expand Up @@ -201,21 +201,21 @@ struct TileLayer
{
TileLayer():
texture(NULL),
normal_texture(NULL),
flags_texture(NULL),
shader_id(0),
texture_id(0),
color(),
animation_frame_length_ms(0),
animation_frame_count(1),
material_type(TILE_MATERIAL_BASIC),
material_flags(
//0 // <- DEBUG, Use the one below
MATERIAL_FLAG_BACKFACE_CULLING |
MATERIAL_FLAG_TILEABLE_HORIZONTAL|
MATERIAL_FLAG_TILEABLE_VERTICAL
),
shader_id(0),
normal_texture(NULL),
flags_texture(NULL),
animation_frame_length_ms(0),
animation_frame_count(1),
has_color(false)
has_color(false),
color()
{
}

Expand Down Expand Up @@ -286,27 +286,32 @@ struct TileLayer
&& (material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL);
}

// Ordered for size, please do not reorder

video::ITexture *texture;
u32 texture_id;
/*!
* The color of the tile, or if the tile does not own
* a color then the color of the node owning this tile.
*/
video::SColor color;
// Material parameters
u8 material_type;
u8 material_flags;
u32 shader_id;
video::ITexture *normal_texture;
video::ITexture *flags_texture;

// Animation parameters
u32 shader_id;

u32 texture_id;

u16 animation_frame_length_ms;
u8 animation_frame_count;

u8 material_type;
u8 material_flags;

//! If true, the tile has its own color.
bool has_color;

std::vector<FrameSpec> frames;

/*!
* The color of the tile, or if the tile does not own
* a color then the color of the node owning this tile.
*/
video::SColor color;
};

/*!
Expand Down

0 comments on commit 1ecc875

Please sign in to comment.