วิธีการเลือกวิธีการจัดเก็บข้อมูล?


25

ให้ปลาแก่ผู้ชายและให้อาหารเขาหนึ่งวัน สอนชายคนหนึ่งให้ตกปลาและคุณให้อาหารเขาตลอดชีวิต - สุภาษิตจีน

ฉันสามารถถามที่เก็บข้อมูลชนิดใดที่ฉันควรใช้สำหรับโครงการจริงของฉัน แต่ฉันต้องการเรียนรู้การตกปลาดังนั้นฉันไม่จำเป็นต้องขอปลาในแต่ละครั้งที่ฉันเริ่มโครงการใหม่

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

ดังนั้นคำถามต่อไปนี้: ฉันจะเลือกประเภทของการจัดเก็บข้อมูลสำหรับโครงการเกมได้อย่างไร

และฉันจะสนใจเกณฑ์ต่อไปนี้เมื่อเลือก:

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

แก้ไขฉันรู้เกี่ยวกับการใช้ XML / JSON / Text หรือฐานข้อมูลเพื่อเก็บเนื้อหาของเกมดีกว่าไหม แต่คิดว่ามันไม่ตรงประเด็นของฉัน ตอนนี้ถ้าฉันผิดฉันก็ยินดีที่จะแสดงข้อผิดพลาดในทางของฉัน

EDIT2เพิ่มบางจุดเพิ่มเติมที่ฉันจะพิจารณาที่เกี่ยวข้อง นอกจากนี้ฉันยังสนใจที่จะฟังว่ามีตัวเลือกอื่นใดบ้างนอกเหนือจากที่จัดเก็บไฟล์แบนและฐานข้อมูลเชิงสัมพันธ์ ตัวอย่างเช่นฐานข้อมูลที่ไม่เกี่ยวข้อง เมื่อมีความเกี่ยวข้องกับการใช้ฐานข้อมูลดังกล่าวผ่านตัวเลือกอื่น ๆ ที่กล่าวถึงก่อนหน้า?


ฉันอยากรู้ว่าทำไมฉันถึงลงคะแนนเสียง คำถามของฉันกว้างเกินไปหรือไม่ ปิดหัวข้อ? จำเป็นต้องมีข้อมูลเพิ่มเติมหรือไม่?
Eldros

ฉันไม่ใช่ผู้ลงคะแนน แต่ได้โปรดเถอะนี่ถูกพูดถึงหลายครั้ง ลองใช้ช่องค้นหาดูไหม มันนำฉันไปสู่สิ่งนี้: gamedev.stackexchange.com/questions/4666/…
Notabene

1
@ notabene: ฉันรู้เกี่ยวกับหัวข้อนี้และอย่างใดคิดว่าขอบเขตของคำถามของฉันแตกต่างจากนี้ นี่คือการค้นหาคำตอบสำหรับเกมที่อิงองค์ประกอบ (ไม่ว่ามันจะเป็นอะไร แต่ฉันคิดว่ามีเกมประเภทอื่น ๆ อยู่ที่นั่น) และได้ลดทางเลือกลงไปแล้วและเกือบทุกคำตอบจะจัดการกับเทคโนโลยีชนิดหนึ่ง ในทางกลับกันฉันขอวิธีการพื้นฐานเกี่ยวกับวิธีการเลือกและฉันต้องการเปรียบเทียบมากขึ้น ตอนนี้หากชุมชนยังคงคิดว่ามันซ้ำซ้อนฉันจะลองลบคำถามนี้และพยายามหาคำตอบในหัวข้ออื่น
Eldros

มิฉะนั้นฉันต้องการทราบว่าฉันควรเปลี่ยนอะไรเพื่อให้ชัดเจนว่าเป็นคำถามอื่น
Eldros

@notabene: ยกตัวอย่างเช่นฉันแน่ใจว่ามีสถานการณ์ที่ไม่ได้ใช้ที่เก็บข้อมูลภายนอก แต่จะเก็บข้อมูลไว้ใน"รหัส"แทน
Eldros

คำตอบ:


21

คำถามของคุณเป็นจริงในวงกว้างเพราะจำนวนที่แท้จริงของประเภทออกมี แต่นี่เป็นมุมมองของนักพัฒนาซอฟต์แวร์มืออาชีพ

คุณระบุรายการของเกณฑ์ที่คุณต้องการใช้เพื่อกำหนดกลไกการคงอยู่ของข้อมูลที่คุณใช้ นั่นคือ:

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

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

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

สำหรับไฟล์แบน:

  • XML
  • JSON
  • YAML
  • XAML
  • ข้อความธรรมดา

สำหรับฐานข้อมูล:

  • เซิร์ฟเวอร์ SQL
  • MySQL
  • DB2
  • คำพยากรณ์
  • อื่น ๆ อีกมากมาย

แก้ไข:คุณถามเกี่ยวกับกลไกประเภทอื่นนอกเหนือจากไฟล์และฐานข้อมูลเชิงสัมพันธ์ ฐานข้อมูลประเภทเด่นอื่น ๆ ที่ฉันได้เห็นใช้เป็นประจำคือฐานข้อมูล "Berkeley-style" ซึ่งเป็นค่าคีย์ตาม สิ่งเหล่านี้มักจะใช้ B-trees เพื่อจัดโครงสร้างข้อมูลเพื่อการค้นหาที่รวดเร็ว สิ่งเหล่านี้ยอดเยี่ยมสำหรับการค้นหาการกำหนดค่า / การตั้งค่าที่คุณรู้ว่าสิ่งที่คุณต้องการ (เช่นให้ข้อมูล telemetry ทั้งหมดสำหรับ "ระดับ 1")

ตอนนี้เรามีข้อมูลพื้นฐานทั้งหมดแล้วลองมาดูเกณฑ์ของคุณกันบ้าง

ขนาดของโครงการ

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

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

แพลตฟอร์มที่กำหนดเป้าหมายโดยเกม

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

ความซับซ้อนของโครงสร้างข้อมูล

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

การพกพาข้อมูลในหลาย ๆ โครงการ

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

แก้ไข:มีข้อกังวลอื่น ๆ ที่คุณพูดถึงเกี่ยวกับการพกพาในความคิดเห็นของคุณ ท้ายที่สุดคุณไม่ต้องการให้ข้อมูลของคุณเชื่อมโยงอย่างแน่นหนากับผลิตภัณฑ์หรือประเภทไฟล์ใด ๆ วิธีที่ดีที่สุดคือถ้าคุณสามารถเก็บข้อมูลสต็อค (ระดับศัตรู ฯลฯ ) ในรูปแบบนามธรรมบางประเภท (ไฟล์ที่คั่นด้วยแท็บ XML ฯลฯ ) ซึ่งคุณสามารถแยกวิเคราะห์และจัดเก็บในฐานข้อมูล / ระบบไฟล์ได้อย่างง่ายดาย เวลา. ซึ่งหมายความว่าคุณสามารถสลับกลไกการจัดเก็บข้อมูลของคุณในราชประสงค์และเพียงเขียนชิ้นส่วนแยก

ควรเข้าถึงข้อมูลได้บ่อยแค่ไหน

การเข้าถึงข้อมูลจำนวนมากหมายถึง I / O จำนวนมากเว้นแต่คุณจะมีกลไกการแคชบางประเภท ฐานข้อมูลเก็บโครงสร้างไว้ในหน่วยความจำและเหมาะสำหรับการจัดการและดึงข้อมูล หากคุณเก็บข้อมูลอย่างต่อเนื่องจริงๆคุณอาจต้องการติดกับฐานข้อมูล

ข้อมูลหลายประเภทสำหรับแอปพลิเคชันเดียวกัน

ไดรฟ์ข้อมูลเป็นข้อพิจารณาอย่างแน่นอน แต่หากคุณไม่ได้พูดถึงการคงอยู่ของวัตถุเป็นพันหรือล้านระบบไฟล์จะยังคงได้รับการยอมรับว่าเป็นโซลูชัน

ประเภทเกม

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

หวังว่าข้อเสนอแนะนี้จะช่วยได้บ้าง มันไม่ได้ครอบคลุมอย่างสมบูรณ์และการตัดสินใจขึ้นอยู่กับคุณในท้ายที่สุด แต่ความเห็นของฉันควรให้สิ่งที่คุณคิด

แก้ไข:มีบางครั้งที่ใช้วิธี hybdrid ทำให้รู้สึกมาก ตัวอย่างเช่นสมมติว่าคุณกำลังพัฒนา MMORPG ในด้านไคลเอนต์คุณอาจเก็บข้อมูลที่แคชไว้เกี่ยวกับผู้เล่นอื่นในฐานข้อมูลที่ไม่เกี่ยวข้อง ที่ฝั่งเซิร์ฟเวอร์คุณกำลังเก็บข้อมูลเกมทั้งหมดในฐานข้อมูลเชิงสัมพันธ์เพื่อคงอยู่ จากนั้นอีกครั้งที่ฝั่งไคลเอ็นต์คุณอาจเก็บข้อมูลบันทึกข้อมูลการกำหนดค่า ฯลฯ ในไฟล์ XML / flat เพื่อให้เข้าถึงได้ง่าย

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


+1 คำตอบที่ยอดเยี่ยมและฉันเรียนรู้มากมายจากมัน นั่นเป็นเหตุผลที่ฉันเกลียดที่จะทำเช่นนั้น แต่มีบางประเด็นที่ไม่ได้รับการแก้ไขอย่างถูกต้อง และนั่นอาจเป็นเพราะฉันไม่สามารถแสดงออกได้อย่างเพียงพอ 1) จุดเล็ก ๆ น้อย ๆ แต่เมื่อฉันพูดถึงแพลตฟอร์มจริง ๆ แล้วฉันกำลังพูดถึงแพลตฟอร์มการพัฒนา แต่คุณพูดถึงประเด็นนี้แล้ว 2) โดยการพกพาฉันหมายถึงการใช้งานได้อีกครั้ง แต่ประเด็นของคุณเกี่ยวกับการพกพาคือความจริงที่ว่าฉันไม่เคยคิดมาก่อน (-> ต่อเนื่อง)
Eldros

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

อัปเดตแล้ว .. หวังว่านี่จะตอบคำถามของคุณ :)
Ed Altorfer

1

เมื่อเร็ว ๆ นี้ฉันพบว่าตัวเองถูก จำกัด ด้วยความแข็งแกร่ง / ความยากลำบากในการเพิ่มลงในฐานข้อมูลเชิงสัมพันธ์ ฉันชอบที่จะสำรวจฐานข้อมูลตามเอกสาร (เช่น couchdb) เนื่องจากดูเหมือนว่าเหมาะสำหรับเกมรัฐและความยืดหยุ่น แต่มันไม่จริงที่จะตั้งค่าฐานข้อมูลหลายประเภทสำหรับโครงการขนาดเล็ก เป็นผลให้ฉันได้ตั้งค่าการแฮ็กคล้ายกับเพียงแค่ใช้เขตข้อมูล blob แบบไบนารีในบางฟิลด์ของฐานข้อมูล

สิ่งที่ฉันทำคือการใช้ข้อมูลที่เข้ารหัส json ในฐานข้อมูลและ wrapper ที่แปลงข้อมูลเป็น json และถอยกลับเมื่อใดก็ตามที่จำเป็น ดังนั้นโปรไฟล์อักขระพื้นฐานอาจมีลักษณะเช่นนี้ในฐานข้อมูล:

{"char_id":24,"char_name":"tchalvak","level":43,"profile":"Some profile here."}

Json ยังคงสามารถอ่านได้อย่างดีในฐานข้อมูลดังนั้นหากคุณทำงานกับโลหะด้วย sql และบางครั้งเข้าถึงฐานข้อมูลโดยตรงเช่นกันก็สามารถแก้ไขได้ด้วยตนเองหากคุณต้องการ

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


0

ในยีน RTS ข้อมูลเกมถูกเก็บไว้ในไฟล์

หน่วยและคุณลักษณะได้รับการจัดเก็บไว้ในไฟล์ INI หรือ XML หรือรูปแบบข้อความอื่น ๆ และแบบจำลองมีการผสมผสานระหว่างรูปแบบไบนารีหรือแม้กระทั่งรูปแบบข้อความและพื้นผิวและเสียงและสื่ออื่น ๆ ในรูปแบบกระแสหลัก บางครั้งมันอยู่ในภาชนะบรรจุที่มีการเข้ารหัสที่หยาบ - รูปแบบการผสมผสานของ Westwood เป็นสิ่งสำคัญ แต่นี่เป็นเรื่องที่ทำให้งงงวย - ถ้าคุณดูข้างในพวกเขามันเป็นแค่ไฟล์ธรรมดาในรูปแบบที่ง่ายต่อการจัดการ

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


นี่ไม่ใช่กรณีใน "สงคราม AI" (เว็บไซต์ลง ATM) เขาใช้ฐานข้อมูลเชิงสัมพันธ์สำหรับ AI เพื่อให้สามารถทำการสอบถาม Linq เมื่อตัดสินใจพฤติกรรม
Nailer

0

เหตุใดจึงใช้วิธีหนึ่งในการจัดเก็บข้อมูล

ในกรณีส่วนใหญ่เกมที่คุณวางจำหน่ายไปทั่วโลกไม่จำเป็นต้องมีฟังก์ชั่นการจัดเก็บข้อมูลแบบเดียวกับที่เกมต้องการในระหว่างการพัฒนา

นี่คือการเปรียบเทียบข้อกำหนดของรุ่น / การพัฒนาบางส่วน: -

Requirement      |  Release  |  Development  |  QA
==================================================
Multi user       |    No     |      Yes      |  No
Writable         |    No     |      Yes      |  No
Revision Control |    No     |      Yes      | Yes (but only reading)
Compact          |   Yes     |       No      |  No
Fast             |   Yes     |       No      |  No

จากนั้นคุณจะต้องกำหนดอินเทอร์เฟซให้กับโมดูลการโหลดข้อมูลของคุณจากนั้นสร้างหลายเวอร์ชันโดยแต่ละแบบจะเหมาะกับความต้องการเฉพาะ

ในโครงการหนึ่งที่ฉันทำงานเมื่อหลายปีก่อนการโหลดข้อมูลระดับปิดซีดีใช้เวลานานเกินไป (จาก HD ไม่ดีเช่นกัน) ดังนั้นฉันจึงมาพร้อมกับสิ่งต่อไปนี้ ฉันมีสามวิธีในการโหลดข้อมูลระดับ: -

  1. การโหลดปกติ - สำหรับเวลาในการพัฒนาเมื่อมีการเปลี่ยนแปลงสินทรัพย์
  2. พรีรีลีส - วิธีการแปลงข้อมูลปกติให้เป็นข้อมูลการโหลดที่รวดเร็ว
  3. เผยแพร่ - ข้อมูลที่รวดเร็วเท่านั้น (ไม่สามารถแก้ไขได้)

ซึ่งช่วยลดเวลาในการโหลดจากนาทีเป็นวินาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.