2015-02-07 62 views
5

我目前正在开发一款游戏,需要跟踪很多对象。我有一个游戏对象类,其中包含对象的所有必要信息,并在update()上处理AI()。Vector中的1000+游戏对象速度太慢?我的错误是什么?

我决定,只有拥有大脑的物体,每一帧都需要更新。所以我分开了矢量来节省时间。但是,我似乎无法在绘制对象时找到类似的解决方案。所以我就

std::vector<cOBJECT*> LivingObjects; 

std::vector<cOBJECT*> WorldObjects; 

当绘制所有对象,我第一次把所有的对象在RenderList:

//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); 
} 

下面是实际的平局function':

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

谢谢,这让我感到非常紧张。

+0

你可以分析你的程序吗? – Axalo 2015-02-07 14:15:26

+0

@Axalo:我正在使用Visual C++ Express。据我所知,它不允许我。 – cedifra 2015-02-07 14:19:10

+11

你*测量一个发布版本,对吧? – Angew 2015-02-07 14:27:58

回答

1

为了加速stl容器在调试版本中的迭代(以及由于头文件解析导致的编译时间),在包含其他东西(如“windows.h”)之前,在第一个头文件(或预编译头文件)头):

#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设置可以是有点棘手。

这将使您的调试版本运行速度提高很多,但如果需要性能,那么通常需要再次查看容器的使用情况,最后如果您的操作复杂或具体。