BEÁGYAZOTT RENDSZEREK ALAPJAI. Grafikus benchmark alkalmazás

Hasonló dokumentumok
OOP: Java 8.Gy: Abstract osztályok, interfészek

C#, OOP. Osztályok tervezése C#-ban

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

JAVA PROGRAMOZÁS 2.ELŐADÁS

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Java programozási nyelv 5. rész Osztályok III.

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Objektumorientált programozás C# nyelven

BME MOGI Gépészeti informatika 14.

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozás II gyakorlat. 6. Polimorfizmus

Tervminták a valósidejű gyakorlatban

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

BME MOGI Gépészeti informatika 8.

Informatika terméktervezőknek

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Objektumok és osztályok. Az objektumorientált programozás alapjai. Rajzolás tollal, festés ecsettel. A koordinátarendszer

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

BME MOGI Gépészeti informatika 15.

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

Ugráló gomb oktatási segédlet Ugráló gomb

Objektumorientált programozás C# nyelven

Osztályok. 4. gyakorlat

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Java és web programozás

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Programozás I. Grafika Eseménykezelés. Programozás I. 2. gyakorlat Interakció a grafikus felületen, tagfüggvények. Surányi Márton PPKE-ITK

I. Objektumorientált programozás

Gyakorlati vizsgatevékenység A

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Java grafikai lehetőségek

OOP #14 (referencia-elv)

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

A Microsoft Visual Studio 2005 fejlesztőkörnyezet

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

BME MOGI Gépészeti informatika 7.

C# osztályok. Krizsán Zoltán

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Abstract osztályok és interface-ek. 7-dik gyakorlat

Tájékoztató. Használható segédeszköz: -

BME MOGI Gépészeti informatika 6.

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Programozási technológia

C++ programozási nyelv

Java II. I A Java programozási nyelv alapelemei

Objektumorientált programozás C# nyelven

Entity Framework + LINQ oktatási segédlet

C++ programozási nyelv

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Java programozási nyelv 4. rész Osztályok II.

Programozás I. Első ZH segédlet

Általános áttekintés. Általános áttekintés

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

17. Többdokumentumos alkalmazások készítése..3 A többdokumentumos felület...3. A program elkészítése...27

Elemi Alkalmazások Fejlesztése II.

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Objektumorientált programozás C# nyelven

Swing GUI készítése NetBeans IDE segítségével

Programozási nyelvek JAVA EA+GY 1. gyakolat

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Bevezetés a Python programozási nyelvbe

Programozási nyelvek II.: JAVA

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Szoftvertechnológia 4. előadás. Objektumorientált tervezés: általánosítás. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

2D képszintézis. Szirmay-Kalos László

II. Programozási technológiák

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Felhasználó által definiált adattípus

Java VII. Polimorfizmus a Java nyelvben

Programozási nyelvek II.: JAVA

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Java VII. Polimorfizmus a Java nyelvben

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Kalapácsvetés 2016 szöveges

Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása

INFORMATIKAI ALAPISMERETEK

Programozási nyelvek Java

OOP: Java 5.Gy: Osztály, referencia, konstruktor

A C# PROGRAMOZÁSI NYELV

Rajz 01 gyakorló feladat

JAVA PROGRAMOZÁS 3.ELŐADÁS

Objektumorientált programozás C# nyelven III.

libgdx alapok, első alkalmazás

Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök Gyakorló feladatok V 1.0 ÓE-NIK-AII,

A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

C++ programozási nyelv Konstruktorok-destruktorok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

OOP: Java 8.Gy: Gyakorlás

JAVA SE/ME tanfolyam tematika

Átírás:

BEÁGYAZOTT RENDSZEREK ALAPJAI Grafikus benchmark alkalmazás

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 2 A laborfoglalkozás célja A foglalkozás célja egy grafikus benchmark alkalmazás elkészítése, egyszerű alakzatok rajzolásával A megjelenítendő objektumok a program elején kerülnek létrehozásra, típusuk véletlenszerű Minden egyes jelenet kirajzolása előtt a grafikus objektumok véletlenszerűen kiválasztott, új pozíciót vesznek fel A rajzolásra fordított időt mérjük, és kiszámítjuk az FPS (Frame Per Secundum) értéket, tehát azt, hogy az eszköz 1 másodperc alatt hányszor tudott új jelenetet generálni és azt kirajzolni

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 3 A laborfoglalkozás menete 1. A hardver konfiguráció összeállítása 2. Osztályhierarchia kialakítása 3. A program terve 4. Implementálás 5. Tesztelés

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 4 A hardver konfiguráció összeállítása Állítsuk össze a következő konfigurációt:

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 5 Új alkalmazás létrehozása Hozzunk létre egy új Gadgeteer alkalmazást GraphicsBenchmark néven:

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 6 Osztályhierarchia kialakítása Az összes grafikus objektum egy új kódfájlba fog kerülni: Shapes.cs Ennek létrehozásához kattintsunk a GraphicsBenchmark projektre a jobb-egérgombbal, majd az Add/New Item menüpontra A megjelenő ablakban válasszuk ki a Class elemet, alul pedig adjuk meg névnek a következőt: Shapes.cs

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 7 Osztályhierarchia kialakítása Ha mindent jól csináltunk, akkor egy fájl jött létre, melynek tartalma új ablakban jelenik meg: using System; using Microsoft.SPOT; namespace GraphicsBenchmark class Shapes Az alakzatok ismerik saját típusukat, melyet egy ShapeType nevű enum segítségével fogunk tárolni: enum ShapeType Circle, Rectangle, Triangle

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 8 Osztályhierarchia kialakítása Egyetlen fájlban definiáljuk az összes alakzatot, ezért az osztály neve Shape lesz az eredetileg felkínált Shapes helyett (az s betűt töröljük ki az osztály nevéből) A Shape osztály lesz az összes grafikai alakzat ősosztálya

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 9 Osztályhierarchia kialakítása abstract class Shape public int X get; set; public int Y get; set; public int Width get; set; public int Height get; set; public ShapeType Type get; private set; public Gadgeteer.Color Color get; set; public Shape(ShapeType shapetype) this.type = shapetype; public abstract void DrawToBitmap(Bitmap bitmap); abstract class Shape: az alakzatot reprezentáló absztrakt osztály public int X: az alakzat X koordinátája a képernyőn public int Y: az alakzat Y koordinátája a képernyőn public int Width: az alakzat szélessége pixelben public int Height: az alakzat magassága pixelben public ShapeType Type: az alakzat típusa (a private set minősítő azért kell, hogy a példányosítást követően ne lehessen módosítani az alakzat típusát public Gadgeteer.Color Color: az alakzat színe public Shape(ShapeType shapetype): konstruktor, amely paraméterként vár egy ShapeType típusú változót(ezzel a módszerrel kikényszerítjük, hogy az objektum létrehozásakor mindenképpen definiálva legyen a létrehozandó alakzat típusa) this.type = shapetype: beállítjuk az objektum típusát public abstract void DrawToBitmap(Bitmap bitmap): az alakzat kirajzolja önmagát a bitmap nevű bitképre. Ez a metódus absztrakt, tehát a leszármazott implementálja, hogy hogyan kell kirajzolnia önmagát.

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 10 Osztályhierarchia kialakítása Definiáljunk háromféle alakzatot: Kör (Circle) Négyzet (Rectangle) Háromszög (Triangle) Az osztályhierarchia kialakításával minden alakzat (leszármazott) számára előírjuk a kirajzolás módját (DrawToBitmap() metódus) Minden osztály konstruktorából meghívjuk az őskonstruktort, melyben paraméterül át kell adni az alakzat típusát (típus definiálása)

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 11 Osztályhierarchia kialakítása class Circle: Shape public Circle() : base(shapetype.circle) public override void DrawToBitmap(Bitmap bitmap) int halfwidth = Width / 2; int halfheight = Height / 2; bitmap.drawellipse(color, X + halfwidth, Y + halfheight, halfwidth, halfheight); class Rectangle: Shape public Rectangle() : base(shapetype.rectangle) public override void DrawToBitmap(Bitmap bitmap) bitmap.drawrectangle(color, 1, X, Y, Width, Height, 1, 1, Color, 1, 1, Color, 1, 1, 255); class Triangle: Shape public Triangle() : base(shapetype.triangle) public override void DrawToBitmap(Bitmap bitmap) int downy = Y + Height; int rightx = X + Width; int centerx = X + Width / 2; bitmap.drawline(color, 1, X, downy, rightx, downy); bitmap.drawline(color, 1, X, downy, centerx, Y); bitmap.drawline(color, 1, centerx, Y, rightx, downy);

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 12 Osztályhierarchia kialakítása A teljes rendszer osztálydiagramja (metódusok ábrázolása nélkül): Shape: alakzatokat definiáló ősosztály Triangle, Circle, Rectangle: alakzat leszármazottak Program: a programot reprezentáló, futtatást végző osztály Resources: erőforrásokat tartalmazó osztály (tervező generálja) ShapeType: az alakzatok típusát meghatározó enum

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 13 A program terve A program futtatása során a következő műveleteket kell elvégezni: 1. Inicializálás a) kijelző méret lekérdezése b) buffer létrehozása c) alakzatok létrehozása, inicializálása 2. Alakzatok rajzolása a buffer-be (Bitmap) 3. Buffer kirajzolása a képernyőre

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 14 Implementálás A futtatást végző Program osztályt (Program.cs) a következő mezőkkel kell kiegészíteni: public partial class Program int screenwidth; int screenheight; Shape[] shapes; Bitmap renderbitmap; int screenwidth: a kijelző szélességét tároló változó int screenheight: a kijelző magasságát tároló változó Shape[] shapes: az alakzat objektumokat tároló tömb Bitmap renderbitmap: buffer a rajzoláshoz

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 15 Implementálás 1. Inicializálás: void ProgramStarted() screenwidth = (int) display.width; screenheight = (int) display.height; renderbitmap = new Bitmap(screenWidth, screenheight); InitShapes(); Render(); Debug.Print("Program Started");

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 16 Implementálás 1. Inicializálás: void InitShapes() shapes = new Shape[3]; shapes[0] = new Circle() X = 10, Y = 20, Width = 10, Height = 10, Color = GT.Color.Red ; shapes[1] = new Rectangle() X = 10, Y = 100, Width = 10, Height = 10, Color = GT.Color.Yellow ; shapes[2] = new Triangle() X = 10, Y = 180, Width = 10, Height = 10, Color = GT.Color.White ;

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 17 Implementálás 2. Alakzatok rajzolása a buffer-be: void DrawToBitmap() for (int i = 0; i < shapes.length; ++i) Shape actualshape = shapes[i]; actualshape.drawtobitmap(renderbitmap);

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 18 Implementálás 3. Buffer rajzolása a képernyőre: void Render() DrawToBitmap(); display.simplegraphics.displayimage(renderbitmap, 0, 0);

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 19 Implementálás Az F5 billentyű segítségével elindítható a program Debug módban Amennyiben mindent jól csináltunk, megjelenik a háromféle alakzat a képernyőn, tehát a definiált osztályok jól működnek Fejlesszük tovább a programot úgy, hogy a kirajzolásra kerülő alakzatok legyenek véletlenszerűek és azok számát egy konstans segítségével lehessen megadni!

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 20 Implementálás A Program osztályon belül további konstansokra és mezőkre lesz szükség: const int SHAPE_COUNT = 50; const int MAX_SIZE = 20; const int MIN_SIZE = 10; const int SHAPE_COUNT: az alakzatok száma const int MAX_SIZE: az alakzatok maximális mérete const int MIN_SIZE: az alakzatok minimális mérete Random randomizer: véletlen szám generátor Random randomizer = new Random();

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 21 Implementálás Az InitShapes() metódust a következőképpen kell módosítani: void InitShapes() shapes = new Shape[SHAPE_COUNT]; for (int i = 0; i < SHAPE_COUNT; ++i) int nextshapetype = randomizer.next(3); int width = MIN_SIZE + randomizer.next(max_size - MIN_SIZE); int height = MIN_SIZE + randomizer.next(max_size - MIN_SIZE); byte[] rgb = new byte[3]; randomizer.nextbytes(rgb); GT.Color color = GT.Color.FromRGB(rgb[0], rgb[1], rgb[2]); switch (nextshapetype) case 0: shapes[i] = new Circle(); break; case 1: shapes[i] = new Rectangle(); break; case 2: shapes[i] = new Triangle(); break; shapes[i].width = width; shapes[i].height = height; shapes[i].color = color;

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 22 Implementálás Az alakzatok pozíciója szintén véletlenszerűen kerül meghatározásra az inicializálás során, illetve a későbbiek folyamán minden egyes frame rajzolásánál a SetShapePositions() metódus hívásával: void SetShapePositions() for (int i = 0; i < SHAPE_COUNT; ++i) Shape actualshape = shapes[i]; actualshape.x = randomizer.next(screenwidth - actualshape.width); actualshape.y = randomizer.next(screenheight - actualshape.height); A Render() metódus szintén módosítást igényel: void Render() SetShapePositions(); DrawToBitmap(); display.simplegraphics.displayimage(renderbitmap, 0, 0); Futtatással meggyőződhetünk róla, hogy a véletlenszerűen kiválasztott alakzatok megfelelően kerülnek kirajzolásra, véletlen pozícióra

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 23 Implementálás A rajzolást folyamatosan kell végezni egy cikluson belül, illetve minden iteráció során mérni kell a jelenet rajzolásra fordított időt. Ebből kiszámítható, hogy egy másodperc alatt hány frame rajzolható ki (FPS) Az idő méréséhez két új DateTime típusú mezőre lesz szükség a Program osztályon belül, az érték szöveges megjelenítéséhez pedig egy Font objektumra: DateTime before; DateTime after; Font font = Resources.GetFont(Resources.FontResources.NinaB);

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 24 Implementálás A rajzolás előtt és azt követően is lekérjük a rendszeridőt A két idő különbségéből megkapjuk a jelenet elkészítésére fordított időt milliszekundumban Ebből kiszámítható az FPS érték : void Render() while (true) before = DateTime.Now; SetShapePositions(); renderbitmap.clear(); DrawToBitmap(); after = DateTime.Now; TimeSpan rendertime = after.subtract(before); float fps = 1000.0f / rendertime.milliseconds; renderbitmap.drawtext(fps.tostring("f2") + " fps", font, GT.Color.Magenta, 20, 20); display.simplegraphics.displayimage(renderbitmap, 0, 0);

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 25 Tesztelés A tesztelés során a bal-felső sarokban látható az FPS érték, mely megmutatja, hogy egy másodperc alatt hányszor képes az eszköz az új jelenet előállítására és kirajzolására A programot teszteljük Debug (F5) és Release (Ctrl+F5) módban is, majd figyeljük meg a sebesség különbséget Vizsgáljuk meg, hogy az alakzatok száma hogyan befolyásolja a teljesítményt

OE-NIK, 2014. tavasz Beágyazott Rendszerek Alapjai 26 +Feladat Az alakzatok ne önmagukat rajzolják ki, hanem a Render() metódus végezze a kirajzolásukat a típusuk szerint (Type mező).