pptx - Game Programming And Development

Report
2D Basic Programming for XNA
Suphot Sawattiwong
[email protected]
1
Display Resolution
• Display Resolution เป็ นเรื่ องที่ต้องทำควำมเข้ ำใจกันก่อน โดยปกติ
Resolution ของ PC จะขึ ้นอยูก่ บั Computer ที่ใช้ โดยมำตรฐำนปั จจุบนั
อยูท่ ี่ 1024x768 แต่ถ้ำหำกเป็ น Wide Screen ก็จะมีจดุ ที่แตกต่ำงกัน
ออกไปตำม ratio ที่เปลี่ยนไป
• สำหรับ XBOX360 เนื่องจำกเครื่ องเกมได้ ถกู ใช้ มำตรฐำน HD(High
Definition) ซึง่ จะมีตงแต่
ั ้ 480i, 480p, 720i,720p จนถึง 1080p
• กำรที่เรำทำเกมเรำอำจจะต้ องระวังเรื่ อง Resolution ไว้ ด้วยเช่นกัน
2
ความกว้างxยาวของจอภาพใน XNA
• ควำมกว้ ำงยำวของจอภำพ แบ่งเป็ น 3 ลักษณะดังนี ้
– Display Mode เป็ นขอบเขตของหน้ ำจอของระบบ ซึง่ แตกต่ำงกับหน้ ำจอ
หน้ ำต่ำงของเกม
– Back Buffer เป็ นขอบเขตเฉพำะในกำรแสดงผล ซึง่ ใช้ ในกำรคำนวณ next
render โดยใน Windows Back Buffer จะมีค่ำเดียวกับหน้ ำจอของเกม
แต่สำหรับใน XBOX360 ถูกสร้ ำงตำม User กำหนด และเมื่อ Fullscreen
Mode บน Windows Back Buffer จะเป็ นไปตำม Display Mode
ทันที
– ViewPort เป็ นหน้ ำจอที่ใช้ แสดงผล เป็ นลักษณะของกล้ อง ซึง่ ควำมกว้ ำง และ
ควำมยำว เป็ นควำมกว้ ำงควำมยำวของกล้ องด้ วยเช่นกัน โดย viewport ไม่มี
ควำมเกี่ยวข้ องกับ ขนำดของ Game Windows แต่ viewport สัมพันธ์
กับค่ำ Display Mode
3
ความกว้างxยาวของจอภาพใน XNA
4
การทางานกับ GraphicsDevice ใน XNA
• กำรตังค่
้ ำหน้ ำจอ Windows
graphics.PreferredBackBufferWidth = <ควำมกว้ ำง>;
graphics.PreferredBackBufferHeight = <ควำมยำว>;
• กำรทำให้ Windows เป็ น โหมด Full Screen
graphics.IsFullScreen = <true|false>;
• กำรสลับโหมด Windows จำก Windows เป็ น Full Screen
หรื อ Full Screen เป็ น Windows Mode
graphics.ToggleFullScreen();
• ดูตวั อย่ำงใน Project ScreenWidthHeight
5
Resouce ที่ใช้ในเกม
• File รูปภำพ ใน XNA สำมำรถอนุญำตให้ ใช้ รูปภำพเป็ น jpg, gif,
และ png ก็ได้ โดยปกติ เพื่อควำมสะดวกเรำจะใช้ format png
ในกำรทำภำพในเกม เนื่องจำกว่ำสะดวกในกำรเจำะ Transparent
• Sound ที่ใช้ Support มี wav, aifและaiffแต่หำกจะนำมำใช้
ต้ องผ่ำน tools ที่ชื่อว่ำ Microsoft Cross-Platform
Audio Creation Tool (XACT)
6
Content Pipeline
• โดยปกติ Game Resource จะถูก Load เก็บมำไว้ ใน memory
ก่อนที่จะทำกำรใช้ งำน โดยที่ Content Pipeline จะเป็ นตัวช่วยใน
กำร load เข้ ำมำ ซึง่ เป็ นกำรนำ File ที่มีคณ
ุ สมบัติตำ่ งกัน ไม่วำ่ จะเป็ น
รูปภำพ หรื อว่ำเสียงจะถูกเก็บใน format ที่ง่ำยต่อกำรโหลดเพื่อมำใช้ ใน
เกมเมื่อเกม start
• ขันแรกรู
้
้ จกั ตัวแปร ที่ชื่อ “Content” ใน
Content.RootDirectory = "Content";
• เป็ นตัวแปรที่ XNA กำหนดมำใน Class game ของ XNA เพื่อให้
สะดวกต่อกำรใช้ งำน
• Content.RootDirectory เป็ นกำรบอกว่ำ Folder ที่
Content อยูน่ นั ้ อยูใ่ น Folder “Content” นัน่ เอง
7
การนาภาพเข้า Project
• Click ที่ Folder Content ใน Solution Explorer
• เลือก Add>Add Exist Item แล้ วไปยัง Folder ที่เรำ Save
ไฟล์ ภำพไว้ (ในแผ่น DVD Folder “Resource
Example”) Fileภำพจะถูก copy เข้ ำมำไว้ ใน Content ทันที
8
การวาดภาพใน XNA
• ก่อนอื่นมำทำควำมเข้ ำใจของคำว่ำ Sprite คือรูปภำพนัน่ เอง XNA
ทำกำรอ้ ำงถึงรูปภำพผ่ำนทำง Texture2D Object ซึง่ เรำจะทำ
กำรวำดภำพเหล่ำนี ้ลงบนหน้ ำจอโดยตรง
• กำรวำดภำพใน XNA ต้ องทำควำมรู้จกั กับระบบ 2D
Coordinate เสียก่อน เพื่อเข้ ำใจในตำแหน่งกำรวำงภำพแบบ 2D
• โดยในโลกของ 2D จะมีแค่ แกน x,y เท่ำนัน้ ซึง่ ต่ำงจำก 3D ที่ใช้ x,
y, และ z
• origin ของ XNA อยูบ่ นซ้ ำยสุดของหน้ ำจอ (0,0) คือ x= 0 และ
y= 0
9
2D Coordinate System
จอภำพ
x+
Origin(0,0)
y+
10
2D Coordinate System
• จะเห็นได้ วำ่ หำกหน้ ำจอมี Resolution 1024x768 จุดจะเริ่ ม
จำก 0-1023 ในแนวแกน x และ 0-767 ในแนวแกน y และมุม
ขวำล่ำงสุดจะมีจดุ (1023, 767)
• ซึง่ ใน XNA จะเก็บค่ำตำแหน่งเหล่ำนี ้ในตัวแปร Vector2 และตัว
แปรแกน xและ y ในรูปแบบ int
11
ตัวอย่างการวาดภาพในตาแหน่งที่ (100,60)
จอภำพ
Origin(0,0)
Vector(100,60)
y-offset=60
x-offset=100
Position(100,60
)
12
2D Transformation
• ในโลก 2D นันนอกจำกต
้
ำแหน่งของภำพแล้ ว ยังสำมำรถทำกำรย้ ำย
ตำแหน่งของภำพได้ รวมถึง ย่อ/ขยำย และ หมุนภำพได้ สิง่ เหล่ำนี ้เรี ยก
รวมๆ ว่ำ “2D Transformation”
13
หากต้องการเลื่อนจากจุดเดิมไปอีก 120, 40 จุด
14
การหมุน (Rotate)
• ใน XNA มีกำรสร้ ำงจุด Origin ของ Sprite เพื่ออำนวย
ควำมสะดวกใน Rotate หำกเรำใช้ จดุ เดิมในกำรหมุนจะออกมำเป็ น
แบบนี ้
15
การใช้จุดOrigin ของ Sprite เพื่อใช้ในการหมุน
• ใน XNA สำมำรถกำหนดจุด Origin ของ Sprite ได้ วำ่ ต้ องกำรให้
อยูใ่ นจุดใดของภำพเพื่อสะดวกในกำรหมุน
16
การย่อ/ขยาย(scale)
• กำรทำให้ Sprite มีขนำดใหญ่ขึ ้นในกำรวำด ซึง่ ใช้ จดุ origin ใน
กำรขยำยเช่นกัน
17
Vector2
• Vector2 เป็ นตัวแปรที่เก็บค่ำ 2 ตัว เรำมักใช้ กบั กำรเก็บตำแหน่ง มี
parameter ดังต่อไปนี ้
Vector2 <ชื่อตัวแปร> = new Vector2(<จุดPosition X>, <จุด Position Y>);
18
Rectangle
• เป็ นตัวแปรที่เก็บขนำด สี่เหลี่ยม โดยมี parameter ใน
Constructor ดังนี ้
Rectangle <ชื่อตัวแปร> = new Rectangle(<จุดPosition X>,
<จุด Position Y>,
<กว้ ำง>,<สูง>);
19
SpriteBatch
• ในเกมในปั จจุบนั มีกำรใช้ รูปภำพหลำยรูปในหลำยๆ ตำแหน่งของหน้ ำจอ มันเป็ นเรื่ องที่
ยุง่ ยำกในกำรส่งผ่ำนข้ อมูลของตำแหน่งและจัดกำรภำพเหล่ำนี ้ให้ มีประสิทธิภำพ
• โดย XNA มี Class พิเศษสำหรับจัดกำรนี ้โดยตรงนัน่ คือ SpriteBatch
• กำหนด SpriteBatch ไว้ ใน Class Game ดังนี ้
<private|public> SpriteBatch <ชื่อตัวแปร>;
เช่น private SpriteBatch spriteBatch;
• วำงใน LoadContent ก็ได้ ให้ ใส่กำรกำหนดค่ำลงไปดังนี ้
<ชื่อตัวแปร> = new SpriteBatch(<ตัวแปรGraphics>.GraphicsDevice);
เช่น
spriteBatch = new SpriteBatch(GraphicsDevice);
20
SpriteBatch
• กำรทำงำนของ Method SpriteBatch ในส่วนกำร Draw ใน
Draw Method นันแบ่
้ งเป็ นหลำย Method ดังนี ้
– Begin() เป็ นกำรบอกจุดเริ่มต้ นของ SpriteBatch และยังมีกำร set
ค่ำต่ำงๆ เช่น SpriteBlendMode, SpriteSortMode
– Draw() ไว้ สำหรับ Draw ภำพปกติโดยใช้ Texture2D
– DrawString() ไว้ สำหรับ Draw ข้ อควำมที่ใช้ ในเกม
– End() เป็ นกำรบอกจุดสิ ้นสุดของ SpriteBatch
21
การ Draw ใน SpriteBatch
Method
Draw(Texture2D,
Rectangle, Color)
Draw(Texture2D,
Rectangle,
Nullable<Rectangle>,
Color)
คำอธิบำย
กำรวำดโดยระบุ Texture2D ที่ใช้ , ตำแหน่งที่
จะวำงเป็ นลักษณะของ Rectangle และสีที่ใช้
กำรวำดโดยระบุ Texture2D ที่ใช้ , ตำแหน่งที่
ภำพ ในรูปแบบ Rectangle, ตำแหน่งของภำพ
ที่นำมำวำดเป็ นตัวเลือกในรูปแบบ Rectangle
และสีที่ใช้
22
การ Draw ใน SpriteBatch
Method
คำอธิบำย
Draw(Texture2D,
Rectangle,
Nullable<Rectangle>,
Color, float, Vector2,
SpriteEffects, float)
กำรวำดโดยระบุ Texture2D ที่ใช้ , ตำแหน่งที่ภำพ ใน
รูปแบบ Rectangle,
ตำแหน่งของภำพที่นำมำวำด เป็ นตัวเลือกในรูปแบบ
Rectangle, สีที่ใช้ , ค่ำสำหรับกำรหมุน, ตำแหน่ง
origin ใหม่, Sprite Effects, และค่ำควำมลึกของ
ภำพในกำรจัดเรี ยง
23
การ Draw ใน SpriteBatch
คำอธิบำย
กำรวำดโดยระบุ Texture2D
Draw(Texture2D,
ที่ใช้ , ตำแหน่งที่จะวำงเป็ นลักษณะของ
Vector2, Color)
Vector2 และสีที่ใช้
กำรวำดโดยระบุ Texture2D
Draw (Texture2D,
ที่ใช้ , ตำแหน่งที่จะวำงเป็ นลักษณะของ
Vector2,
Nullable<Rectangle>, Vector2, ตำแหน่งของภำพที่นำมำ
วำด เป็ นตัวเลือกและสีที่ใช้
Color)
Method
24
การ Draw ใน SpriteBatch
Method
Draw (Texture2D, Vector2,
Nullable<Rectangle>, Color,
float, Vector2, float,
SpriteEffects, float)
Draw (Texture2D, Vector2,
Nullable<Rectangle>, Color,
float, Vector2, Vector2,
SpriteEffects, float)
คำอธิบำย
กำรวำดโดยระบุ Texture2D ที่ใช้ ,
ตำแหน่งที่วำงเป็ น Vector2, ตำแหน่งและขนำด
ของภำพที่วำดเป็ นตัวเลือก, สีที่ใช้ , กำรหมุน, จุด
origin,ค่ำย่อขยำยเป็ นSingle, sprite
effect และค่ำควำมลึกของภำพในกำรจัดเรี ยง
กำรวำดโดยระบุ Texture2D ที่ใช้ ,
ตำแหน่งที่จะวำงเป็ นลักษณะของ Vector2,
ตำแหน่งของภำพที่นำมำวำดเป็ นตัวเลือกในรูปแบบ
Rectangle, สีที่ใช้ , กำรหมุน, จุดorigin,ค่ำ
ย่อขยำยเป็ น Vector2, sprite effects,
และ ค่ำควำมลึกของภำพในกำรจัดเรี ยง
25
SpriteEffects
• เป็ น Effects ของ Sprite ที่ทำได้ ในคำสัง่ Draw มีดงั ต่อไปนี ้
– SpriteEffects.FlipHorizontally ไว้ พลิกด้ ำนแนวนอน
– SpriteEffects.FlipVertically ไว้ พลิกด้ ำนแนวตัง้
– SpriteEffects.None ไม่มี Effect
26
Ex2: การวาดภาพBackground
• สร้ ำง Project ชื่อ DrawBackground ขึ ้นมำ
• นำภำพ Background ใดก็ได้ ไปใส่ใน โดยทำตำมวิธีกำรนำไฟล์
เข้ ำ Project
• พิมพ์ Code ในส่วนต่อไปนี ้ ประกำศตัวแปรใน Class Game1
ดังต่อไปนี ้
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Rectangle bgRect; //เป็ นกำรประกำศตัวแปรที่เก็บตำแหน่งและขนำดของ
Background
Texture2D bgTexture; //ตัวแปรภำพที่เรำใช้ เป็ นพื ้นหลัง
27
ใน Constructor Game1
public Game1()
{
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = 1024;
// เป็ นกำรกำหนดควำมกว้ ำงของหน้ ำจอ
graphics.PreferredBackBufferHeight = 768;
// เป็ นกำรกำหนดควำมยำวของหน้ ำจอ
Content.RootDirectory = "Content";
}
28
ใน Method Initialize
protected override void Initialize()
{
bgRect = new Rectangle(0, 0,
graphics.GraphicsDevice.Viewport.Width,
graphics.GraphicsDevice.Viewport.Height);
//graphics.GraphicsDevice.Viewport.Width เป็ นค่ำควำมกว้ ำงของ
ViewPort หรื อหน้ ำจอ
//graphics.GraphicsDevice.Viewport.Height เป็ นค่ำควำมยำวของ
ViewPort หรื อหน้ ำจอ
base.Initialize();
}
29
ใน Method LoadContent
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to
draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
bgTexture = Content.Load<Texture2D>("Matching_bg");
//กำรเรี ยกใช้ Background
}
30
ใน Method Draw
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
//กำรเติมสี Background
spriteBatch.Begin(); // เริ่ มกำรใช้ spriteBatch
spriteBatch.Draw(bgTexture, bgRect,
Color.White); // ทำกำรวำดรูป Background
spriteBatch.End(); // จบกำรใช้ spriteBatch
base.Draw(gameTime);
}
31
Lab1: 2D Transformation และ Fade
1. ให้ เขียนโปรแกรม และเคลื่อนที่ภำพจำกซ้ ำยไปขวำ หำกมีกำรชนขอบ
จอให้ มีกำรเด้ งไปมำในจอภำพ
2. ให้ ทดลองกำรวำดภำพโดยให้ มีกำรหมุนภำพ
3. ลองวำดภำพให้ มีกำรค่อยๆ ขยำยจำกเล็กไปใหญ่
4. ให้ มีกำรวำดภำพโดยกำรทำให้ ภำพปกติ แล้ วค่อยๆ ทำให้ จำงหำยไป
32
Lab2: Tile
• จงนำภำพที่ให้ มำ มำทำกำรต่อภำพให้ เต็มจออย่ำงในภำพตัวอย่ำง
ต่อไปนี ้
33
Lab3: Reflection
• จงทำกำรวำดภำพที่ให้ มำให้ ออกมำในรูปแบบดังต่อไปนี ้ โดยไม่มีกำร
แก้ ภำพที่ให้ ใน Photoshop และ ภำพต้ องอยูต่ รงกลำงจอด้ วย
34
การใช้ SpriteFont ในXNA
• ใน XNA มีวิธีกำรแนบ Font จำก Windows เข้ ำมำในเกมได้ เลย
โดยสำมำรถใช้ TrueType Font ในเกม
• กำร Add SpriteFont เข้ ำมำยัง project ก่อนมีขนตอนดั
ั้
งนี ้
– Click ขวำที่ Folder Content ใน Solution Explorer
– เลือกที่Add> Add New Item เลือก SpriteFont แล้ วตังชื
้ ่อให้ ตรงกับ
font แต่ไม่ควรมี space แล้ วตำมด้ วย Size เช่น Angsana14
– จำกนันให้
้ เปิ ด sprite font แล้ วดูที่บรรทัดตรงที่เขียนว่ำ<FontName>
<FontName>ชื่อFont</FontName>
เช่น <FontName>AngsanaUPC</FontName>
– จำกนัน้ ให้ ดู บรรทัด <Size>ขนำด</Size> แก้ ขนำดตำมต้ องกำร
35
การใช้ SpriteFont ในXNA
• สร้ ำงตัวแปร SpriteFont ไว้ ใน Class Game1 ดังนี ้
private SpriteFont font;
• ให้ ใส่ Code ลงใน Method LoadContent
font = Content.Load<SpriteFont>(@"AngsanaUPC14");
36
DrawString
Method
DrawString
(SpriteFont, String,
Vector2, Color)
DrawString(SpriteFont,
String, Vector2, Color,
float, Vector2, float,
SpriteEffects, float)
คำอธิบำย
กำรวำดโดยระบุ Sprite Font, ข้ อควำมที่
แสดง, Vector2 สำหรับตำแหน่ง และสีของ
Font
กำรวำดโดยระบุ Sprite Font, ข้ อควำมที่
แสดง, Vector2 สำหรับตำแหน่ง, สีของ
Font, กำรหมุน , จุด origin, ค่ำย่อขยำย
เป็ น float, Sprite Effect และ ค่ำควำม
ลึกของภำพในกำรจัดเรี ยง
37
DrawString
Method
DrawString(SpriteFont,
String, Vector2, Color,
float, Vector2,
Vector2, SpriteEffects,
float)
คำอธิบำย
กำรวำดโดยระบุ Sprite Font, ข้ อควำมที่
จะแสดง, Vector2 สำหรับตำแหน่ง, สีของ
Font, กำรหมุน , จุด Origin, ค่ำย่อขยำย
เป็ น Vector2, Sprite Effect และ ค่ำ
ควำมลึกของภำพในกำรจัดเรี ยง
38
การใช้ภาษาไทยใน XNA
• หำกต้ องกำรใช้ ภำษำไทยให้ เพิ่มข้ อควำมในกรอบเหล่ำนี ้ลงไปในไฟล์
ของ SpriteFont เพื่อเป็ นกำรเพิ่มช่วงของภำษำไทยลงไป
<CharacterRegions>
<CharacterRegion>
<Start>&#32;</Start>
<End>&#126;</End>
</CharacterRegion>
<CharacterRegion>
<Start>&#3584;</Start>
<End>&#3711;</End>
</CharacterRegion>
</CharacterRegions>
39
Ex3: การวาด Font
• ให้ ทำกำรสร้ ำงโปรเจค เพื่อวำดตัวหนังสือขึ ้นมำเป็ นคำต่ำงๆ
ดังต่อไปนี ้ “Game Design”, “Game
Development”, “Graphic Design”, “Technical
Design”, “Game Asset”, “Asset List”
• โดยให้ มีกำรใช้ สีแบบต่ำงๆ โดยกำรใช้ คำสัง่ Random ซึง่ มี
ตัวอย่ำงให้ ในหน้ ำถัดไป และ ให้ มีกำร random ตำแหน่งของ
ตัวหนังสือหลำยๆ แบบด้ วย และยังต้ องหันองศำแบบ random
ด้ วยเช่นกัน
40
การสุ่ มหรื อ Random
• ให้ ประกำศตัวแปรแบบ Random ขึ ้นมำ ใน Class
โดยมีรูปแบบดังนี ้
Random <ชื่อตัวแปร>;
เช่น Random random;
• ให้ จดั กำร new Random(); ที่ Initialize() หรื อที่ Construtor
เช่น random = new Random();
• ส่วนวิธีใช้ int a= random.Next(<MaxValue>);
• เช่น
int a= random.Next(9); จะมีคำ่ สูงสุด แค่ 0-8
41
Lab4: การวาด Font
1. ให้ คิดหำวิธีทำกำรวำดตัวหนังสือ ให้ ได้ ดงั ภำพต่อไปนี ้
42
Game Performance
Suphot Sawattiwong
[email protected]
43
Performance
• ประสิทธิภำพในกำรทำงำน
• เรำจะรู้ได้ อย่ำงไรว่ำเกมที่เรำทำมีประสิทธิภำพที่ดี
– เกมมี graphic ที่สวยงำม ? เป็ นเรื่องคุณภำพ
– ใช้ เนื ้อที่น้อย ? เป็ นเรื่องประสิทธิภำพ
– เกมเล่นแล้ วภำพกระตุก เป็ นเรื่องประสิทธิภำพ
– ใช้ Memory น้ อย? เป็ นเรื่องประสิทธิภำพ
– เกมเล่นแล้ วสนุกสุดยอด ? เป็ นเรื่องคุณภำพ
– โหลดเกม โหลดฉำกได้ เร็ว เป็ นเรื่องประสิทธิภำพ
44
Measurement
• คือกำรวัดค่ำประสิทธิภำพต่ำงๆ
• ในเกมเรำวัดได้ จำก.....
– ควำมเร็วกำรวำดใน 1 หน้ ำจอ
– จำนวนหน้ ำจอที่ทำกำรวำดใน 1 วินำที
– Running Time
– กำรใช้ งำน Memory
– จำนวนควำมจุของ HDDที่ใช้ ในเกม
– LOD (Lines of Code)
– อื่นๆ
45
Benchmark
• เป็ นกระบวนกำรวัดและเปรี ยบเทียบกำรทำงำนในเกม กับเกมหรื อกลุ่ม
ตัวอย่ำงอื่นๆ เพื่อนำผลของกำรเปรี ยบเทียบมำใช้ ในกำรปรับปรุง
ประสิทธิภำพในเกม
• ตัวอย่ำงเช่น
– เกมที่ทำ เปรี ยบเทียบกับเครื่ องคอมพิวเตอร์ ที่ spec ต่ำงกันควำมเร็วกำร
วำดเท่ำกันหรื อไม่
– เกมที่เรำทำ ในเครื่ องspec ต่ำ สำมำรถเล่นเกมเรำในควำมเร็วที่เรำกำหนด
ได้ หรื อไม่
46
Frames Per Second(fps)
• Frames Per Second คือจำนวนภำพที่วำดต่อ 1 วินำที
• กำรวัดค่ำจำก FPS นันสำมำรถวั
้
ดอะไรได้ บ้ำง
1. วัดควำมเร็วในกำรวำดภำพใน 1 วินำที โดยเกมโดยทัว่ ไป หำกเป็ นเกม 2
มิติ FPS ควรจะวิ่งอยูท่ ี่ 60 FPS
2. สำมำรถรู้ได้ วำ่ ในหน้ ำจอในแต่ละเหตุกำรณ์กินประสิทธภำพเครื่ องต่ำงกัน
มำกน้ อยเพียงใด
3. สำเหตุกำรกระตุกเกิดจำกกำรวำด หรื อกำรคำนวณจำกจุดอื่นๆ
4. เป็ นต้ น
โดย FPS นันสำมำรถดู
้
ตวั อย่ำงกำรเขียนได้ ที่ Ex4_FPSTest
47
Algorithm ในการคานวณ FPS
1. ทำกำรวัดช่วงเวลำในตอนเข้ ำทำงำน (elapsed) ในส่วนของ Draw
Method
2. ให้ ทำกำรเพิ่มค่ำจำนวนภำพ(framecount) ทุกๆ ครัง้ ที่มีกำรวำด
หรื อกำรใช้ Draw Method
3. ทำกำรบวกช่วงเวลำที่ได้ (elapsed) เข้ ำไปในเวลำในกำรเปรี ยบเทียบ
ครัง้ ล่ำสุด (timeSinceLastUpdate)
4. นำระยะเวลำในกำรเปรี ยบเทียบครัง้ ล่ำสุด
(timeSinceLastUpdate) มำทำกำรเปรี ยบเทียบกับเวลำใน
เปรี ยบเทียบ (updateInterval) หรื อ 1 วินำที หำกเวลำในกำร
เปรี ยบเทียบครัง้ ล่ำสุดมำกกว่ำให้ กระทำต่อในขันที
้ ่ 5 หำกน้ อยกว่ำให้ ทำ
กำรวำดภำพตำมปกติใน Draw Method
48
Algorithm ในการคานวณ FPS (ต่อ)
5. นำค่ำที่ได้ มำทำกำรคำนวณ FPS ดังสูตรต่อไปนี ้ fps =
framecount / timeSinceLastUpdate
6. ทำกำรreset ค่ำจำนวนภำพ (framecount) ให้ มีคำ่ เป็ น 0
เพื่อเริ่มนับใหม่
7. ทำกำร reset ค่ำเวลำในกำรเปรี ยบเทียบครัง้ ล่ำสุด
(timeSinceLastUpdate) โดยกำรนำเวลำที่ใช้ เปรี ยบเทียบ
(updateInterval) ลบด้ วยเวลำในกำรเปรี ยบเทียบครัง้ ล่ำสุด
49
คาสัง่ ที่ช่วยในการคิด FPS ใน XNA
• graphics.SynchronizeWithVerticalRetrace = true
หรื อ false
– ยอมให้ มีกำร Sync Draw Method กับกำรทำ Vertical Retrace ใน
กระบวนกำร refresh rate ของ Monitor หรื อไม่
• IsFixedTimeStep = true หรื อ false
– ยอมให้ มีกำรfixed rate ให้ อยู่ที่ 60 fps หรื อ ทำให้ fps เป็ นอิสระ
• gameTime.ElapsedRealTime เป็ น ช่วงเวลำของกำร Draw
Method
• gameTime.ElapsedGameTime เป็ น ช่วงเวลำของกำร
UpdateMethod
50

similar documents