我描述了我的应用程序(一个游戏),我注意到这个函数是一个(!)瓶颈。特别是,由于它的含义,这个函数被称为很多:它绘制了我游戏摩天大楼的窗口。游戏是水平流动的,所以每当生成新的摩天大楼并且必须绘制窗户时。
方法很简单:我只加载一个窗口的图像,然后我像使用“模板”一样绘制每个窗口,同时我计算它在摩天大楼上的位置。
position_
是起始位置,基于我想要开始绘制的左上角n_horizontal_windows_
和n_vertical_windows_
是不言自明的,它是在构造函数skipped_lights_
是bool
的矩阵,表示该特定灯是打开还是关闭(关闭意味着不绘制窗口)delta_x
就像填充,窗口和另一个窗口之间的距离。 w_window
是窗口的宽度(每个窗口都相同)
public override void Draw(SpriteBatch spriteBatch)
{
Vector2 tmp_pos = position_;
float default_pos_y = tmp_pos.Y;
for (int r = 0; r < n_horizontal_windows_; ++r)
{
for (int c = 0; c < n_vertical_windows; ++c)
{
if (skipped_lights_[r, c])
{
spriteBatch.Draw(
window_texture_,
tmp_pos,
overlay_color_);
}
tmp_pos.Y += delta_y_;
}
tmp_pos.X += delta_x_ + w_window_;
tmp_pos.Y = default_pos_y;
}
}
如您所见,该位置是在循环内计算的。
只是结果的一个例子(你可以看到我创建了三层摩天大楼):
如何优化此功能?
答案 0 :(得分:3)
您始终可以将每个建筑渲染为纹理,并在屏幕上对其进行缓存。这样你只需为每栋建筑画一次窗户。在缓存之后,您将在一次通话中绘制整个建筑物,从而使您无需每帧一块一块地建造它。它应该可以防止大量过度抽取,你也得到了每一帧。但它的内存成本会很低。