Unity Test Tools มาเขียน Test ให้กับเกมของเรากันเถอะ! by

30
Dec
2

ท้าวความก่อนเล็กน้อยสำหรับคนที่ไม่เคยเขียน Test มาก่อน ถามว่าทำไมเราต้องมี Test เหรอ?

  1. เคยไหม สมมติมีคนเล่นเกมเราพร้อมกัน 1 หมื่นคน เรา upload เกมขึ้น Store ปรากฏว่าคนเปิดเกมไม่ได้ Crashed เลย หรือมี Bug ที่ใช้ประโยชน์จากเกมของเราได้ และกว่าเราจะรู้ตัวว่ามี Bug กว่าจะแก้เสร็จและ upload ขึ้น Store กว่าคนเล่นจะกด Download เกมเวอร์ชั่นแก้ Bug ไป รวมๆ แล้วผ่านไปกี่ชม. แล้ว? อ้อ สำหรับคนที่ไม่รู้ App Store ของ iOS ใช้เวลา Approve 7 วันนะครับบบบ เรารอได้ไหม?
  2. แก้ Bug ระบบ A แต่ระบบ B เสือกพัง เห้ยยย เป็นไปได้ไงแว้ ไม่ได้ทดสอบระบบ B ก่อน up ขึ้น Store ซะด้วย
  3. นาย A มาแก้ Code ของนาย B แล้วพัง อ้าวเห้ย จะแก้อันนี้ทำไมไม่บอกกันก่อนวะ ห้ามทำแบบนี้นะเว้ย ต้องทำแบบนี้ๆๆๆ เท่านั้น !@#@$#^%$#

โอเคเหตุการณ์ Basic ทั่วไปของวงการ Software Development ที่ไม่ได้เป็นเฉพาะวงการเกมก็คงจะเคยเจอเหตุการณ์แบบนี้บ่อยๆ จริงไหมครับ ปัญหานี้เราแก้ได้ด้วยการมีระบบ Automate Test ครับ หรือจะ Test Manual เอาก็ได้นะ แต่จะเสียเวลาและแรงงานโดยยังมีโอกาสเกิด Human Error อีกตะหาก

เข้าเรื่อง อาจจะมีคนสงสัยว่า Unity สามารถเขียน Test เกมของเราได้หรือไม่ คำตอบคือได้ครับ! แถมยังทดสอบการทดสอบพวกหน่วงเวลาจะเกิด Action ตามที่ต้องการได้หรือไม่ซึ่งมักเป็นองค์ประกอบหลักของเกมแทบทุกเกมได้เป็นอย่างดี

ทาง Unity ได้ออก library ของตัวเองให้ Download กันได้ฟรี ชื่อว่า Unity Test Tools ถ้าใครใช้ Unity 5.3 เป็นต้นไปจะฝังมากับตัว Unity อยู่แล้ว ไม่ต้องโหลดเพิ่มครับ (เฉพาะส่วนของ NUnit) แต่ถ้าใครยังจำเป็นต้องใช้ version เก่าอยู่ก็โหลดตาม link มาได้ ทำให้เราสามารถทดสอบเกมของเราได้ โดยการทดสอบจะแบ่งออกเป็นสามประเภทหลักๆ

  1. NUnit หรือเทียบได้กับ Unit Test ธรรมดาทั่วๆ ไปของภาษาอื่นๆ เป็นการใช้ Assert ใน Code เพื่อทดสอบการทำงานเป็นราย class หรือ method โดยควรออกแบบให้ไม่ต้องเชื่อมต่อกับระบบด้านนอกเช่น database หรือ web server เพื่อทดสอบเฉพาะ logic การทำงานของ method นั้นจริงๆ และควร Test แค่อย่างเดียวต่อ 1 การทดสอบ (Unit แปลว่าหน่วย 1 หน่วยที่เล็กที่สุด ดังนั้นควรทดสอบแค่หน่วยเดียว อย่าทดสอบหลายๆ หน่วยในการทดสอบ 1 ครั้ง) สำหรับ NUnit นี้เราจะต้องทดสอบภายใน Folder ชื่อ Editor เท่านั้นเป็นข้อบังคับของ Unity โดย Unity จะติด Library NSubstitute ซึ่งเป็น Library สำหรับสร้างพวก Dummy Object, Stub, Test Spy, Mock อย่างง่ายๆ มาให้ในตัวโดยไม่ต้องหาโหลดเพิ่มอีก เพื่อเพิ่มความสะดวกในการทดสอบอย่างสูงสุดครับ

    nunit2 nunit
  2. Assertion Component เป็นการทดสอบโดยไม่ต้องเขียน Code ทดสอบ คล้ายข้อ 1 แต่อาศัยการเปรียบเทียบและใส่ค่าผ่าน Inspector โดยตรงแทน อาจให้คนที่มีความรู้ Coding น้อยๆ ช่วยทำได้ ทำให้สะดวกมาก ไม่ต้องเป็น Programmer ทำเสมอไป โดยสามารถใส่แทรกไปกับระบบการทำงานปกติของเกมได้เลย เพราะเมื่อสั่ง Build แล้วตัว Unity จะตัด component ส่วนนี้ออกให้เองอัตโนมัติ สามารถตั้ง Event ได้ว่าจะทดสอบเมื่อไหร่ เช่นเมื่อ Object ตัวนี้ๆ โดน Destroy หรือเมื่อเกิดเหตุการณ์ใดๆ สามารถเปรียบเทียบค่าระหว่างวัตถุสองชิ้นก็ได้ จุดเด่นคือสามารถแทรกการทดสอบกับ Scene จริงและใช้ช่วยหา Bug ที่ค้นหาได้ยากได้ เวลาใช้กับ Option Error Pauseassertion_component
  3. Integration Test เป็นการทดสอบโดยกำหนดสภาพแวดล้อมและสถานการณ์อย่างหนึ่งขึ้นมาสำหรับการ Test โดยเฉพาะ คิดซะว่า New Scene ขึ้นมา setup ค่าทุกอย่างใหม่หมดทุกครั้งต่อการทดสอบ 1 อย่าง แล้ว reset ค่าทุกอย่างก่อนจะทดสอบลำดับถัดไป เป็นการทดสอบความสัมพันธ์ระหว่าง GameObject หลายๆ ชื้นที่มีปฏิสัมพันธ์ต่อกันว่าดำเนินไปอย่างถูกต้องหรือไม่โดยเฉพาะ เช่นถ้าบอลแตะ Collider ภายในเวลาที่กำหนดให้ผ่าน Test นั้นซะ ถ้าแตะไม่ทันให้ไม่ผ่าน หรือหน้านี้จะต้องโหลดสำเร็จภายในกี่วินาที ซึ่งเราสามารถเขียน Code เสริมเพื่อสั่งว่าการทดสอบผ่านแล้วได้อีกด้วย ไม่จำเป็นต้อง set ผ่าน Inspector เพียงอย่างเดียวintegration_test

รอติดตามตัวอย่างการใช้งานได้ในตอนต่อไปนะครับ :)

ปล. ข้อควรระวัง แม้จะมี Automate Test ก็อย่าละเลย Manual Test ไป คิดซะว่า Automate Test แค่ช่วยลดงานและ Human Error ของ Manual Test เท่านั้น มันยังคงมี Bug บางส่วนที่ Automate Test ไม่สามารถทำได้ หรือทำได้แต่ใช้แรงงานเยอะจนไม่คุ้มอยู่เหมือนกัน เช่นแก้ UI แล้ว UI เบี้ยวจากตำแหน่งที่ควรจะเป็น 10 pixel หรืออะไรทำนองนี้ ถ้าจะเขียนดักให้ครบเคสพวก UI เบี้ยวแถมมือถือยังมีหลากหลายขนาดหน้าจออีกก็อาจจะลำบากหน่อย ซึ่งขึ้นอยู่กับวิจารณาณของทีมว่าสมควรเขียนไหมอีกทีครับ

Link แนะนำ:

http://www.tallior.com/introduction-unity-test-tools/
อธิบายจุดประสงค์และประโยชน์อย่างละเอียดในการทดสอบทั้งสามแบบด้านบน

https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/test-tools
วิดีโอสาธิตการใช้งาน

http://blogs.unity3d.com/2014/07/28/unit-testing-at-the-speed-of-light-with-unity-test-tools/ (บทความ)
https://github.com/DmytroMindra/TestDoublesBlogpost (Code)
ตัวอย่างการใช้งาน Dummy Object, Stub, Test Spy, Mock และพื้นฐานการเขียน Test (สำหรับคนที่ไม่เคยเขียน Test มาก่อนเลยในชีวิตแนะนำให้อ่านก่อนเลยครับ)

https://bitbucket.org/Unity-Technologies/unitytesttools/wiki/Home
Manual การใช้งาน Tools ตัวนี้และ Source Code

https://github.com/DmytroMindra/GrowingGamesGuidedByTests
Code ตั้งต้นเป็นแบบฝึกหัดสนุกๆ สำหรับการเริ่มต้นหัดเขียน Test สำหรับเกม สำหรับใครที่นึกภาพไม่ออกว่าควรจัดโครงสร้าง Object สำหรับ Test ยังไงบ้างแนะนำให้โหลดไปเล่นได้ครับ

ทำไม Product ถึง Delay? by

30
Nov
1

เนื่องจากผมไปพูดงาน Barcamp Bangkhen มา วันนี้ขอแปะสไลด์เลยละกันครับ :P

ทำไม Product (project) ถึง Delay? Deadline vs quality from Paiboon Panusbordee

Install lua php extension อย่างไร? by

26
Oct
0

เนื่องจากเกมผมมีการใช้งาน Lua ทั้งฝั่ง Unity (C#) และ php จึงต้องหาทาง install lua ที่ใช้ php รันให้ได้ ค่อนข้างวุ่นวายหลายอย่าง มั่วอยู่นาน ก็ได้ขั้นตอนมาดังนี้

  1. apt-get install lua5.2 – install ตัวรัน lua จริงๆ
  2. apt-get install liblua5.2 – install source code lua เพื่อช่วย compile lua php extension
  3. apt-get install php5-dev – install ตัว compile php extension ต่างๆ
  4. เข้า https://github.com/laruence/php-lua ไป download หรือ clone code php extension ตัวล่าสุดมาลงและแกะ zip ให้เรียบร้อย
  5. เข้า dir ที่แกะแล้วจากข้อ 4 แล้วรัน phpize
  6. ./configure –with-php-config=/usr/bin/php-config –with-lua=/usr –with-lua-version=5.2
    (ควรรัน which php-config เพิ่อ check path ของ php-config อีกทีเพื่อความชัวร์สำหรับ os ที่ลงอาจได้ path ไม่เหมือนกัน)
  7. nano /etc/php5/fpm/conf.d/lua.ini สร้างไฟล์ขึ้นมา (หรืออาจเป็น php.ini ก็ได้ในบาง os) แล้วพิมพ์ไปว่า extension=lua.so
  8. restart php5-fpm หรือ apache ตามแต่ web server ที่ Install ไว้
  9. ใช้งานได้เล้ย!

วิธีใช้งานก็ประมาณนี้


$lua = new Lua();
$lua->include($path);
$result = $lua->myFunction($param);

Vultr Cloud Hosting มีดีอย่างไร? by

30
Sep
0

ก่อนอื่นขอ Review เทียบ DigitalOcean vs Linode vs Vultr ที่เป็น SSD Cloud Hosting เหมือนกันนะครับ (หาข้อมูลจากในเน็ตมาเทียบๆ กันดูได้สรุปดังนี้)

Vultr - Performance ดีสุด Support ดีมาก Feature ครบครัน แต่ไม่ค่อยเปิดเผยข้อมูลว่า Hardware ที่รองรับด้านล่างเป็นอะไรบ้าง ราคาน่าจะถูกสุดเพราะมี 20% Discount อยู่ตอนนี้ เป็นน้องใหม่จากบรรดา 3 เจ้า Feature ใหม่ๆ ถูกพัฒนาอย่างต่อเนื่องรวดเร็วมาก ผ่านไปไม่กี่เดือน Feature ใหม่งอกตรึม ที่สำคัญ มี Private Network ที่ลูกค้าคนอื่นเข้าถึงไม่ได้ด้วยนะ! API ให้ยิงน้อยที่สุดใน 3 เจ้า เนื่องจากยังเป็นน้องใหม่อยู่ รอดูอนาคตยาวๆ อ้อ มี Location ให้เลือกมากสุดในสามเจ้าด้วย

Linode – Feature เยอะสุดเนื่องจากเก่าแก่ที่สุด (บุญเก่ามีเยอะ) ลูกค้าสามารถทำอะไรเองโดยไม่พึ่ง support ได้หลายอย่าง มี Feature ใกล้เคียง Dedicate Host มากที่สุด แต่ Support กากสุดๆ ตอบไม่ตรงคำถาม โบ้ยความผิด นั่นนี่ รู้สึกว่าคนดูแล support จะน้อยด้วย ส่วน Performance ดีเป็นอันดับสอง (แพ้แค่ 10%) ว่ากันตามจริงคน Review เชียร์ Linode เยอะมากๆ เรื่อง Stability และ Feature ที่เยอะกว่าคู่แข่ง สงสัยบุญเก่าเยอะจริง ข้อดีอีกอย่างคือสามารถ Scale up และ Scale down ผ่านหน้าเว็บโดยไม่ต้องกดสร้างจาก snapshot ได้ทำให้สะดวกกว่าเจ้าอื่นๆ

DigitalOcean – Performance กากสุด (ต่ำกว่าชาวบ้าน 2 เท่า) Feature น้อยสุด Support ดีเลิศที่สุด ถ้าทำอะไรพลาดหรือทำเราเสียเวลาจะคืนเป็น Credits ให้ น่าจะดังที่สุดในตอนนี้เพราะน่าจะออกสื่อบ่อยสุดละ รวมไปถึง community และ Document จะมากที่สุด

โอเค พอรู้จักกันแล้วมาเข้าสู่เนื้อหาว่า Vultr ทำอะไรได้บ้าง ข้อดีก็ตามนี้เลย

  • ราคาถูกกว่าชาวบ้าน performance ดีกว่าชาวบ้านตามที่ได้กล่าวไปแล้ว
  • มี Reserved IP เอาไปผูกติดกับ instance ไหนก็ได้ คล้าย Elastic IP ของ amazon ย้ายกลางทางก็ได้ (ต้อง restart เครื่อง กินเวลาประมาณ 3-5 นาที) ส่งผลให้ไม่ต้องสร้าง load balance มาคั่นกลางให้เปลืองค่า bandwidth และ spec เครื่องที่มีแต่ load balance เท่านั้น แถมในทางทฤษฎี ถ้า bandwidth ใกล้เต็มก็สามารถลบทิ้งสร้างใหม่เพื่อ Refill bandwidth ได้ด้วย (ยังไม่เคยทำหรอก แต่คิดว่าน่าจะได้ ถ้าไม่โดน ban 555)
  • มี location ให้เลือกมากกว่าคู่แข่งมาก
  • มี local storage หรือก็คือ instance ที่เป็น hdd จานหมุนธรรมดาให้เลือกใช้ใน network เดียวกันด้วย เอาไว้เก็บ backup ได้ง่ายๆ โดยดีกว่า ssd เรื่องความจุที่มากกว่า (แค่เรื่องเดียวน่ะแหละ) ตอนนี้มีแค่ 4 location ให้เลือกคือ New Jersey, Los Angeles, Amsterdam, Tokyo
  • Snapshot ฟรี! กี่อัน ขนาดเท่าไหร่ก็ได้ เนื่องจากยังเป็น beta (อนาคตอาจเก็บตัง)
  • Snapshot นี้จะ Restore กันข้าม Location ก็ได้นะ!
  • มี internal private network ที่ access จาก account ลูกค้าคนอื่นไม่ได้ ไม่เหมือนกัน digitalocean
  • มี kvm เข้าไปดูหน้าจอเครื่องได้เวลาเซ็ตค่า network อะไรผิดก็สามารถเข้าไปแก้ไขได้
  • ลง OS อะไรก็ได้จากเครื่องเรา ไม่จำเป็นต้องเป็น OS ที่ vultr เตรียมให้
  • มี IPv6
  • มี DDos Protection.
  • มี credit ให้ใช้ฟรีครั้งแรก $50 ผ่าน link นี้ !!

สำหรับ Reserved IP ต้องส่ง Ticket ไปขอเปิดใช้งานก่อนนะครับถึงจะใช้ได้ (ยัง Beta แต่ก็ไม่พบปัญหาอะไรเท่าที่ใช้มา) มี Trick เล็กน้อยคืออย่ากด convert ip ที่มีอยู่แล้วและผูกกับเครื่องอยู่ไปเป็น reserve ip เพราะคุณจะไม่สามารถถอด ip นั้นออกจาก Instance ตัวนั้นได้อีกต่อไปตลอดกาล จนกว่าจะลบ instance นั้นทิ้ง เพราะ Instance ตัวหนึ่งๆ จะต้องมี ip ผูกไว้อย่างน้อยหนึ่ง ip เป็นข้อกำหนดขั้นต่ำ เช่นเดียวกับการสร้าง Instance ใหม่ ห้ามสร้างโดยระบุ ip จาก reserved ip ไม่งั้นจะย้าย ip ไม่ได้นอกจากลบ instance ก่อนอีกเช่นกัน วิธีที่ถูกต้องคือให้ไปเพิ่ม reserve ip สำหรับเครื่องนั้นๆ โดยตรงแล้วค่อยกด detach และกด attach เข้าเครื่องใหม่ จึงจะสามารถย้าย ip ไปผูกกับเครื่องใหม่ได้อิสระโดยไม่ต้องทำลายเครื่องเก่าทันที ทำให้หากมีข้อผิดพลาดอะไรต้อง copy จากเครื่องเก่ามาก็ยังสามารถทำได้

ใช้มาเดือนนึงมีปัญหาติดขัดหน่อยนึงคือจู่ๆ Instance ก็ restart ตัวเอง! (เครื่อง database ด้วย แหม่… ดีที่ไม่พัง ข้อมูลยังไม่เยอะ) แต่เมื่อ restart vultr ก็รีบ email มาแจ้งทันทีว่าต้อง restart เนื่องจากเกิดเหตุ critical issue บางอย่างบน physical server ก็เลยจำเป็นต้องทำอย่างเร่งด่วน ก็รอดูต่อไปว่าจะมีปัญหาอย่างอื่นอีกไหม รวมๆ ก็ยังถือว่าดีอยู่ครับ ขอให้โชคดีนะครับทุกท่าน :)

 

Unity Profiler by

31
Aug
0

เคยหรือไม่ ทำเกมแล้วกระตุก เคยหรือไม่ ทำเกมแล้ว memory เกินจนภาพกระพริบ หรือกลายเป็นสีดำ เคยหรือไม่ว่าไม่รู้ว่าอะไรกิน Memory มากที่สุด! วันนี้เราขอนำเสนอ Profiler พระเอกของเรา!!

เนื่องจาก Unity 5 เป็นต้นไปสามารถใช้งาน Feature ต่างๆ ได้ฟรีแบบเต็มที่ แน่นอนว่ารวมไปถึง Profiler นี้ เรามาลองดูกันดีกว่า

profiler4

ภาพที่ 1

profiler1

ภาพที่ 2

 

  1. ขั้นแรกเราต้องเลือก Build Setting เป็น Development Build และ Auto Connect Profiler ก่อน Build APK หรือ Build เป็น XCode ตามรูปที่ 1
  2. กด CTRL + 7 หรือ Command + 7 เพื่อเปิดหน้าต่าง Profiler
  3. กดที่ Active Profiler ตามรูปที่ 2 เพื่อเลือกว่าเราต้องการจะดูข้อมูลการทดสอบที่ใด ถ้าดูที่ Editor เลยก็เลือก Editor ถ้าดูที่ Android ก็ต้องต่อ Wifi เดียวกันระหว่าง PC และ android เครื่องนั้นแล้วจะมีชื่อมือถือเครื่องนั้นมาให้เลือกตามรูปที่ 2 และสุดท้ายถ้าเป็น ios ก็ต้องเสียบ USB ครับ
  4. เมื่อเลือก Device ที่ต้องการแล้ว หากถูกต้องจะปรากฏกราฟวิ่งตลอดเวลา โดยมีหลากหลายอย่างให้เลือกดู ที่ดูบ่อยๆ ก็คงหนีไม่่พ้น CPU และ Memory ลองคลิกที่ Memory กันก่อน

profiler2

รูปที่ 3

profiler3

รูปที่ 4

  1. จากรูปที่ 3 จะเริ่มที่ simple ซึ่งเป็นภาพรวมของ memory ที่ใช้ ซึ่งเราสามารถคลิกเปลี่ยนเป็น Detailed แล้วจะมีคำว่า “Take Sample: xxx” อยู่ข้างๆ ตามรูปที่ 4 ให้กดและรอสัก 2-3 นาที (หากเปิด Profiler ก่อนเปิดโปรแกรมบนมือถืออาจเร็วกว่านั้น)
  2. เมื่อมีข้อมูลปรากฏ เราจะสามารถรู้ได้ทันทีว่า ณ เวลาที่เรากด Take Sample  อะไรที่กิน Memory มากที่สุด ซึ่งสิ่งที่กินมากที่สุดมักจะหนีไม่พ้น Texture 2D รองลงมาก็คือ Mesh หากเป็นเกม 3D และสุดท้ายคือ ManagedHeap หรือก็คือ Mono Memory ซึ่งจะเพิ่มอย่างเดียวไม่มีลด ก็ต้องคอยระวัง เคลียร์ค่า Texture 2D หรือ Mesh ไม่ให้ค้างใน Memory ตลอดเวลา ซึ่งหนึ่งในวิธีที่ง่ายที่สุดก็คือการ Load Scene ใหม่นั่นเอง
  3. หากต้องการดู CPU ก็คอยสังเกตว่ามีอะไรที่กราฟพุ่งสูงผิดปกติไหม สูงจนได้ fps ต่ำเกินไป และมี Draw Calls มากเกินไปหรือไม่

ขอให้โชคดีกับการทำเกมครับ :)

 

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน