慢速C ++ DirectX 2D游戏

时间:2010-01-28 21:26:24

标签: c++ optimization graphics directx sprite

我是C ++和DirectX的新手,我来自XNA。 我开发了像Fly The Copter这样的游戏。 我所做的是创建了一个名为Wall的类。 在比赛开始的时候,我画了所有的墙。 在XNA中,我将墙存储在ArrayList中,而在C ++中我使用了vector。 在XNA中,游戏运行速度很快,在C ++中运行速度非常慢。 这是C ++代码:

void GameScreen::Update()
{
    //Update Walls
    int len = walls.size();
    for(int i = wallsPassed; i < len; i++)
    {
        walls.at(i).Update();
        if (walls.at(i).pos.x <= -40)
            wallsPassed += 2;
    }
}

void GameScreen::Draw()
{
    //Draw Walls
    int len = walls.size();
    for(int i = wallsPassed; i < len; i++)
    {
        if (walls.at(i).pos.x < 1280)
            walls.at(i).Draw();
        else
            break;
    }
}

在Update方法中,我将X值减少4。 在Draw方法中,我调用sprite-&gt; Draw(Direct3DXSprite)。 这是游戏循环中唯一运行的代码。 我知道这是一个糟糕的代码,如果你有想法改进它,请帮忙。 谢谢,抱歉我的英语。

8 个答案:

答案 0 :(得分:8)

尝试用[]运算符替换所有出现的at()。例如:

 walls[i].Draw();

然后打开所有优化。 []和at()都是函数调用 - 以获得所需的最大性能,以确保它们被内联,这是优化级别将要执行的操作。

您还可以对墙对象进行一些最小的缓存 - 例如:

 for(int i = wallsPassed; i < len; i++)
 {
    Wall & w = walls[i]; 
    w.Update();
    if (w.pos.x <= -40)
        wallsPassed += 2;
 }

答案 1 :(得分:2)

尝试缩小性能问题的原因(也称为性能分析)。我会尝试只绘制一个对象,同时继续更新所有对象。如果它突然变得更快,那么它就是一个DirectX绘图问题。

否则尝试绘制所有对象,但只更新一个墙。如果它更快,那么你的update()函数可能太贵了。

答案 2 :(得分:1)

  • '快'有多快?
  • 慢得多慢?
  • 你画了多少精灵?
  • 每个人作为图像文件有多大,以及在屏幕上绘制的像素?
  • 当您更改绘制的精灵数量时,性能如何缩放(在XNA / C ++中)?
  • 如果您在没有更新的情况下绘制,或者反之亦然,您会得到什么区别

答案 3 :(得分:1)

也许你只是忘记打开发布模式:)我以前遇到过一些问题 - 我认为我的代码因为调试模式而非常慢。如果不是它,您可能会遇到渲染零件或大量对象的问题。您提供的代码看起来不错......

答案 4 :(得分:0)

您是否为位图尝试了多个缓冲区(a.k.a. Double Buffering )?

典型情况是在一个缓冲区中绘制,然后在将第一个缓冲区复制到屏幕时,在第二个缓冲区中绘制。

另一种技巧是在内存中拥有一个巨大的“逻辑”屏幕。物理显示中的部分绘制是视口视图逻辑屏幕中的一个小区域。移动背景(或屏幕)只需要图形处理器的副本。

答案 5 :(得分:0)

您可以帮助批量精灵绘制调用。据推测,您的绘图调用会使用相关参数调用您唯一的ID3DXSprite :: Draw实例。

通过调用ID3DXSprite :: Begin(设置了D3DXSPRITE_SORT_TEXTURE标志),然后在完成所有渲染后调用ID3DXSprite :: End,可以大大提高性能。然后,ID3DXSprite将按纹理对所有精灵调用进行排序,以减少纹理开关的数量并将相关调用一起批处理。这将大大提高性能。

但是,如果没有看到Update和Draw调用的内部结构,很难说更多。以上只是一个猜测...

答案 6 :(得分:0)

用不同的绘制调用绘制每一面墙是一个坏主意。尝试将数据批处理到单个顶点缓冲区/索引缓冲区中,并将它们发送到单个绘图中。这是一个更明智的想法。

无论如何要了解为什么它会慢慢尝试使用一些CPU和GPU(PerfHud,英特尔GPA等等)首先要知道什么是瓶颈(如果是CPU或GPU)。然后你可以努力缓解这个问题。

答案 7 :(得分:0)

查找您的墙壁列表不太可能成为您减速的源头。以3D形式绘制对象的成本通常是限制因素。

重要的部分是您的绘图代码,用于创建DirectX设备的标志以及用于创建纹理的标志。我在黑暗中刺伤...检查你是否将设备初始化为HAL(硬件3d)而不是REF(软件3d)。

另外,你画了多少精灵?每次抽奖都有相当大的开销。如果你每帧超过几百,这将是你的限制因素。

相关问题