我目前正在开发一款游戏,需要跟踪很多对象。我有一个游戏对象类,其中包含对象的所有必要信息,并在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
谢谢,这让我感到非常紧张。
你可以分析你的程序吗? – Axalo 2015-02-07 14:15:26
@Axalo:我正在使用Visual C++ Express。据我所知,它不允许我。 – cedifra 2015-02-07 14:19:10
你*测量一个发布版本,对吧? – Angew 2015-02-07 14:27:58