Tags:
Node Thumbnail

นินเทนโดประกาศความสำเร็จของเกม 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 ล้านชุด

No Description

ที่มา - Nintendo, Kotaku

Get latest news from Blognone

Comments

By: whitebigbird
Contributor
on 24 November 2022 - 10:41 #1270043
whitebigbird's picture

ถล่มทลายครับ

บั๊กเพียบถล่มทลาย แล้วผมซื้อแบบดิจิตอลด้วย เฮ้อ

By: rattananen
AndroidWindows
on 24 November 2022 - 11:26 #1270044

ไม่ค่อยได้เล่นเกม ไม่รู้เดี๋ยวนี้ยังใช้แค่ thread เดียว (ไม่นับ render loop thread) กันอยู่หรือเปล่า
สมัยนี้ต้อง event-base driven (แบบ Chrome, Firefox, Nginx ) แยก thread ทำแต่ละหน้าที่หรือ สร้าง worker ช่วยกัน process แล้วล่ะ
ไม่งั้นเอา graphic สมัยนี้ไม่อยู่

By: mr_tawan
ContributoriPhoneAndroidWindows
on 25 November 2022 - 00:52 #1270119 Reply to:1270044
mr_tawan's picture

ถ้าไม่ใช่ dev คงไม่มีทางรู้นะผมว่า (ฮา) หรือเราจะหารอมมาแล้วต่อ debugger เถื่อนดี

ส่วนตัวผมว่า ก็อาจจะเป็น event-driven ได้ครับ คือเรามี game object แล้วแต่ละ object ก็ spawn event ออกมา แล้วก็มี Handler มารับไป ฯลฯ แต่ event ทั้งหมดจะถูก process ใน frame เดียวกัน ไม่ใช่ว่าทำแยกออกจาก rendering ครับ ไม่งั้นจะเกิดปัญหาการ synchronization คือมันไม่ใช่แบบ กดปุ่ม A แล้วไปกระโดดในอีก 3 เฟรมข้างหน้า แบบนี้ไม่ได้ input ของเฟรมไหนต้องทำงานในเฟรมนั้น

ปรกติแล้วโครงสร้างของเกมมันจะมีโค๊ดประมาณว่า

state_t state{};
while(true) {
  auto input = read_input();
  state = process(state, input);
  render(state);
}

(อันนี้โค๊ดผมนะ โค๊ดคนอื่นก็คงเขียนแตกต่างกันออกไป แล้วก็เขียนย่อสุด ๆ ด้วย อย่างเรื่อง 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


  • 9tawan.net บล็อกส่วนตัวฮับ
By: rattananen
AndroidWindows
on 25 November 2022 - 10:31 #1270154 Reply to:1270119

พอเห็นเกมมัน 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 นะครับ)

By: mr_tawan
ContributoriPhoneAndroidWindows
on 25 November 2022 - 21:16 #1270216 Reply to:1270154
mr_tawan's picture

ที่ 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 ด้วยเหมือนกันครับ


  • 9tawan.net บล็อกส่วนตัวฮับ
By: mementototem
ContributorJusci's WriterAndroidWindows
on 28 November 2022 - 09:05 #1270363 Reply to:1270216
mementototem's picture

ดูจำนวน thread ของแต่ละ process ได้จาก resource monitor ครับ


Jusci - Google Plus - Twitter

By: rattananen
AndroidWindows
on 28 November 2022 - 15:24 #1270415 Reply to:1270216
  • ถึง pattern มันจะคล้าย service worker ของ web API แต่มันเอา performance มาเทียบกันไม่ได้เลยครับ เพราะ web API มันต้องถูกจำกัดอะไรหลายอย่างว่าด้วยเรื่อง security
  • worker ที่ผมพูดถึงน่ะไม่จำเป็นต้องเป็น process ครับเพราะมันอาจจะช้ากว่าแบบ thread ด้วยเรื่องข้อจำกัดของ การ access memory (ถ้าสร้าง worker ให้เป็น thread มันจะ access memory ใน process เดียวกันได้ไม่ต้องใช้ IPC ซึ่งมันควรจะเร็วกว่าถ้า access memory กันตรงๆ)
  • idea ผมมาจาก coroutine ของ GO https://youtu.be/LvgVSSpwND8?t=973 + Nginx worker + PHP fpm + ASIO library ที่ create หลาย thread listen socket ได้
  • เดี๋ยวนี้ตอนผมอ่าน API reference ของ c++ library หรืออื่นๆ ผมจะเจอคำว่า non-blocking function มากขึ้น ทีแรกผมก็ไม่รู้ว่ามันคืออะไร พอลองหาคำตอบที่แท้มันก็คือ event base/observe pattern นั้นเอง ประกอบกับเดี๋ยวนี้ผมใช้ pattern นี้มากขึ้นผมเลยคิดว่า event base/observe pattern มันต้องมีดีอะไรคนเลยใช้กันมากขึ้น
By: mr_tawan
ContributoriPhoneAndroidWindows
on 25 November 2022 - 01:03 #1270120 Reply to:1270044
mr_tawan's picture

ส่วนเรื่องทำไมเฟรมเรทต่ำ

ผมเดาว่า ... object ในฉากมันเยอะครับ ซีพียูทำงานไม่ทันมั้ง คือกราฟิคมันไม่ได้หนี arceus เท่าไหร่เลยน่ะครับ


  • 9tawan.net บล็อกส่วนตัวฮับ
By: Aize
ContributorWindows PhoneAndroidWindows
on 24 November 2022 - 12:06 #1270048
Aize's picture

arceus สนุกกว่าอะ นึกว่าจะปาบอลรัวๆ ได้ซะอีก -*-


The Dream hacker..

By: whitebigbird
Contributor
on 24 November 2022 - 12:56 #1270053 Reply to:1270048
whitebigbird's picture

ไม่รู้เอาออกทำไม หรือแยกการพัฒนาเป็นสองสายก็ไม่รู้

By: Aize
ContributorWindows PhoneAndroidWindows
on 24 November 2022 - 14:49 #1270063 Reply to:1270053
Aize's picture

ก็เห็นปู่บอกว่า arceus ไม่ใช่ภาคย่อย เป็นภาคหลัก ก็อาจจะสร้างเกม pokemon legends กับ pokemon เป็นเกมหลักแยกจากกัน 2 เกมก็ได้ แต่ก็นั้นแหละ งงว่าอะไรดีๆ ใน arceus ถึงไม่เอามาลงใน S/V


The Dream hacker..

By: akira on 24 November 2022 - 20:48 #1270105

ผมว่าเรื่อง bug สำหรับผมแทบจะมองข้ามเลย ถ้าเคยเล่น Pokemon มาเยอะๆ จะรู้ว่าภาคนี้พัฒนาเยอะมาก Gameplay สนุกมากด้วย น่าจะเป็นต้นแบบสำหรับ Pokemon ภาคถัดๆ ไป ถ้าเป็นภาคเก่ามันเป็นเส้นตรง เล่นแป๊บเดียวก็จบ พอมาเป็น Open World แวะนู่น แวะนี่ไปเรื่อย ยังไปไม่ถึงไหนเลย 555