Warning
This page is located in archive.

Semestrální práce

Cílem semestrální práce je napsat program splňující zadání a obecné požadavky. Práci je nutno vykonat zcela samostatně a odevzdat e-mailem v určeném termínu.

Přehled studentů a vybraných témat

Zadání

Zadání je stanoveno na základě domluvy studenta s cvičícím. Součástí zadání jsou stručné požadavky na funkčnost programu (např. “hra se postupně zrychluje”, nebo “úrovně jsou generovány automaticky”). Pokud některý požadavek nelze splnit, student a cvičící se musí domluvit na změně zadání. Pokud při kontrole nebude některý požadavek splněn, práce nebude přijata.

Příklady zadání viz. níže.

Obecné požadavky

Následující požadavky jsou povinné. Práce, která nesplňuje některý z těchto požadavků, nebude přijata.

  • Práce s pamětí musí být bezchybná. Nesmí docházet ke ztrátě paměti, zápisu a čtení z nealokované pamětí, přepisování zásobníku, apod. Analýza programem Valgrind, příp. jinými nástroji pro kontrolu práce s pamětí, musí proběhnout bez chyb a varování.
  • Styl a návrh programu nesmí ignorovat výhody standardu C++11 oproti předchozím standardům a jazyku C, zejména s ohledem na
    • typovou bezpečnost. Používání makra NULL, nebo typu void* je nepřijatelné.
    • správu prostředků. Používání funkce free, nebo příkazu delete bude považováno za značně podezřelé.
  • Program musí být přenositelný napříč architekturami a operačními systémy. Je zakázáno používat rozšíření jazyka podporovaná pouze některými kompilátory. Je zakázáno přímo používat rozhraní WINAPI a POSIX. (Zalinkovat knihovnu `pthread` do programu je povoleno, viz. níže.)
  • Program musí používat alespoň jednu externí knihovnu. Doporučené knihovny viz. níže.

Existují i nepovinné požadavky, jejich nesplnění může být penalizováno ztrátou bodů.

  • Aplikace by měla smysluplně využít více vláken, například:
    • Ke zvětšení výkonu paralelizací nezávislých výpočtů
    • Ke zvětšení výkonu rozdělením složitého výpočtu na podproblémy a jejich paralelního řešení
    • Zabránění zamrzání GUI tím, že se izoluje smyčka vykreslující GUI od provádění výpočtů

Odevzdání, termín a hodnocení

Semestrální práci je nutno odevzdat cvičícímu e-mailem. Tento e-mail musí obsahovat:

  • zdrojové soubory,
  • soubory popisující postup stavby programu: CMakeLists.txt, Makefile, nebo projektové soubory IDE (.vcxproj, apod.)
  • průvodní zprávu, která obsahuje:
    • popis aplikace,
    • návod, jak aplikaci ovládat, pokud to není zřejmé,
    • seznam knihoven potřebných k postavení programu. Pozor na to, že zaručujeme podporu pouze některých knihoven1). Nepodporované knihovny můžete též použít, ale musejí jít zkompilovat na Windows i běžných Linuxech a jejich kompilace musí být součástí vašeho build scriptu.

Pokud je potřeba vysvětlit složité součásti návrhu (velká funkce, komplikovaná třída), není nutné psát detaily do e-mailu, raději je pište do komentářů v kódu.

Nejzazší termín odevzdání je poslední den semestru, neděle 15. ledna 2016. Pozdní odevzdání je možné pouze ve výjimečných případech a po domluvě s cvičícím. Cvičící musí zareagovat do 7 dnů od přijetí odevzdané práce a sdělit studentovi hodnocení. Student může zlepšit svoje hodnocení opakovaným odevzdáním, ale pouze pokud opakované odevzdání proběhne před termínem. Pokud bylo předchozí odevzdání neúspěšné, student může odevzdat i po termínu.

Za semestrální práci je možné získat až 30 bodů. Práce ohodnocená alespoň 15 body je považována za úspěšně odevzdanou. Za velmi kvalitní práci může cvičící přidat i bonusové body nad 30.

Příklady zadání

Předmětem zadání nemusí být videohra – zkušenost ale praví, že při tvorbě grafických aplikací se lépe udržuje motivace při práci. (Pozor, i když si vyberete zadání z tohoto seznamu, cvičící ho musí schválit. Je to z toho důvodu, aby se zadání příliš neopakovala.)

  • Klon hry asteroids
    • rychlost hry je nezávislá na rychlosti procesoru
    • herní plán je toroidní
  • Klon hry pacman
    • rychlost hry je nezávislá na rychlosti procesoru
    • dvojí chování nepřátel: klasické a vlastní
  • Klon hry space invaders
    • rychlost hry je nezávislá na rychlosti procesoru
    • hra se postupně zrychluje
    • hra obsahuje nový, originální druh nepřítele
  • Klon hry block out (3D tetris)
    • rychlost hry je nezávislá na rychlosti procesoru
    • hra se postupně zrychluje
  • Klon hry pipes
    • rychlost hry je nezávislá na rychlosti procesoru
    • úrovně jsou generovány automaticky a jsou vždy řešitelné
  • Klon hry snake
    • rychlost hry je nezávislá na rychlosti procesoru
    • součástí hry je počítačem řízený protivník
  • Klon hry arkanoid
    • rychlost hry je nezávislá na rychlosti procesoru
    • pokročilá fyzika míče (míč má rotaci, pekáč má hybnost)
  • Klon hry sokoban
    • úrovně jsou generovány automaticky a jsou vždy řešitelné
    • hráč může vždy vrátit poslední krok
  • Conway's game of life
    • výpočet simulace probíhá paralelně ve více vláknech
  • Vykreslování fraktálů
    • vykreslování probíhá paralelně ve více vláknech
    • uživatel volí počet vzorků na pixel
    • výsledek lze uložit do souboru PNG

Příklad průvodního mailu

V příloze jsou všechny zdrojové soubory a VS2015 projekt pro kompilaci hry PONG, která používá Openframeworks (kompiloval jsem proti verzi 0.9.3). Hra je pro dva hráče, levá pálka je ovládána pomocí kláves E (nahorů) a D (dolů). Práva pálka se pak ovládá pomocí kláves O a L. Míček se též dá zastavit klávesou S a vrátit doprostřed obrazovky klávesou C. Šipkami se dá ovládat směr pohybu míčku. Míček se při každém odrazu od pálky zrychlí a je mu dána nová rychlost ve směru Y osy, v závislosti na místě dopadu na pálku a aktuální rychlosti ve směru osy X. Startovní směr a rychlost pohybu míčku po jeho propadnutí je generována náhodně.

Hra se přizpůsobuje měnící se velikosti okna tím, že se pálky přesunou na kraje roztáhnutého okna. Stejně tak se přizpůsobí na změnšení okna, ale nesmí se stát, že se tím dostane míček mimo nové rozměry okna.

Příloha

Pozor, ukázka v příloze je těsně na úrovni zápočtu, ne-li pod ní.

Podporované knihovny

Rady

Kompilace programů používající vlákna na Linuxu

Pokud pracujete na Linuxu a vidíte chybu s textem podobným undefined reference to `pthread_create', váš program nepůjde zlinkovat pokud kompilátoru nepředáte -pthread, třeba takto:

clang++ -std=c++14 -g -Wall -Wextra -pthread main.cpp

Kompilace programů používající vlákna v CLion IDE

Clion používá CMake a CMakeLists.txt pro kontrolu kompilace. Jako kompilátor ale používá buďto g++ nebo Clang, a tudíž je mu též potřeba říct, aby linkoval vlákna. Nejjednodušší způsob je v CMakeLists.txt změnit set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++14”) na set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++14 -pthread”).

Proměnlivá rychlost pohybu dle fps

Vzhledem k rychlosti dnešních strojů je nepravděpodobné, že se vám nepovede udržet fixních 60 fps. Nicméně stejně doporučujeme mít změny v polohách upravené dle rychlosti normalizované pro aktuální fps vaší hry. Toho můžete docílit například tak, že při přípravě nového framu spočítáte koeficient odpovídající rozdílu mezi očekávanou dobu framu a reálnou dobou posledního framu.

frame_rate_coefficient = target_fps / (1. / time_needed_for_last_frame);

1)
viz podporované knihovny
courses/a7b36pjc/ukoly/semestralka.txt · Last modified: 2017/01/31 11:39 by horenmar