ประสิทธิภาพการแสดงผลสำหรับเกม Flash


11

ฉันอ่านเกี่ยวกับการสร้างการแสดงผลแฟลชดั้งเดิมBitmapDataกับการสร้างเฟรมบัฟเฟอร์แบบกำหนดเองและคำตอบบางข้อนั้นขัดแย้งกันเล็กน้อยดังนั้นฉันจึงสงสัยว่า:

  1. โดยทั่วไปแล้ววิธีที่ดีที่สุดที่จะใช้เส้นทางบัฟเฟอร์บิตแมปที่กำหนดเองหรือเป็นการดีที่สุดที่จะปล่อยให้การแสดงผลไปยังเอ็นจิ้นแฟลช
  2. หากคุณใช้ภาพเคลื่อนไหวเวกเตอร์MovieClipซึ่งต่างจากสไปรต์นั่นจะเปลี่ยนคำตอบข้างต้นหรือไม่?
  3. ถ้าเป็นเช่นนั้นเป็นวิธีปฏิบัติที่ดีที่สุดในการใช้ภาพเคลื่อนไหวแบบผี

(ฉันกำหนดเป้าหมายเป็น Flash 10 หากสร้างความแตกต่าง)

คำตอบ:


14

1. ไม่มีแนวปฏิบัติที่ดีที่สุดทั่วไป

หากคุณมีจำนวนมาก (มีรูปทรงที่ซับซ้อน) องค์ประกอบอนุภาคอื่น ๆ ในเกมของคุณวิธีการบัฟเฟอร์บิตแมปเป็นไปได้มากขึ้นเร็วขึ้น บัฟเฟอร์บิตแมปจะขยายขนาดได้ดีขึ้นด้วยการเพิ่มความซับซ้อนของสไปรต์ของคุณ vector renderer จะช้าลงด้วยรูปร่างที่ซับซ้อนมากขึ้นหรือภาพเคลื่อนไหว tween (shape tween) แต่ก็มีข้อดีอื่น ๆ ดังนี้:

  • คุณสามารถปรับขนาดสินทรัพย์ของคุณได้อย่างอิสระหรือแม้กระทั่งซูมเข้าไปในฉากโดยไม่สูญเสียคุณภาพ
  • การหมุนหรือการแปลงอื่น ๆ เช่นการเอียงจะทำได้ง่ายขึ้นมากในกราฟิกแบบเวกเตอร์

ดังนั้นโดยสรุปมันจะทำให้เกมที่คุณกำลังสร้าง

2. ใช้ MovieClips แทน bitmap sprite-sheets

ฉันเดาว่าคุณหมายถึง "bitmap sprite-sheets" และไม่ใช่คลาสAS3 Sprite ?

มันไม่ได้สร้างความแตกต่างจริงๆ คุณสามารถเปลี่ยนภาพเคลื่อนไหวที่ใช้ MovieClip เป็นบิตแมปแบบเคลื่อนไหวได้ตลอดเวลา ไม่ว่าจะด้วยตนเองโดยการส่งออกภาพยนตร์ไปยังเฟรมและเปลี่ยนเป็นสไปรต์ชีทหรือแบบไดนามิกโดยการแสดงสไปรต์ชีทจาก MovieClip ของคุณเมื่อรันไทม์ นี่คือวิธีที่ฉันจะทำ:

  1. สร้างตัวอย่างของ MovieClip และstop()มัน
  2. สร้างnew BitmapDataวัตถุที่มีความกว้างและความสูงเท่ากับ Movieclip
  3. ใช้วิธีการdraw ()เพื่อแสดงผล MovieClip เป็น BitmapData
  4. เก็บวัตถุ BitmapData ใน Array หรือ Vector
  5. ไปที่เฟรมถัดไปของ MovieClip ของคุณและทำซ้ำขั้นตอนที่ 2 - 4 ทำเช่นนี้จนกว่าคุณจะถึงเฟรมสุดท้ายของ MovieClip ของคุณ นอกจากนี้คุณควรอัปเดตตัวแปรสองตัวด้วยความกว้างสูงสุดและความสูงสูงสุดของเฟรม MovieClip ของคุณ (เนื่องจากสิ่งเหล่านี้สามารถเปลี่ยนจากเฟรมหนึ่งเป็นเฟรม)
  6. ตอนนี้คุณสามารถรวมวัตถุ BitmapData ที่เก็บไว้ทั้งหมดลงใน Sprite-Sheet (ใช้BitmapData.copyPixels () )

3. ภาพเคลื่อนไหวที่ใช้เทพดา

ดังที่กล่าวไว้ในคำตอบสำหรับคำถามแรกของคุณไม่มีคำตอบที่ชัดเจนสำหรับคำถามนั้น หากคุณจำเป็นต้องทำการเปลี่ยนแปลงมากมายกับวัตถุของคุณเช่น ปรับขนาดและหมุนภาพคุณน่าจะดีกว่าโดยใช้ตัวแสดงผลเนทีฟแบบแฟลช หากคุณมีภาพเคลื่อนไหวที่กำหนดไว้ล่วงหน้าซึ่งสามารถอบไปที่สไปรต์แผ่น (ด้วยตนเองหรือแบบไดนามิก) และหากคุณต้องการแสดงสไปรต์นับร้อยในเวลาเดียวกันให้ไปที่เครื่องมือเรนเดอร์บิตแมป


เมื่อ (ถ้ามี) แฟลชเริ่มใช้การเร่งความเร็วฮาร์ดแวร์สำหรับการเรนเดอร์ตัวแสดงผล copyPixel อาจช้ากว่าตัวแปลดั้งเดิม
Bart van Heukelom

6

ฉันจะบอกว่าถ้าคุณกำลังสร้างเกมแบบราสเตอร์โดยใช้สไปรท์ไปกับการสร้างโซลูชันการแสดงผลที่กำหนดเองโดยใช้ BitmapData หากคุณกำลังสร้างเกมที่ใช้เวกเตอร์ไปด้วยการใช้กลไกภาพเคลื่อนไหวในตัวโดยใช้ MovieClips

หากคุณไปกับการสร้างโซลูชันการแสดงผลที่กำหนดเองคุณจะยกเลิกการเชื่อมโยงตัวเองกับ Flash โดยใช้ ActionScript เพียงอย่างเดียวเพื่อทำสิ่งที่คุณต้องการให้สำเร็จ เอ็นจิ้น flixelใช้วิธีนี้และค่อนข้างดี ฉันชอบเขียนเอนจิ้นของตัวเองตั้งแต่แรก แต่คุณจะได้ความคิด

การใช้กลไกสร้างภาพเคลื่อนไหว Flash ในตัวนั้นทำงานได้ดีที่สุดสำหรับเกมที่ใช้เวกเตอร์เพราะคุณสามารถสร้างเนื้อหาห้องสมุดของคุณเป็น MovieClips ซึ่งคุณสามารถสร้างอินสแตนซ์ใน ActionScript ได้ตามต้องการ คุณใช้ไทม์ไลน์ที่มีให้คลิปภาพยนตร์เพื่อจัดการกับภาพเคลื่อนไหวและย้ายตำแหน่งของสไปรต์ตามลำดับ ทั้งหมดใน BattleOn! เกมเช่น Adventure Quest Worlds ใช้วิธีนี้ มันก็ดูดีเช่นกัน

ฉันสมมติว่าคำถามสุดท้ายของคุณหมายถึงการใช้คลาส Sprite แทนคลาส MovieClip สำหรับภาพเคลื่อนไหวเวกเตอร์ Sprite เป็น MovieClip โดยไม่มีกำหนดเวลาดังนั้นคุณจะเสียความสะดวกในการจัดการอนิเมชั่นให้กับคุณ


3

แม้ว่ามันจะเป็นความเชื่อที่ถือกันโดยทั่วไปว่าการปะทุเร็วกว่า แต่ฉันไม่เคยเห็นมาตรฐานใด ๆ ที่พิสูจน์สิ่งนี้ นักพัฒนาบางคนชอบที่จะ blitting เพราะช่วยให้พวกเขาปฏิบัติต่อ Flash ในฐานะของเครื่องเสมือนทั่วไปและควบคุมการแสดงผลด้วยตนเอง อย่างไรก็ตามถ้าคุณชอบรายการแสดงผลในตัว (ที่ฉันทำ) แฟลชสามารถเลื่อนปรับขนาดหมุนและใช้เอฟเฟ็กต์ที่ดีกับ DisplayObjects บนหน้าจอหลายร้อยจอ (เช่น MovieClips, Sprites, Bitmaps) ในอัตราเฟรมที่สูง ตราบใดที่มีขนาดค่อนข้างเล็กเช่นละน้อยกว่า 200x200 พิกเซล คุณสามารถใช้ MovieClips ได้โดยไม่ต้องใช้เวกเตอร์ เกมส่วนใหญ่จะใช้บิตแมปสินทรัพย์ใดก็ตามที่ระบบใช้ แต่บางครั้งก็มีประโยชน์ในการจัดวางและสร้างภาพเคลื่อนไหวบิตแมปเนื้อหาบนไทม์ไลน์โดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับนักออกแบบผู้เชี่ยวชาญด้านแฟลชมากกว่าศิลปินพิกเซล ด้วยการตั้งค่าคุณภาพของสเตจเป็นต่ำคุณจะได้รับประสิทธิภาพที่ดีขึ้นโดยเสียค่าใช้จ่ายในการแปลงรูปอัปเกรด แฟลชจะไม่แสดงวัตถุใด ๆ ที่อยู่นอกหน้าจอดังนั้นจึงไม่ทำให้คุณช้าลง

ตำแหน่งที่ Flash สามารถเคลื่อนที่ช้าและเปลี่ยนบิตแมปที่มีขนาดใหญ่มากตัวอย่างเช่นถ้าคุณมีระดับการเลื่อนที่ใหญ่มากหรือเลเยอร์พารัลแลกซ์มากมาย วิธีไฮบริดของการใช้ MovieClips สำหรับวัตถุเกมของคุณในขณะที่ตัดพื้นหลังออกจากบัฟเฟอร์หน้าจออาจเร็วขึ้นและจะช่วยให้คุณมีระดับที่ไม่ จำกัด ในขณะที่ยังอนุญาตให้ใช้ Sprites มาตรฐานและ MovieClips ได้อย่างง่ายดาย


รูปทรงเวกเตอร์ที่ซับซ้อนอาจมีผลกระทบอย่างมากต่อประสิทธิภาพ หากคุณได้ MovieClips แบบเคลื่อนไหวที่มีการไล่ระดับสีจำนวนมากและถ้าคุณไม่ใส่ใจกับรายละเอียดของรูปทรงเวกเตอร์ของคุณก็จะช้าลงกว่าบิตแมปมาก
bummzack

คุณสามารถใช้ MovieClips ได้โดยไม่ต้องใช้เวกเตอร์ เกมส่วนใหญ่จะใช้บิตแมปสินทรัพย์ใดก็ตามที่ระบบใช้ แต่บางครั้งก็มีประโยชน์ในการจัดวางและสร้างภาพเคลื่อนไหวบิตแมปเนื้อหาบนไทม์ไลน์โดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับนักออกแบบผู้เชี่ยวชาญด้านแฟลชมากกว่าศิลปินพิกเซล
เลน

ใช่สำหรับเกมแฟลชฉันขอแนะนำว่าอย่าใช้การไล่ระดับสีสำหรับสิ่งใดก็ตามที่เป็นเวกเตอร์และแสดงผลด้วยแฟลชในแต่ละเฟรมนอกเหนือจากสิ่งต่าง ๆ บน HUD และเครื่องเล่น การไล่ระดับสีกินการแสดงที่รวดเร็ว
AttackHobo

การเรนเดอร์มาตรฐานและการแสดงผลบางอย่าง: 8bitrocket.com/2007/12/23/…
Max Dohme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.