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)
I'm having an issue when I run my program under Valgrind that seems related to my graphics driver but I also have it when I run OpenGL programs and my last OpenGL project did run smoothly without performance issue. I didn't use SFML back then though.
This is a part of a typical valgrind report when I use OpenGL-related graphical libraries:
==1757== Invalid write of size 8
==1757== at 0x4C2F5F3: memcpy@GLIBC_2.2.5 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1757== by 0xA8069BF: ??? (in /usr/lib/dri/fglrx_dri.so)
==1757== Address 0x7fa15b9da000 is not stack'd, malloc'd or (recently) free'd
==1757==
==1757== Invalid write of size 8
==1757== at 0x4C2F5F3: memcpy@GLIBC_2.2.5 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1757== by 0xA807019: ??? (in /usr/lib/dri/fglrx_dri.so)
==1757== by 0x4: ???
==1757== Address 0x7fa15b80dd00 is not stack'd, malloc'd or (recently) free'd
==1757==
==1757== Invalid write of size 8
==1757== at 0x4C2F5F3: memcpy@GLIBC_2.2.5 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1757== by 0x951F2BB: ??? (in /usr/lib/dri/fglrx_dri.so)
==1757== by 0x7: ???
==1757== by 0xB9C47BF: ???
==1757== by 0x4FFFFFFFFF: ???
==1757== by 0x100000000: ???
==1757== by 0xBB76700: ???
==1757== by 0xFFFFFFFFFFFFFFFE: ???
==1757== Address 0x7fa15b7e7300 is not stack'd, malloc'd or (recently) free'd
==1757==
==1757== Invalid write of size 2
==1757== at 0x4C2F63B: memcpy@GLIBC_2.2.5 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1757== by 0x9A71E00: ??? (in /usr/lib/dri/fglrx_dri.so)
==1757== by 0xBBB68CF: ???
==1757== by 0xBBB50EF: ???
==1757== by 0xBBB50EF: ???
==1757== by 0xBBB442F: ???
==1757== by 0xB90832F: ???
==1757== by 0xFFEFFDF3F: ???
==1757== by 0xFFEFFDD4F: ???
==1757== by 0x9DAF063: ??? (in /usr/lib/dri/fglrx_dri.so)
==1757== by 0xFFEFFE0AF: ???
==1757== by 0xFFEFFE09F: ???
==1757== Address 0x7fa15b7e7b00 is not stack'd, malloc'd or (recently) free'd
Compiling it in release mode instead of debug mode doesn't change the framerate :/
I tried using a server initialized with a 1*1 map (So only a few sprites) and the framerate doesn't change either...