[Lua] วิธีการ Debug แบบที่ต้องพึ่งผลลัพธ์แบบสุ่มจากฟังก์ชั่น math.random() by

31
Aug
0

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

ตัวอย่างเช่น
print(math.random(100))

57

ซึ่งเรารันอีกกี่ทีก็จะได้ 57 เหมือนเดิม

วิธีการ Debug ให้ได้หลายผลลัพธ์แรกคือ
1. ใส่ For ครอบ
for i=0, 10 ,1 do
print(isCritical(50)) //ใน isCritical มีเช็ค % กับ math.random(100)
end

false
false
false
false
*

จะทำให้ math.random() ของเราทำงานหลายครั้งและเปลี่ยนค่า จากตัวอย่างอาจจะติดในลูปครั้งที่ 5 และ Error ทันที

แต่ถ้าเรามีการกำหนด Seed ไว้ก่อน ให้นำ seed จากรอบที่มีปัญหามาเช็คได้เลย
2. กำหนด randomseed ก่อน
math.randomseed(seed)
print(isCritical(50))

ก็จะทำให้เราพบบรรทัดที่ Error ได้เลยเพราะ จะ Debug Error ในทันทีครับ

[Unity][Thread] Thread Ninja by

31
Aug
0

“Unity’s coroutine is great, but it’s not a real thread. And a background thread is not allowed to access Unity’s API.” ผู้สร้าง Thread Ninja ได้กล่าวไว้

จะสังเกตุได้ว่า หากมีการคำนวนหนักๆ ถึงแม้ว่าเราจะจับมันไปอยู่ใน Coroutine แล้วก็ตาม มันก็ยังส่งผลให้เกมของเราเกิดอาการกระตุก หรือ เฟรมเรต ตกลงไป นั่นเป็นเพราะว่าแท้จริงแล้ว Coroutine ของ Unity นั้น ไม่ใช่ Thread ที่แท้จริงนั่นเอง

วันนี้ผมจึงมานำเสนอ Thread Ninja ที่จะทำให้ชึวิตเราง่ายขึ้นมากกกกกในการเขียนโปรแกรมแบบ Multithread บน Unity ครับ

เจ้า Thread Ninja นี้มีวิธีใช้ง่ายแสนง่ายครับ

  • ก่อนอื่น หาโหลด Package Thread Ninja ได้จาก Unity Asset Store ครับ แล้วก็ Import เข้าไปใน Project เรา เราก็ได้จะได้ โฟลเดอร์ชื่อ CielaSpike มาอยู่ใน Project ครับ
  • ก่อนใช้ต้อง using CielaSpike; ก่อนครับ
  • ใช้ Thread Ninja ให้เหมือนใช้ Coroutine ธรรมดาเลยครับ คือปกติ เรียก Coroutine แบบนี้ใช่ไหมครับ StartCoroutine(Func()); แค่เปลี่ยนไปเรียกแบบนี้ this.StartCoroutineAsync(Func()); จบครับ
  • เปลี่ยนจาก yield return StartCoroutine(Func()); เป็น
    Task task; this.StartCoroutineAsync(YourRoutine(), out task); // do sth else. // wait task to complete. yield return StartCoroutine(task.Wait()); // task has done. if (task.State == TaskState.Error) { // … }
  • ข้อสำคัญครับ “background thread is not allowed to access Unity’s API” ครับ ดังนั้นถ้าเราอยากใช้ Unity API ในระหว่างที่มันอยู่ใน background thread เราก็ทำอย่างนี้ครับ
    IEnumerator YourAsyncRoutine() { // now on background;
    yield return Ninja.JumpToUnity; //=> here’s our ninja, following code runs on main thread.
    Destory(gameObject); // OK!
    yield return Ninja.JumpBack; //=> go back to background.
    // continue doing some heavy computing without blocking the main thread. // … }

 

ง่าาาายมากใช่ไหม เย่ๆ มาทำ Multithread Programming กันเถอะ

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 มากเกินไปหรือไม่

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

 

วิธีอ้างอิงข้อมูลด้วยชื่อคอลัมม์ by

30
Aug
0

เมื่อทำงานผ่าน PHPExcel มาสักระยะ ทุกท่านก็คงจะพบปัญหาเช่นเดียวกับผม คือ ข้อมูลที่เราเคยอ้างถึงมันถูกเลื่อนออกจากจุดเดิมไป ทำให้ข้อมูลขาดหายไปโดยไม่รู้ตัว ตัวผมเองก็หาวิธีจัดการกับปัญหานี้เช่นกัน
พยายามรืัอ libraries หา function สำเร็จรูปแต่ก็ไม่พบ ถ้าใครพบก็ฝากแจ้งด้วยนะครับ
จึงหาวิธีจัดการเรื่องนี้ด้วยตนเอง วิธีก็คือ

  1. สร้างแถวสำหรับระบุคอลัมน์ โดยชื่อห้ามซ้ำกันเด็ดขาด
  2. ประกาศตัวแปร $header มารับข้อมูลจาก function สมมติว่าอยู่แถวที่ 1$header=array_flip($data[1]);
  3. เวลาใช้งานก็แทนคอลัมน์จาก สมมติว่า A =name เดิม$data[2]['A'] เป็น $data[2][$header['name']]

หลังจากนี้ ไม่ว่า name จะย้านไปอยู่คอลัมน์ไหน ก็ไม่มีปัญหาอีกต่อไป

การทำภาพเงาสะท้อนใน PS by

30
Aug
0

1.เริ่มแรกเปิดภาพขึ้นมา(โดยภาพจะต้องไม่มีพื้นหลังตามภาพ)
01

2.จากนั้นกด Ctrl+j เพื่อก็อปปี้เลเยอร์ซ้ำอีกรูป
02

3.กด Ctrl+t จะมีกรอบสีเหลี่ยมขึ้นมา และให้คลิกขวาตรงกรอบสี่เหลี่ยม จะมีแถบเมนูขึ้นมาเลือก flip vertical ตามรูป(1) จะได้ภาพกลับหัว(2)
03

4.จากนั้นขยับภาพลงมาข้างล่างแล้วจับบีบนิดหน่อย เมื่อพอใจแล้วกด Enter กรอบจะหายไป
05

6.กดปุ่ม G เพื่อใช้คำสั่ง Gradient tool และเลือกเฉดขาวสลับดำตามรูป
06

7.ไปที่เมนู Layer >> Layer Mask >> Reveal All
8.เมือกเลือกเสร็จแล้ว เม้าจะเปลี่ยนเป็นเครื่องหมาย+ ให้คลิกเม้าซ้ายเลือกจากล่างขึ่นบน (จุดนี้อยุ่ที่ตวามชอบ) จะได้ภาพคล้ายๆเงาออกมาตามนี้
final

เสร็จแล้วหวังว่าจะมีประโยชน์นะครับ

กู้เงิน | เศรษฐกิจพอเพียง | สินเชื่อบุคคล | สมัครบัตรกดเงินสด | สินเชื่อ | เงินกู้ด่วน | ยืมเงินทรูมูฟ | เงินด่วนนอกระบบ