【问题标题】:SpriteSheet Animation -> Lag?SpriteSheet 动画 -> 滞后?
【发布时间】:2013-10-27 14:51:09
【问题描述】:

所以我为我正在制作的游戏制作了一个精灵表动画,但由于某种原因它大大落后于我的游戏。

精灵表是一个 1248x120 的 .png 文件,每个精灵的大小为 156x120 像素。

我用来制作动画的代码:

    void Entity::AnimateHorizontal(sf::Texture tex, int width, int hight)
    {
    sprite.setTextureRect(sf::IntRect(source.x * width, 0, width, hight));
    frameCounter += frameSpeed * frameTimer.restart().asSeconds();
    if (frameCounter >= switchFrame)
        {
            frameCounter = 0;
            source.x++;
            if (source.x * width >= tex.getSize().x) source.x = 0;
        }
}

还有:

Object.AnimateHorizontal(tex_Mech1Feet,156,120);

在我的游戏循环中。

FPS 只是加载工作表,没有动画:Click me!

带有动画表的 FPS:Click me!

另外请注意,这是我目前在我的游戏中实际做的唯一事情,所以它绝对不应该落后这么糟糕。

在使用 C++ 编程方面,我仍然是一个完全的新手,所以请多多包涵。

话虽如此,我很感激任何和所有的建议,在此先感谢!

【问题讨论】:

    标签: c++ animation sprite sfml


    【解决方案1】:

    void Entity::AnimateHorizontal(sf::Texture tex, int width, int hight)

    您每次都在复制纹理。这可能是性能瓶颈。请改用 (const) 引用。

    我的一般建议:使用分析器来了解您的程序在哪个函数上花费了多少时间。这样您就可以直接知道要查看的位置。

    【讨论】:

    • 这似乎无法解决问题,因为sf::Texture tex 仅用于获取精灵表的大小以检查它是否已到达末尾并应该循环,我不不知道如何使用 const 来引用它会做任何事情。如果有任何东西正在复制纹理,那将是 sprite.setTextureRect 命令(但 afaik setTextureRect 甚至没有设置纹理。我为此使用 (!tex.loadFromFile("Data/graphics/sprites/spritesheet.png")) return;setTextureRect 应该只设置使用纹理的哪一部分,不是吗?)。我应该怎么做?
    • 另外,如果我把 sprite sheet 变小,我又会接近 60 fps,可能是我的 sprite sheet 太大或者我的处理器太慢了吗? (很难相信,运行 i5 2500k @ 4.2ghz)
    • 不,当您调用AnimateHorizontal() 时会复制纹理。此外,即使您只使用getSize(),编译器必须复制整个纹理。还要记住,纹理存储在您的图形内存中。你的处理器能力在这里几乎没有任何关系。 (有很多技术细节我不会介绍。)
    • 顺便说一句,如果您还是初学者,我强烈推荐其中一本书。它会让你的生活变得更轻松。 stackoverflow.com/questions/388242/…
    • 如果是我的 GPU 压力过大,为什么我的 TaskManager 说我的 CPU 在我的应用程序上使用了 40%?另外,感谢您的书籍​​推荐,我一定会去看看。
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 2012-04-21
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多