如何优化这个瓶颈Draw call?

时间:2014-05-13 17:57:59

标签: c# optimization xna draw xna-4.0

我描述了我的应用程序(一个游戏),我注意到这个函数是一个(!)瓶颈。特别是,由于它的含义,这个函数被称为很多:它绘制了我游戏摩天大楼的窗口。游戏是水平流动的,所以每当生成新的摩天大楼并且必须绘制窗户时。

方法很简单:我只加载一个窗口的图像,然后我像使用“模板”一样绘制每个窗口,同时我计算它在摩天大楼上的位置。

  • 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;
        }
    
    }
    

如您所见,该位置是在循环内计算的。

只是结果的一个例子(你可以看到我创建了三层摩天大楼):

An example of the result

如何优化此功能?

1 个答案:

答案 0 :(得分:3)

您始终可以将每个建筑渲染为纹理,并在屏幕上对其进行缓存。这样你只需为每栋建筑画一次窗户。在缓存之后,您将在一次通话中绘制整个建筑物,从而使您无需每帧一块一块地建造它。它应该可以防止大量过度抽取,你也得到了每一帧。但它的内存成本会很低。