Interfejs graficzny

Krótki post na temat mojego projektu interfejsu graficznego.

12.01.2019 21:00 Przemyślenia

Cześć. Nie pisałem o tym wcześniej, bo ogólnie nie mam za dużo czasu teraz i nie poświęcam za dużo czasu na moje własne projekty, ale mam taki jeden związany z interfejsem graficznym w bibliotece OpenGL.

W tym poście chciałbym krótko o nim napisać, bo akurat się trochę nad nim właśnie zastanawiałem i pomyślałem, że czemu by nie napisać, w końcu jak już zrobiłem takiego bloga, to dobrze jakbym na nim coś umieszczał :D

Celem mojego projektu jest napisanie małej biblioteki, która pozwalała by pisać alpikacje z graficznym interfejsem użytkownika dużo szybciej. Biblioteka oczywiście w C++, ponieważ w innych językach miało by to mniejszy sens, jako że w C# jest Windows Forms albo WPF, a w Javie ogólnie jest już dużo takich frameworków.

Oczywiście zaraz ktoś mi powie, że w C++ jest sobie np. Qt więc też nie ma po co tego robić. Noooo, może trochę tak, ale ja lubię pracować nad takimi interfejsami i chciałbym zrobić własny interfejs, który następnie mógłbym wykorzystywać w moich aplikacjach i grach.

Interfejs ma być raczej prosty, ale zoptymalizowany zarówno dla gier (albo symulatorów) jak i dla programów narzędziowych. Ogólnie oznacza to, że nie będzie rysowany niepotrzebnie wielokrotnie jeśli nie będzie takiej potrzeby. Będzie odrysowywany jedynie podczas zmian stanu.

Tak jak napisałem na początku, akurat się zastanawiałem nad pewną rzeczą w tym moim interfejsie. Aktualnie jest gotowa cała podstawa logiki, odrysowywanie i te wszystkie mniej ciekawe rzeczy :P Natomiast niestety natrafiłem na taki mały, aczkolwiek istotny problem.

Chciałbym, aby program z moim interfejsem miał przynajmniej 3 wątki. Jeden wątek będzie obsługiwał urządzenia wejściowe (klawiatura, mysz itp.), drugi wątek będzie odrysowywał konkretny obszar okna, a trzeci wątek, będzie to wątek animatora, w którym obliczane będą aktualnie trwające animacje.

Wydawało by się, że wszystko jest ok i w ogóle, ale niestety problem polega na tym, że tylko jeden wątek może wykorzystywać funkcje OpenGL. O ile animator nie musi ich wykorzystywać (bo działa jedynie na obiektach interfejsu, bufory mogą być zmieniane później), to wątek rysujący na pewno musi (ale to nie problem, bo on z założenia musi) a dodatkowo wątek obsługujący zdarzenia też raczej powinien.

Dlaczego zdarzenia mają wymagać funkcji OpenGL? W końcu nic raczej nie będzie podczas nich rysowane, bo to robi wątek rysujący... No tak, ale prawdopodobnie zdarzenia będą w jakiś sposób oddziaływać na całość aplikacji. Może się zdarzyć, że jakieś zdarzenie będzie musiało stworzyć nową kontrolkę, a podczas jej tworzenia, musi zostać stworzony także bufor. I tutaj pojawia się ten problem, ponieważ bufory tworzone są już bezpośrednio w OpenGL.

Musi być jakieś wyjście z tej sytuacji. Najlepiej byłoby pewnie napisać jakiś abstrakcyjny renderer, który by się tym wszystkim zajmował, ale jeszcze nie wiem do końca jak go napisać, żeby nie ograniczyć sobie za bardzo możliwości jakie daje czysty OpenGL.

Myślę, że jeszcze jakoś uda mi się to rozwiazać. Na razie mam zamiar pomyśleć nad jakimś rozsądnym prostym wyjściem, a jeśli takiego nie znajdę, to trudno, będzie bardziej skomplikowane. Na razie to tyle co chciałem napisać. Dzięki za przeczytanie (jeśli doczytałeś do końca) i życzcie mi powodzenia. Znaczy nie musicie, ale ja i tak postaram się coś wymyślić i na pewno wymyślę.