Pętle Gry. rozwiązania dla gier realtime. Jan Darowski. 14 maja 2014

Podobne dokumenty
Unity 3D - pierwsze skrypty

Unity. Platforma do tworzenia gier dla różnych systemów docelowych, m.in.: Windows, macos, ios, Android, Powstała w 2005 r., obecnie wersja 5.3.

Architektura gier komputerowych na wybranych przykładach. Krzysztof Rosiński

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r

Referat Pracy Dyplomowej

Sieciowe Technologie Mobilne. Laboratorium 2

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie gier eventy. Dalton & Cartman KNTG Polygon, 21 grudnia 2015 r.

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Sieciowe Technologie Mobilne. Laboratorium 4

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Gry Komputerowe Laboratorium 3. Organizacja obiektów sceny Kolizje obiektów. mgr inż. Michał Chwesiuk 1/20. Szczecin, r

Zasoby. Musimy zaimportować zasoby dla gry z Asset Store

Uniwersytet Łódzki dla dzieci

Ćwiczenie 22 Dynamiczne wczytywanie tekstu z pliku.txt

Aplikacje mobilne. Pliki zasobów, grafiki, menu, podpinanie zdarzeń. dr Tomasz Jach Instytut Informatyki, Uniwersytet Śląski

PHP: bloki kodu, tablice, obiekty i formularze

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

Analiza i projektowanie obiektowe 2016/2017. Wykład 8: Przypisywanie obiektom odpowiedzialności (2)

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Zad. 6: Sterowanie robotem mobilnym

Wymagania edukacyjne z informatyki w klasie V

Unity 3D - efekty strzelania, koniec gry

Podstawowe elementy GUI cz. 2 i 3 - zadania

Interfejsy i klasy wewnętrzne

Ćwiczenie nr 8 - Modyfikacje części, tworzenie brył złożonych

Unity 3D - własny ekran startowy i menu gry

Pliki zorganizowano w strukturze drzewiastej odzwierciedlając strukturę logiczną aplikacji:

Metody optymalizacji soft-procesorów NIOS

Programowanie obiektowe

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Baza danych sql. 1. Wprowadzenie

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

R o g e r A c c e s s C o n t r o l S y s t e m 5

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 1. Krzysztof Lichota

Podstawy programowania w Qt4

Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.

Strzelanka dla dwóch graczy

Tworzenie prostych gier w programie GameMaker

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

Operatory logiczne. Podstawowe operatory logiczne, składanie wyrażeń z użyciem operatorów logicznych

Visual Basic Debugging and Error Handling

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Projektowanie obiektowe Wzorce projektowe

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Programowanie obiektowe

Język Java część 2 (przykładowa aplikacja)

Informatyzacja Przedsiębiorstw

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

ECDL Podstawy programowania Sylabus - wersja 1.0

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Symulacja samochodu z kamerą stereowizyjną. Krzysztof Sykuła 15 czerwca 2007

Zad. 5: Sterowanie robotem mobilnym

AJAX. Wykonał: Marcin Ziółkowski, AGH Kraków, AiR rok 5.

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Funkcje i instrukcje języka JavaScript

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Struktury systemów operacyjnych

Podstawy Programowania Obiektowego

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Podstawy technologii WWW

Brain Game. Wstęp. Scratch

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Encje w Drupalu. Tworzenie własnych encji i ich wpływ na poprawę wydajności

5.4. Efekty specjalne

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

D O K U M E N T A C J A

Języki i techniki programowania Ćwiczenia 4 Wzorce

Kurs WWW. Paweł Rajba.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Ekran główny. Słowniczek ilustrowany. Wybór gier. Koniec programu

Dlaczego GML? Gdańsk r. Karol Stachura

Zaawansowane programowanie w C++ (PCP)

Wstęp do Informatyki dla bioinformatyków

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Ćwiczenie 23 Praca z plikiem.psd

Zaawansowane programowanie w C++ (PCP)


Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Programowanie gier komputerowych Tomasz Martyn Wykład 4. Cykl produkcyjny wytwarzania gry (3): Prototypowanie gameplaya i UDK Kismet

Laboratorium 6 DIAGRAM KLAS (Class Diagram)

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Signals + Threads: Qt vs. Boost

Informatyzacja Przedsiębiorstw

Bezpieczeństwo systemów komputerowych. Java i JavaScript. Java i JavaScript. Java - historia

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Jarosław Kuchta Dokumentacja i Jakość Oprogramowania. Wymagania jakości w Agile Programming

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe - 1.

Klasy abstrakcyjne, interfejsy i polimorfizm

Transkrypt:

rozwiązania dla gier realtime 14 maja 2014

Problemy 1 Utrzymanie płynności gry 2 Różny charakter obiektów gry (budynek, gracz, system osiągnięć) 3 Rózne akcje wykonywane na poszczególnych obiektach (animowanie, wybieranie przeciwnika) 4 Synchronizacja ze światem zewnętrznym (użytkownik, inne instancje gry) 5 Sprawiedliwe aktualizowanie wszystkich obiektów (niezależnie od obciążenia) 6 Utrzymanie kolejności aktualizowania obiektów

Najprostsze rozwiązania while (1) { foreach ( GameObject & go, gameobjects ) go. update (); } Zależne od sprzętu Zależne od obciążenia Brak podziału wykonywanych akcji według częstotliwości

Najprostsze rozwiązania while (1) { wait ( lastupdate + INTERVAL - time ()); lastupdate = time (); } foreach ( GameObject & go, gameobjects ) go. update (); Zależne od obciążenia Brak podziału wykonywanych akcji według częstotliwości

Zmienny czas wywołania while (1) { foreach ( GameObject & go, gameobjects ) go. update ( time () - lastupdate ); lastupdate = time (); } Niezależne od obciążenia lub sprzętu 100% wykorzystanie procesora Konieczność implementacji obsługi czasu wewnątrz update() Dobre przy liczeniu fizyki i animacji - brak lagów

Wiele niezależnych pętli gry while (1) { wait ( lastupdate1 + INTERVAL - time ()); lastupdate1 = time (); foreach ( GameObject & go, gameobjects ) go. update11 (); foreach ( GameObject & go, gameobjects ) go. update12 (); if ( lastupdate2 + INTERVAL2 > time ()){ lastupdate2 = time (); } } foreach ( GameObject & go, gameobjects ) go. update2 (); Ponownie - zależność od obciążenia Możliwość rzadszego wykonywania ciężkich akcji

Rozwiązanie Ale w końcu mamy Qt i sensowne timery.

Rozwiązanie Ale w końcu mamy Qt i sensowne timery. Niezależność od sprzętu Pasuje do kodu sterowanego zdarzeniami Częściowa niezależność od obciążenia Możliwość updateowania różnych rzeczy co różny czas Dodatkowe nakłady na timery (wywoływane systemowo) Możliwość wykonywania ciężkich działań gdy procesor jest wolny (QtConcurrent) Brak kontroli nad kolejnością wykonywania działań

Predykcja zachowań Co zrobić kiedy obiektów gry jest zbyt dużo i nie nadążamy z ich aktualizacją? Udawać że aktualizujemy Koniecznie aktualizować grafikę Aktualizować fizykę (a przynajmniej część, np bez detekcji kolizji) Pomijać część informacji o zmianach, być może nie są już potrzebne (małe bufory na zdarzenia jednego typu)

Update() Do tej pory skupialiśmy się na samej strukturze pętli gry. Trzeba jednak zintegrować ją z odpowiednią implementacją obiektów. Możliwe podejścia:

Update() Do tej pory skupialiśmy się na samej strukturze pętli gry. Trzeba jednak zintegrować ją z odpowiednią implementacją obiektów. Możliwe podejścia: Obiekty zawierają tylko dane, aktualizuje je główna funkcja w pętli gry. Każda klasa opisująca jakiś obiekt zawiera osobną implementację update() Dziedziczenie funkcji update(). Być może wielodziedziczenie Strategie (Brainzzzz) Strategia na dekoratorach Animatory

Dziedziczenie update() 1 Problemy z wielodziedziczeniem 2 Możliwe nieintuicyjne dziedziczenia (budynek - statek matka) 3 Spora nadmiarowość kodu - niektóre akcje mogą mieć duże części wspólne 4 Długie ścieżki dziedziczenia - problemy w utrzymaniu kodu 5 Mnożenie liczby klas posiadających te same atrybuty przez niewielkie różnice w zachowaniu (żołnierz, żołnierz z super umiejętnościami)

Strategie - Brainzzzz Każdy obiekt posiada wskaźnik na swój mózg - obiekt opisujący działanie głównego obiektu 1 Możliwość oddzielenia opisu atrybutów od logiki 2 Znowu - dużo klas i wielodziedziczenie 3 Redundancja kodu 4 Możliwość zmiany zachowań obiektu w trakcie gry (uśpiony guardian, patrolujący, ścigający)

Dekoratory Sposób na zastąpienie dziedziczenia, można użyć zarówno na samym obiekcie jak i na jego mózgu.

Wady i zalety 1 Możliwość tworzenia dowolnych kombinacji obiekt - zachowanie 2 Brak dziedziczenia 3 Mała redundancja kodu 4 Brak sposobu na łatwe podzielenie akcji według okresu wykonywania 5 Możliwość pomyłki przy kolejności inicjowania dekoratora (złe zagnieżdżenie)

Animatory - pochodzenie Niektóre silniki, takie jak Irrlicht wykorzystują Animatory, rozwiązanie pozwalające szybko dodawać logikę typowych zachowań do dowolnego obiektu gry.

Animatory - pochodzenie Niektóre silniki, takie jak Irrlicht wykorzystują Animatory, rozwiązanie pozwalające szybko dodawać logikę typowych zachowań do dowolnego obiektu gry. 1 Animowanie kolejnych klatek 2 Zatrzymywanie się przy zderzeniu 3 Wchodzenie na niewielkie podwyższenia 4 Grawitacja Dodawanie animatora jest realizowane przez wywołanie metody silnika samej gry, na węźle danego obiektu.

Animatory - podstawowe założenia 1 Obiekty gry jedynie przechowują dane - nie zawierają logiki zachowań 2 Animatory są częścią silnika, nie obiektów 3 Każdy animator może działać na potencjalnie dowolnym obiekcie gry 4 Każdy obiekt może być obsługiwany przez wiele animatorów 5 Animatory mogą mieć różny czas aktualizacji 6 Animatory mają łatwy dostęp do danych zawartych w silniku (Gameplay) 7 Każdy animator dba o kolejność aktualizowanych przez siebie obiektów

Animatory - architektura Każdy animator posiada częstotliwość aktualizacji, priorytet, listę aktualizowanych obiektów i wskaźnik do Gameplay Gameplay inicjalizuje wszystkie animatory Dla każdego występującego czasu aktualizacji tworzy osobną warstwę Warstwa składa się z posortowanych po priorytecie animatorów i timera o odpowiednim okresie aktualizacji Timer co określony czas wywołuje update() wszystkich animatorów należących do danej warstwy Update() animatora polega na wykonaniu tej samej akcji na wszystkich obiektach z listy, zawsze w tej samej kolejności Animatory mogą korzystać ze swoich wyników zapisywanych w mapie QString - QVariant

Animatory - zady i walety Relatywnie mało timerów Dowolne mieszanie obiektów z zachowaniami Dopuszczalne różne czasy aktualizacji Stała kolejność aktualizowania obiektów Bezpieczeństwo wywołania animatorów gwarantowane globalnie, nie osobno dla każdego obiektu Krótki kod dodający nowy obiekt o typowym zachowaniu Brak pewności czy obiekt posiada parametry wymagane przez dany animator Niewygodne wczytywanie obiektów - konieczność niezależnego pamiętania animatorów dla każdego obiektu Łatwość debugowania - można dowolny, mały fragment działania obiektów testować niezależnie Brak redundancji kodu

Skryptowanie - Po co? Czemu dobrze jest skryptować fragmenty logiki gry? Brak konieczności rekompilacji przy niewielkich zmianach Możliwość szybszej pracy przy szlifowaniu zachowań i sprawdzaniu różnych wariantów Mniejsze wymagania dot. osoby pracującej nad logiką Ułatwia pisania kodu łatwego w dostosowaniu do innych projektów

Skryptowanie -Jak to robić poprawnie Skryptować jedynie najwyższą warstwę logiki Skrypty powinny być możliwie proste Skomplikowane fragmenty trzymać w kodzie - są od razu sprawdzane przez kompilator, są szybsze Skryptowane powinny być fragmenty, które wynikają z mechaniki opisywalnej graczowi Przekazywać minimum danych, z maksymalną wartością

Skryptowanie -Bridge Pattern Pozwala na niezależne łączenie rodzajów obiektów ze sposobami implementacji. Przykład: Animatory, Warunki zwycięstwa, Menu HUD Przykład Inkscape: Narzędzia rysowania, konwertery, filtry

Skryptowanie w Qt QScriptEngine engine ; QObject * someobject = new MyObject ; QScriptValue objectvalue = engine. newqobject ( someobject ); engine. globalobject (). setproperty (" myobject ", objectvalue ); engine. globalobject (). setproperty (" foo ", 123) ; qdebug () << engine. evaluate (" foo * 2 + myobject. scale "). tonumber ();

Skryptowanie w Qt QScriptEngine engine ; QObject * someobject = new MyObject ; QScriptValue objectvalue = engine. newqobject ( someobject ); engine. globalobject (). setproperty (" myobject ", objectvalue ); engine. globalobject (). setproperty (" foo ", 123) ; qdebug () << engine. evaluate (" foo * 2 + myobject. scale "). tonumber (); Connect: QScriptEngine eng ; QLineEdit * edit = new QLineEdit (...) ; QScriptValue handler = eng. evaluate ( "( function ( text ) { print ( text was changed to, text ); })"); q ScriptConnect ( edit, SIGNAL ( textchanged ( const QString &)), QScriptValue (), handler );

Dziękuję za uwagę.