c++ - Vector 中的 1000 多个游戏对象太慢了吗?我的错误是什么?

标签 c++ object for-loop vector render

我目前正在开发一款游戏,需要跟踪很多对象。

我有一个游戏对象类,它包含对象的所有必要信息,并在 update() 上处理 AI();

我决定,只有有大脑的物体才需要每一帧更新。所以我分离了 vector 以节省时间。但是,我在绘制对象时似乎找不到类似的解决方案。于是我得到了

std::vector<cOBJECT*> LivingObjects;

std::vector<cOBJECT*> WorldObjects;

绘制所有对象时,我首先将所有对象放入一个渲染列表中:

//Add World and Living Objects into one list of RenderObjects
RenderObjects = WorldObjects;
RenderObjects.insert(RenderObjects.end(), LivingObjects.begin(), LivingObjects.end());

然后我按 Y 对它们进行排序:

//Sort all Objects by Y (bottom) Coordiante
sort(RenderObjects.begin(), RenderObjects.end(), cmd);

这是它的代码(也许这也很慢?:

//Sorts by Y-Coordinaté
bool cmd(cOBJECT* obj1, cOBJECT* obj2)
{
    return obj1->getrect().y + obj1->getrect().h < obj2->getrect().y + obj2->getrect().h;
}

然后我画它们。绘图功能将检查它们是否在屏幕上!所以我只画可见的物体:

//DRAW OBJECTS and 
for (std::vector<cOBJECT*>::size_type i = 0; i != RenderObjects.size(); i++)
{
    RenderObjects[i]->render(Renderer, CameraX, CameraY, SCREEN_WIDTH, SCREEN_HEIGHT);
}

这是实际的绘制函数´:

int cTEXTURES::renderAnimation(int targetX, int targetY, double angle, SDL_Point* center, SDL_RendererFlip flip, SDL_Renderer* Renderer, int row, int speed, int offX, int offY, int SCREEN_HEIGHT, int SCREEN_WIDTH)
{
    //Draw if part of it shown on screen
    if (targetX - offX >= -FrameWidth && targetX - offX <= SCREEN_WIDTH + FrameWidth && targetY - offY >= -FrameHeight && targetY - offY <= SCREEN_HEIGHT + FrameHeight)
    {
        SDL_Rect SourceRect;
        SDL_Rect TargetRect;

        TargetRect = { targetX - offX, targetY - offY, FrameWidth, FrameHeight };

        SourceRect.x = (CurrentFrame - 1) * FrameWidth;
        SourceRect.y = (row - 1) * FrameHeight;
        SourceRect.w = FrameWidth;
        SourceRect.h = FrameHeight;

        if (OldTime + speed > SDL_GetTicks()) { SDL_RenderCopyEx(Renderer, TheTextureManager::Instance()->TextureList[TexturePath], &SourceRect, &TargetRect, angle, center, flip); return 0; }

        OldTime = SDL_GetTicks();

        //SDL_RenderCopyEx(Renderer, TheTextureManager::Instance()->TextureList[TexturePath], &SourceRect, &TargetRect, angle, center, flip);
        TheTextureManager::Instance()->draw(TexturePath, Renderer, &SourceRect, &TargetRect, angle, center, flip);
        CurrentFrame++;

        if (CurrentFrame == (Frames + 1))
        {
            CurrentFrame = 1;
            return 1; // returns 1 if one row is finished
        }

        return 0; // returns 0 if animation is not finished
    }
    return 0;
}

现在我有 1000 多个对象,以后甚至可能有 2000 多个。仅仅运行 for 循环来检查对象是否需要绘制是非常耗时的,对吧?

我错过了什么?我如何跟踪 1000 多个对象并知道是否要绘制它们而不需要 CPU 进行如此大量的工作?特别是因为我需要大量空间来放置大量 AI

谢谢,这让我抓狂。

最佳答案

为了加快调试构建中 STL 容器的迭代器(以及由于 header 解析而导致的编译时间),在包含其他任何内容(例如“windows.h” header )之前,在第一个 header (或预编译 header )中包含以下行):

#ifdef _WIN32
#   define _CRT_SECURE_NO_WARNINGS  // disable the Microsoft specific warnings about _s buffer underrun security issues for ISO methods (fopen, strcpy etc..)
#   define VC_EXTRALEAN             // cut down includes
#   define WIN32_LEAN_AND_MEAN      // cut down includes
#   undef _SECURE_SCL               // iterators generate less overhead code in debug
#   if _ITERATOR_DEBUG_LEVEL > 0
#       define _SECURE_SCL 1
#   else
#       define _SECURE_SCL 0
#   endif
#endif

如果链接到具有不同 iterator_debug_levels 的其他库,_iterator_debug_level 设置可能会有点棘手。

这将使您的调试构建运行得更快,但如果需要性能,通常需要重新审视容器的使用情况,如果您的操作复杂或具体。

关于c++ - Vector 中的 1000 多个游戏对象太慢了吗?我的错误是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28383109/

相关文章:

for-loop - 如何使用索引位置迭代 Vec<T>?

c++ - 在 MATLAB MEX 函数中链接 Cassandra/C++ 驱动程序库

c++ - 内联成员缺少返回时没有错误(VS2013)

c++ - Google Mock - 如何使用 EXPECT_CALL 返回不同的值以退出循环

c++ - 如何动态添加对象

java - 使用对象将值从一个 Activity 传递到另一个 Activity 并出现资源未找到错误。

c++ - MATLAB 代码与 C/C++ 集成时出现 fatal error

java - Java 中列表如何保存对象引用/值?

python - 在 Python 中,如何遍历字符串上正则表达式的所有匹配项?

javascript - 检索 JSON 变量的值