Autor Wątek: CEGUI - problem z wydajnością  (Przeczytany 1366 razy)

Offline Dethas

  • Użytkownik

# Maj 04, 2016, 13:29:38
Witam,
używam SDL + OpenGL, a ostatnio postanowiłem dodać sobie obsługę przycisków i ogólnie interfejsu.
W swoim programie wyświetlam kilka bloków i postać którą można się poruszać, za fizykę odpowiada Box2D.
Wszystko chodziło płynnie i gładko dopóki nie stworzyłem kilku przycisków za pomocą CEGUI które pojawiają się na ekranie jak włączę DEBUG MODE. Na słabym komputerze(Procek 2x2.0, Radeon hd3000, 2gb ram) mam spadek fpsów i nawet jeśli jest ich i tak 60+ to gra się tnie. Na mocnym komputerze(Procek 4x3.2, Radeon 7770HD, 4gb ram)
nie widać spadku fpsów ale gra mimo 800+ fps nie chodzi już gładko. Prawie tego nie widać ale gra zachowuje się jak by miała 40 - 50 fps, ogólnie jest różnica między DEBUG MODE a NORMAL MODE. Wiem że powodem jest funkcja CEGUI setText() którą wywołuje gdy zmienia się napis na przycisku, zrobiłem do tego prostą klasę które sprawdza czy tekst się zmienił czy też nie, ale problem mimo to występuje. Przeszukałem internet ale nie znalazłem niczego co mogłoby mi pomóc(może coś przeoczyłem). Jeśli ktoś orientuje się w temacie to proszę o pomoc. Oto mój kod odpowiedzialny za wyświetlanie wszystkiego w grze:
int Engine::Run() {
if (!Init() || !OnInit()) {
return -1;
}

SDL_Event events;
while (isRunning) {
while (SDL_PollEvent(&events)) {
OnEvent(&events);
}
UpdateLoop(); // tutaj CEGUI::System::getSingleton().injectTimePulse(time.GetDeltaTime());
delta time jest stała 1/60, używam fixedTimestep ale próbowałem też z faktyczną deltą, ale dziwne lagi nadal występują.
                OnInput();
Render();
}
Cleanup();

return 0;
}

Tutaj obsługa CEGUI:
void GUI::Init(const std::string& _resourceDir) {
if (renderer == nullptr) {
renderer = &CEGUI::OpenGL3Renderer::bootstrapSystem();

CEGUI::DefaultResourceProvider *drp = static_cast<CEGUI::DefaultResourceProvider*>(CEGUI::System::getSingleton().getResourceProvider());
//Tutaj ustawiam resourceProvider, to na pewno działa dobrze bo przyciski mimo wszystko się pojawiają
}

context = &CEGUI::System::getSingleton().createGUIContext(renderer->getDefaultRenderTarget());
root = CEGUI::WindowManager::getSingleton().createWindow("DefaultWindow", "root");
context->setRootWindow(root);
}

// Tutaj jeszcze pominięta inicializacjia widgetów.

void GUI::Draw() {
renderer->beginRendering();

context->draw();

renderer->endRendering();
}

No i moja prosta klasa do sprawdzania czy tekst na przycisku się zmienił czy nie:

class Button {
private:
CEGUI::Window *button;
int storedNumber = 0;
CEGUI::String storedText;

public:
void Init(CEGUI::Window *_button, CEGUI::String _text) {
button = _button;
button->setText(_text);
storedText = button->getText();
}

bool CheckTextUpdate(int _number) {
if (storedNumber == _number) {
return false;
}
else return true;
}

void Update(int _number) {
if (CheckTextUpdate(_number)) {
storedNumber = _number;
button->setText(storedText + to_string(storedNumber));
}
}
};

Jestem pewien że coś robię źle, bo wszyscy polecają tą bibliotekę i większość osób ją chwali pod względem wydajności. Pozdrawiam!

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Dethas

  • Użytkownik

# Maj 16, 2016, 14:42:10
Odświeżam ;] nadal mam sporo problemów z wydajnością CEGUI, poprawiłem ją trochę zmieniając tylko część tekstu ale nadal dzieją się dziwne rzeczy, na przykład na słabym komputerze gdy najeżdżam szybko na przyciski wydajność spada z 60 fps do 2-6 fps, nie jest to zbyt ciekawe bo widać że interfejs nie daje rady...

Offline Dethas

  • Użytkownik

# Wrzesień 08, 2016, 15:57:41
Okazuje się że CEGUI nie radzi sobie dobrze z dynamiczną zmianą tekstu, stąd spadki fps, stworzyłem więc własną klasę która się tym zajmuje w najprostszy możliwy sposób. Jeśli jednak ktoś wie jak można poprawić wydajność CEGUI prosiłbym o odpowiedź. Pozdrawiam!