นินเทนโดประกาศความสำเร็จของเกม Pokémon Scarlet and Violet สามารถทำยอดขาย 10 ล้านชุดได้ภายใน 3 วันแรกที่วางขาย ถือเป็นเกมที่ยอดขายช่วงเปิดตัวสูงสุดในประวัติศาสตร์ของนินเทนโด
ยอดขาย 4.05 ล้านชุดมาจากในญี่ปุ่นประเทศเดียว ส่วนที่เหลือคือประเทศอื่นๆ รวมกัน ส่วนสถิติของภาคที่แล้ว Pokémon Sword and Shield ทำไว้คือ 2 ล้านชุดใน 3 วันแรกที่วางขาย
ถึงแม้ Pokémon Scarlet and Violet ถูกวิจารณ์อย่างหนักเรื่องคุณภาพของเกม โดยเฉพาะกราฟิกที่มีบั๊กการแสดงผลมากมาย แต่กระแสโปเกมอนรอบนี้มาแรงจริงๆ ต่อให้มีเสียงวิจารณ์ก็ไม่สามารถส่งผลกระทบต่อยอดขายได้
สถิติยอดขายเกมอันดับหนึ่งของ Nintendo Switch คือ Mario Kart 8 Deluxe มียอดขายสะสมอยู่ที่ 48.41 ล้านชุด ตามด้วย Animal Crossing: New Horizons ยอดขายสะสม 40.17 ล้านชุด
Comments
ถล่มทลายครับ
บั๊กเพียบถล่มทลาย แล้วผมซื้อแบบดิจิตอลด้วย เฮ้อ
ไม่ค่อยได้เล่นเกม ไม่รู้เดี๋ยวนี้ยังใช้แค่ thread เดียว (ไม่นับ render loop thread) กันอยู่หรือเปล่า
สมัยนี้ต้อง event-base driven (แบบ Chrome, Firefox, Nginx ) แยก thread ทำแต่ละหน้าที่หรือ สร้าง worker ช่วยกัน process แล้วล่ะ
ไม่งั้นเอา graphic สมัยนี้ไม่อยู่
ถ้าไม่ใช่ dev คงไม่มีทางรู้นะผมว่า (ฮา) หรือเราจะหารอมมาแล้วต่อ debugger เถื่อนดี
ส่วนตัวผมว่า ก็อาจจะเป็น event-driven ได้ครับ คือเรามี game object แล้วแต่ละ object ก็ spawn event ออกมา แล้วก็มี Handler มารับไป ฯลฯ แต่ event ทั้งหมดจะถูก process ใน frame เดียวกัน ไม่ใช่ว่าทำแยกออกจาก rendering ครับ ไม่งั้นจะเกิดปัญหาการ synchronization คือมันไม่ใช่แบบ กดปุ่ม A แล้วไปกระโดดในอีก 3 เฟรมข้างหน้า แบบนี้ไม่ได้ input ของเฟรมไหนต้องทำงานในเฟรมนั้น
ปรกติแล้วโครงสร้างของเกมมันจะมีโค๊ดประมาณว่า
(อันนี้โค๊ดผมนะ โค๊ดคนอื่นก็คงเขียนแตกต่างกันออกไป แล้วก็เขียนย่อสุด ๆ ด้วย อย่างเรื่อง frame time นี่ผมตัดไปก่อนละกัน คิดซะว่ามันเป็นโค๊ด Doom ที่รันบนเครื่องตรวจครรภ์ก็ได้ครับ 555)
ถ้าจะทำ Multi-thread เท่าที่เคยอ่าน (คือสมัยผมเขียนเอนจินเอง ผมเขียนแค่ single-thread น่ะครับ 555) เค้าจะใช้วิธีการแตก thread ในแต่ละขั้นตอนให้ทำงานย่อย ๆ พร้อมๆ กัน เช่นขั้นตอน process เองก็อาจจะทำการคำนวน state ใหม่ของหลาย ๆ Object ในฉากพร้อมๆ กัน ส่วนขั้นตอน render ก็จะอัพเดตพวก VBO, image, ฯลฯ (ตรงนี้ลืมหมดแล้ว api ใหม่ๆ ก็คงมีอะไรอย่างอื่นอีก) เหมือน ๆ กันหมด คือจะต้องรอให้ process เสร็จก่อนแล้วค่อย render ทีเดียว เพราะถ้า process ไป render ไป ก็มีโอกาสที่ภาพกับ state ไม่ตรงกันได้ อะไรงี้ครับ
ที่จริง จะเขียน process กับ rendering เป็น 2 thread แยกกันก็ได้ (แล้วให้แต่ละ thread ไปแตก task ย่อย ๆ เอง) แต่ว่าการ sync ข้อมูลก็จะ sync กันทีเดียวพร้อม ๆ กันทุก object ในฉาก ไม่ใช่ว่าเฮ้ยทำอันไหนเสร็จแล้วเอาไปก่อน แบบนี้เจ๊งครับ ส่วนตัวผมว่า มันก็เวิร์คถ้าเรา process กับ render ด้วยความถี่ที่แตกต่างกัน แต่ดูแล้วการ sync ข้อมูลกันมันดูน่าปวดหัวแปลกๆ และอาจจะเกิด deadlock/livelock ได้ด้วย ส่วนข้อดีคือไม่ว่า hw จะช้าหรือเร็ว การคำนวนจะเกิดด้วยความถี่เท่ากัน ดังนั้นไอ้เรื่องแบบใครใช้ hw แรงๆ เฟรมไทม์สั้น ๆ แล้วได้เปรียบ ก็จะไม่เกิดครับ
ทีนี้ เครื่องเกมสมัยนี้เป็น multi-core หมดแล้ว อย่าง Nintendo Switch ก็ใช้ Tegra X1 ที่มี Cortex-A57 4 คอร์ (จริง ๆ เคยมีอีกสี่คอร์ แต่ปิดไป) ผมเดาว่านอกจากมือใหม่มาก ๆ คงไม่เขียน single-thread แล้วล่ะครับ แต่การแตก thread ก็อย่างที่ว่า คือไม่ใช่มีหลาย ๆ เธรดทำงานหลายๆ อย่างพร้อมกันตลอดเวลา แต่จะเป็นการทำงานเป็นอย่างๆ ให้เสร็จทั้งหมดแล้ว terminate
ทั้งนี้มันก็อาจจะมี thread บาง thread ที่ทำงานตลอดเวลาบ้างเหมือนกันครับ เช่น audio mixer แต่ก็ขึ้นกับการออกแบบครับ จะเขียนเป็น synchronized ก็ได้เหมือนกัน (mixer thread นี่ ขอให้เติมดาต้าลงบัฟเฟอร์ได้ทันก่อนอันเดอร์รัน ก็เป็นอันใช้ได้)
ผมเขียนคอมมเม้นนี้แบบ พิมพ์ไปพลาง คิดไปพลาง ก็ตกผลึกอะไรใหม่ ๆ ได้เหมือนกัน ขอบคุณครับ ทั้งนี้คือผมก็ไม่ได้เขียนเกมเอนจินเป็นอาชีพ (แล้ว) ล่ะนะ สมัยนี้เค้าอาจจะมีอะไรใหม่ ๆ ก็ได้ แล้วก็อาจจะมีอะไรผิดพลาดได้เหมือนกันครับ อ่านอะไรยาว ๆ แบบนี้ก็ระวังนิดนึงนะครับ 555
พอเห็นเกมมัน Fps ต่ำ ผมก็คิดว่าน่าจะเป็นที่ object มันเยอะทำให้ recalculate meshes แต่ละ frame นาน
เลยนึกได้ครับ (ผมชอบเปิด process ดู แต่ไม่ค่อยได้สังเกต thread)
ว่าเกมน่ะมันชอบมีอยู่ process เดียว
แต่ software สมัยนี้มันชอบมีหลายๆ process เลยคิดว่าน่าจะเอามาช่วยตรงนี้ได้
คือสร้างเป็น recalculate mesh worker ให้ run เป็น parallel ไปเลยไม่ต้องเสียเวลา create/join thread บ่อยๆ ใช้ event communicate ระหว่าง thread เอา
ข้อดีคือ ถ้ายังไม่พอมันก็สร้าง worker เพิ่มได้
ข้อเสีย อาจจะยุ่งยากตอนออกแบบ program
อย่าเชื่อผมมากนะครับ ผมไม่เคยเขียนเกม เคยใช้แค่ 3D engine เขียน application เท่านั้นเอง
ส่วนเรื่อง replay ยาวนี้ไม่มีปัญหาครับ ถึงผมจะอ่านเร็ว อ่านตก แต่ผมจะชอบอ่านซ้ำๆ เพื่อให้แน่ใจว่าเข้าใจถูกด้วย
(เผื่อใครงงว่าทำไมเดี๋ยว thread เดี๋ยว process คือ process ก็คือ main thread นะครับ)
ที่ web browser เค้าแยกโปรเซสกัน คือเรื่องความปลอดภัยครับ เป็นการสร้าง sandbox เผื่อไว้เวลาที่ถ้า tab นึงมีช่องโหว่ มันจะได้ไปโดนการจัดการโปรเซสของ OS ดักเอาไว้อีกชั้นนึงครับ เว็บไซต์นึงมันจะได้ไม่สามารถเข้าถึงข้อมูลของอีกเว็บนึงที่อยู่ในแท๊บข้างๆ ได้ ข้อเสียคือมันมี overhead สูงครับ สังเกตได้ ตอนที่ Browser เปลี่ยนมาใช้โมเดลนี้ใหม่ ๆ browser กินแรมหนักกว่าเดิมมาก (น่าจะเป็นเท่าตัวเลยถ้าผมจำไม่ผิด)
แล้วก็สื่อสารกันระหว่าง process เอง (สมมติว่าใช้ service worker) เองก็มี overhead และ latency ประมาณนึง อันนี้คนเคยเขียนพวก electron น่าจะรู้
ซึ่งเกมมันไม่ได้มีความจำเป็นนี้ไง เพราะทั้งเกมก็มาจากผู้ผลิตเจ้าเดียวกัน ในทางกลับกันเค้าต้องพยายามลด overhead ให้ได้เยอะที่สุดเพราะว่า resource มีจำกัดและข้อมูลที่ใช้ก็มีขนาดใหญ่ด้วย
เนื่องจากเกมจะเป็น multi-threading ไม่ใช่ multi-process แบบพวก Browser ดังนั้นถ้าเราเปิด task manager ขึนมาดูจะเห็นแค่ process เดียวครับ ใน windows เหมือนจะเคยดูได้มั้งว่า process นั้นมีกี่ thread แต่ผมหาไม่เจอละ เจอแต่ว่าทั้งระบบรันอยู่กี่ thread
เรื่องการคำนวน mesh นี่มันเกิดขึ้นใหม่ทุกเฟรมและขึ้นกับ state ของ object นั้นครับ ถ้าเป็นพวก static mesh มันก็อัพขึ้น gpu ตรง ๆ ได้เลย แต่พอมันเป็น skin mesh ปุ๊บ ก็ต้องคำนวน mesh ใหม่ในเฟรมนั้นว่า เออแขนต้องยื่นไปข้างหน้าเท่านี้นะ หน้าต้องหันไปทางนี้นะ ฯลฯ ตรงนี้คำนวนใน cpu ดังนั้นปริมาณ object ที่ใช้ skin mesh อย่างพวกตัวละครต่าง ๆ เนี่ยมีผลต่อ cpu load มากครับ
แน่นอนว่า ก็แตก thread ไปได้ ซีพียูมี 8 คอร์ อาจจะใช้สัก 4 thread สำหรับเรื่อง animation อย่างเดียว ก็ได้ ก็เป็นวิธีที่ทำกันปรกติอยู่แล้วครับ... คิดว่านะ 555
ทั้งนี้ก็มีคนที่ทำ skin mesh animation ใน gpu ด้วยเหมือนกันครับ
ดูจำนวน thread ของแต่ละ process ได้จาก resource monitor ครับ
Jusci - Google Plus - Twitter
ส่วนเรื่องทำไมเฟรมเรทต่ำ
ผมเดาว่า ... object ในฉากมันเยอะครับ ซีพียูทำงานไม่ทันมั้ง คือกราฟิคมันไม่ได้หนี arceus เท่าไหร่เลยน่ะครับ
arceus สนุกกว่าอะ นึกว่าจะปาบอลรัวๆ ได้ซะอีก -*-
The Dream hacker..
ไม่รู้เอาออกทำไม หรือแยกการพัฒนาเป็นสองสายก็ไม่รู้
ก็เห็นปู่บอกว่า arceus ไม่ใช่ภาคย่อย เป็นภาคหลัก ก็อาจจะสร้างเกม pokemon legends กับ pokemon เป็นเกมหลักแยกจากกัน 2 เกมก็ได้ แต่ก็นั้นแหละ งงว่าอะไรดีๆ ใน arceus ถึงไม่เอามาลงใน S/V
The Dream hacker..
ผมว่าเรื่อง bug สำหรับผมแทบจะมองข้ามเลย ถ้าเคยเล่น Pokemon มาเยอะๆ จะรู้ว่าภาคนี้พัฒนาเยอะมาก Gameplay สนุกมากด้วย น่าจะเป็นต้นแบบสำหรับ Pokemon ภาคถัดๆ ไป ถ้าเป็นภาคเก่ามันเป็นเส้นตรง เล่นแป๊บเดียวก็จบ พอมาเป็น Open World แวะนู่น แวะนี่ไปเรื่อย ยังไปไม่ถึงไหนเลย 555