Hi,
I've got a performance issue: I'm working on an online graphical client which displays a map according to what the servers sends. The window has to display ~1500-2000 sprites at every frame, most of which does not change position nor texture.
The networking part takes 4µs in the loop, getting the objects from the EntitiesManager takes 35µs, drawing them takes also 4-5µs, but the call to RenderWindow::display() in the loop takes 80 000µs and therefore destroys my framerate.
What could be the reason of this problem? Too many sprites?
Here is my game loop:
// Launches the game
void GameEngine::run()
{
while(_window.isOpen())
{
if (_em != nullptr && _em->isEnded())
break;
else if (_em != nullptr && _camera == nullptr)
_camera = new ViewPoint(_em->getWidth(), _em->getHeight());
sf::Event e;
while (_window.pollEvent(e))
{
if (e.type == sf::Event::Closed)
_window.close();
if (e.type == sf::Event::MouseButtonPressed)
selectTarget(e.mouseButton.x, e.mouseButton.y);
if (e.type == sf::Event::KeyPressed)
{
if (e.key.code == sf::Keyboard::Escape)
_window.close();
if (e.key.code == sf::Keyboard::Left && _camera->getX() > 10)
_camera->setPos(glm::vec2(_camera->getX() - 1, _camera->getY()));
if (e.key.code == sf::Keyboard::Right && _camera->getX() < _em->getWidth() - 10)
_camera->setPos(glm::vec2(_camera->getX() + 1, _camera->getY()));
if (e.key.code == sf::Keyboard::Up && _camera->getY() > 10)
_camera->setPos(glm::vec2(_camera->getX(), _camera->getY() - 1));
if (e.key.code == sf::Keyboard::Down && _camera->getY() < _em->getHeight() - 10)
_camera->setPos(glm::vec2(_camera->getX(), _camera->getY() + 1));
}
}
_network->doSelect();
if (_network->isAlive())
{
std::list<std::string> msg = _network->getMessages();
for (auto it = msg.begin(); it != msg.end(); it++)
{
std::cout << *it << std::endl;
if ((*it).compare("BIENVENUE") == 0)
{
_network->addMessage(ASK_EVERYTNG);
std::cout << "Asking everything" << std::endl;
}
else
_parser->parse(*it);
}
}
else
{
std::cout << "Network dead" << std::endl;
break;
}
// if (_camera->hasTarget())
// _camera->updatePos();
_window.clear();
if (_em != nullptr && _camera != nullptr)
drawMap();
_window.display();
}
close(_server_fd);
}
(I know the networking/parsing part is kind of dirty but it's not the problem here :p)