Engine graficzny dla gry

0

Od jakiegos czasu pisze sobie gre mmorpg, tak z nudow zeby zobaczyc czy mi sie uda i czegos sie nauczyc przyokazji. Sam silnik graficzny dziala bez zarzutow, mapa sie ladnie scrolluje, animowane postacie, kolejka zdarzen (animowany scroll innych graczy po mapie), itd. Nawet dumny jestem z tego.

Ale problem zaczyna sie kiedy odpalam to na starszej maszynie, przy kilku niezaleznie poruszajacych sie graczach po mapie robi sie pokaz slajdów. Moj silnik dziala mniej wiecej tak:

  • Layer[0] = odrysowana mapa (wliczony 'margines' po kazdej stronie do scrollowania)
  • Layer[1] = siatka z innymi graczami
  • Buffer = Bufor z dwoma Layerami

Przy wywolaniu Game.Draw, dwa Layery leca do Buffera i z Buffera ekran ktory jest widoczny - bez marginesow - leci na TPaintBox.

Za kazdym razem kiedy wywoluje Game.Scroll uruchamiany zostaje Timer i wszystko sie odrysowuje kilka razy z Timera. Tak samo przy zmienianiu kolejki zdarzen np. scroll playera o jakims id na mapie to wywolywana jest kilkadziesiat razy funkcja do odrysowania wszystkiego i wyrzucenia bufora na PaintBox.

Działa. O dziwo calkiem szybko... Ale moglo by na starych maszynach dzialac rownie szybko.

Ma ktos pomysl jak to inaczej rozwiazac? Zamiast wywolywaniu Draw za kazdym razem kiedy potrzeba mozna by tylko updatowac Bufor i wyrzucac go na PaintBox w jakims Timerze...

Ma ktos jakies doswiadczeniu w pisaniu takich rzeczy?

PS. Mam nadzieje ze jasno to okreslilem, nie mam teraz mozliwosci wrzucenia kodu...

0

olej standardowego canvasa, zainstaluj g32 i działaj z nim, ew. gdi+. To jeśli chcesz zwykłą grafikę, możesz też spróbować coś DirecX-a albo OpenGL-a.

0
Misiekd napisał(a)

olej standardowego canvasa, zainstaluj g32 i działaj z nim, ew. gdi+. To jeśli chcesz zwykłą grafikę, możesz też spróbować coś DirecX-a albo OpenGL-a.

dx/opengl odpada. tylko softwareowo. ale to i tak sama zmiana bibliotek mi nie pomoze...

0

Podstawa szybkich enginów to nie korzystanie z timera. Po odrysowaniu każdej klatki dajesz obszarowi Invalidate czyli wymagasz, by odrysował się ponownie tak szybko, jak tylko kolejka komunikatów na to pozwoli.

Porzucenie timera ma jeszcze inne zalety, przede wszystkim gra nie traci szybkości a jedynie płynność na wolniejszych maszynach. Jeśli postać ma gdzieś dotrzeć w 3 sekundy, to dotrze - na szybkiej maszynie będzie tam po 180 klatkach, na wolnej po 30, ale gra nie zwolni tylko dlatego, że nasz komputer nie wyrabia. Z drugiej stron zawsze wyciągnie ile się da z komputera i nie będzie sytuacji, że masz wypasionego kompa, a gra chodzi tylko 25 klatek na sekundę, bo ktoś tak ustawił timer.

Druga sprawa - czemu tylko software'owo? Współcześnie nie ma już kart graficznych, które w ogóle nie obsługują akceleracji, choćby podstawowej, a przecież nikt Ci nie każe od razu rzucać się na shadery czy efekty cząsteczkowe - mówimy o prostym przerysowywaniu tekstur obrazu. Pamiętaj, że DX jest w Windows od czasów edycji 95, a ta epoka już kilkanaście lat za nami.. Pomyśl o tym.. Szybko nie zawsze oznacza z szybszymi bibliotekami, czasem to po prostu wykonanie operacji sprzętowo..

0

Jeśli to co zrobiłeś wrzucasz najpierw do bufora powinno być dość szybko.

Trzeba jedynie unikać Pixels[x, y], bo to wolne, najlepiej nie rysować linii, tylko bitmapy

Polecam DelphiX, da się szybko zrobić coś fajnego.
Nie trzeba się dużo męczyć

powodzenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1