จะเขียนเกมเครือข่ายได้อย่างไร? [ปิด]


73

จากเหตุผลที่ว่าทำไมการพัฒนา MMO จึงเป็นเรื่องยาก :

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

ฉันรู้ทฤษฎีเกี่ยวกับซ็อกเก็ตเซิร์ฟเวอร์ลูกค้าโปรโตคอลการเชื่อมต่อและสิ่งต่าง ๆ

ตอนนี้ฉันสงสัยว่าจะเรียนรู้วิธีการเขียนเกมเครือข่ายได้อย่างไร:

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

มีหนังสือบทแนะนำเว็บไซต์บทความที่น่าสนใจหรือคำถามอื่น ๆ เกี่ยวกับเรื่องนี้หรือไม่?

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


4
ใช่มีหนังสือบทแนะนำเว็บไซต์บทความที่น่าสนใจและคำถามอื่น ๆ เกี่ยวกับเรื่องนี้
Ricket

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

คำตอบ:


61

นอกเหนือจากบทความที่เชื่อมโยงกับคำตอบอื่น ๆ ฉันสามารถบอกเล่าประสบการณ์ของโครงการ Arianneได้เล็กน้อย

ทำอย่างไรให้ซิงโครไนซ์กัน?

เรามีโครงสร้างการสร้าง„ Marauroa ” รอบ ๆ แนวคิดของการกระทำและการรับรู้: การดำเนินการจะถูกส่งจากลูกค้าไปยังเซิร์ฟเวอร์ที่มีการป้อนข้อมูลของผู้ใช้เช่น (เดินไปทางซ้ายโจมตีมอนสเตอร์ # 47 พูดว่า 'hello') และการรับรู้จะถูกส่งจากเซิร์ฟเวอร์ไปยังลูกค้าบอกพวกเขาเกี่ยวกับสถานะของโลกรอบตัวพวกเขา การรับรู้เหล่านั้นจะถูกส่งทุกเทิร์น ขึ้นอยู่กับเกมที่เราใช้เวลาเปิด 30ms ถึง 300ms

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

วิธีแก้ไขปัญหาความล่าช้า

เราเชื่อมั่นอย่างยิ่งใน“ เซิร์ฟเวอร์ที่ถูกต้องเสมอ” ลูกค้าทำการคาดการณ์บางอย่างเช่นการเดินอย่างราบรื่นการตรวจสอบการชนและอื่น ๆ แต่ถ้าลูกค้าและเซิร์ฟเวอร์ไม่เห็นด้วยกับสิ่งใดเซิร์ฟเวอร์จะเป็นผู้ชนะ โครงการย่อยสเตนดาห์ล (RPG 2 มิติ) ใช้เวลาเปิด 300ms โดยค่าเริ่มต้น (พร้อมกับฝั่งไคลเอ็นต์ที่ทำเสร็จแล้วจำนวนมาก) สิ่งนี้ทำให้สเตนดาห์ลทนทานต่อความล่าช้าได้มาก

หมายเหตุ: เกมอื่น ๆ บางเกมเชื่อใจลูกค้าว่าจะมีการขยายเพิ่มเพื่อลดผลกระทบจากความล่าช้าของเครือข่าย ใน WoW นั้นมักถูกโจมตีจากหนึ่งในสนามรบที่ชื่อว่า“ Warsong Gulch” มีสองวิธีที่ผู้เล่นที่มีธงสามารถเลือกได้: เปิดตรงกลางผ่านอุโมงค์และอีกวิธีหนึ่งในการมองขึ้นไปบนเนินเขา ดังนั้นผู้เล่นโกงจะวิ่งไปที่อุโมงค์แล้วทำให้เกิดความล่าช้าสำหรับตัวเขาเอง เซิร์ฟเวอร์และไคลเอนต์อื่น ๆ จะยังคงเห็นเขาทำงานต่อไป แต่หลังจากนั้นไม่นานไคลเอนต์นี้สามารถบอกเซิร์ฟเวอร์ว่ามันเดินไปที่เนินเขา WoW จะตรวจสอบว่าระยะห่างระหว่างพิกัดที่ส่งล่าสุดกับพิกัดปัจจุบันนั้นอยู่ในช่วงเวลาหรือไม่และยอมรับว่า

การใช้ UDP กับ TCP

ในรุ่นก่อนหน้าเราใช้ UDP เพื่อลดค่าใช้จ่ายของ TCP เราจัดการแพ็คเก็ตที่หายไปด้วยตัวเอง สิ่งนี้ทำงานได้อย่างสมบูรณ์ในช่วงแรกของโครงการ แต่เมื่อเซิร์ฟเวอร์ถูกย้ายจากการเชื่อมต่อ DSL ที่บ้านไปยังศูนย์ข้อมูลจริงเมื่อหลายปีก่อนเรามีปัญหาใหญ่ UDP คือ (หรืออย่างน้อยก็เมื่อ 5 ปีก่อน) ที่ต้องการพลัง CPU ของฮาร์ดแวร์ไฟร์วอลล์อย่างมาก: กฎจะต้องนำไปใช้กับทุก ๆ UDP แพ็คเก็ต สำหรับ TCP อย่างไรก็ตาม ruleset จะใช้กับ 3 แพ็กเก็ตแรกเท่านั้น หลังจากนั้นจะทำการเชื่อมต่อ แพ็กเก็ตต่อไปนี้ทั้งหมดจะข้ามชุดกฎปกติเนื่องจากอยู่ในตารางติดตามการเชื่อมต่อหรือเนื่องจากไม่มีสถานะ SYN

วิธีการป้องกันการสื่อสารและลูกค้าจากวิศวกรรมย้อนกลับ?

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

ง่ายต่อการป้องกันการสื่อสารจากการดมกลิ่นที่ไม่ได้รับอนุญาตจากบุคคลที่สามโดยใช้ SSL

อย่างไรก็ตามเป็นไปไม่ได้ที่จะปกป้องมันจากวิศวกรรมย้อนกลับ แน่นอนว่าคุณสามารถทำให้งงและใช้เทคนิคการดีบัก แต่ในที่สุดคุณไม่สามารถป้องกันวิศวกรรมย้อนกลับของซอฟต์แวร์ที่คุณมอบให้แก่ผู้ใช้ มีการนำเสนอที่น่าสนใจอย่างมากเกี่ยวกับวิธีที่ Skype ถูกออกแบบวิศวกรรมย้อนกลับแม้นักพัฒนาจะใช้ความพยายามอย่างมากในการต่อต้านการดีบั๊กเทคนิค: http://recon.cx/en/f/vskype-part1.pdf

หมายเหตุ: มีบางประเทศที่วิศวกรรมย้อนกลับผิดกฎหมายหรืออนุญาตให้ใส่ย่อหน้าลงในใบอนุญาตหรือ ToS ไม่อนุญาตให้ใช้วิศวกรรมย้อนกลับ แต่มีประเทศอื่น ๆ (เช่นที่ฉันอาศัยอยู่) ซึ่งอนุญาตให้วิศวกรรมย้อนกลับอย่างชัดเจนในบริบทของการพัฒนารูปแบบการจัดเก็บข้อมูลที่เข้ากันได้หรือโปรโตคอลการส่งสัญญาณย่อหน้าในใบอนุญาตหรือ ToS พยายามที่จะไม่อนุญาต (ทุกสิ่งในส่วนนี้เท่าที่ฉันรู้ฉันไม่ใช่นักกฎหมาย)

สิ่งใดที่ควรคำนวณภายในเครื่องและสิ่งใดบนเซิร์ฟเวอร์

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

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

วิธีการสมดุลปัญหาโหลด?

พยายามทำให้สิ่งนี้ง่ายที่สุดเท่าที่จะทำได้เพื่อลดความยุ่งยากในการบำรุงรักษา

โหลดบาลานซ์ของเนื้อหาสแตติกเป็นที่รู้จักกันดีในพื้นที่ของเซิร์ฟเวอร์ http คลัสเตอร์และเครือข่ายการกระจายเนื้อหา

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

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

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

ฉันได้ลงรายละเอียดในหัวข้อนี้ที่วิธีการสร้างสมดุลใน MMO เป็นอย่างไร


1
คุณพูดถึงว่า UDP ต้องการ CPU เพิ่มขึ้นเล็กน้อย แต่คุณล้มเหลวที่จะพูดถึงว่า TCP ต้องการการเดินทางอย่างน้อยสามครั้งระหว่างไคลเอนต์และเซิร์ฟเวอร์ก่อนที่จะประมวลผลแพ็คเก็ตและแพ็คเก็ตจะถูกบัฟเฟอร์จนกว่าจะได้รับแพ็กเก็ตก่อนหน้าทั้งหมด จำนวนความล่าช้าในการรอแพ็คเก็ตที่ไม่เกี่ยวข้องกันอีกต่อไป ดูเหมือนว่าเป็นสิ่งสำคัญที่จะพูดถึง
BlueRaja - Danny Pflughoeft

2
@ Danny, มีสามแพ็กเก็ตที่จำเป็นในการเริ่มต้นการเชื่อมต่อ TCP ใหม่: ไคลเอนต์ไปยังเซิร์ฟเวอร์: SYN, เซิร์ฟเวอร์ไปยังไคลเอนต์: SYN ACK, ไคลเอนต์ไปยังเซิร์ฟเวอร์: ACK + data นั่นคือการเดินทางไปกลับมากกว่า UDP แต่เกิดขึ้นเมื่อเริ่มต้นเมื่อลูกค้าติดต่อกับเซิร์ฟเวอร์เป็นครั้งแรก ในการเชื่อมต่อที่จัดตั้งขึ้นทุกแพ็คเก็ตจะถูกประมวลผลทันทีโดยไม่มีการเดินทางไปกลับเพิ่มเติม จะมีคำตอบ ACK แต่ข้อมูลที่ได้รับจะถูกประมวลผลแล้วในขณะที่แพ็กเก็ต ACK เดินทางกลับ
Hendrik Brummermann

1
@ Danny, TCP จัดการการสูญหายของแพ็คเก็ตโดยอัตโนมัติและมีประสิทธิภาพมาก เป็นการยากที่จะปรับใช้ตัวคุณเองโดยใช้ UDP เว้นแต่ว่าโปรโตคอลของคุณใช้ได้กับแพ็กเก็ตที่ไม่ได้ส่งแบบสุ่ม ปัญหาต่อไปคือ TCP รับรองว่าลำดับของแพ็กเก็ตในขณะที่แพ็กเก็ต UDP อาจได้รับในลำดับที่ไม่ถูกต้อง อีกครั้งเป็นการยากที่จะนำไปใช้ใหม่ด้วยตัวคุณเองเว้นแต่คุณจะไม่สนใจแพ็คเก็ตที่เก่ากว่าตัวอย่างเช่นตามตัวนับแพ็กเก็ต หากจำเป็นต้องใช้เวลาตอบสนองสั้น ๆ สำหรับ TCP อัลกอริทึมของ Nagleต้องถูกปิดใช้งาน
Hendrik Brummermann

ดูเหมือนว่าคุณได้ป้องกันตำแหน่งของคุณอย่างรุนแรงโดยไม่ได้แก้ไขปัญหา TCP lag จริง ๆ บางทีปัญหาที่แท้จริงคือการเลือกไฟร์วอลล์ฮาร์ดแวร์แทนโพรโทคอลการป้องกัน DDoS
MickLH

27

http://gafferongames.com/networking-for-game-programmers/

เป็นบทความที่ยอดเยี่ยมเกี่ยวกับปัญหาและวิธีแก้ไขปัญหาต่าง ๆ ที่เกี่ยวข้องกับการสร้างเครือข่ายเกม


1
+1 แต่โปรดอย่าไว้ใจพวกเขาอย่างเด็ดขาด ตามประสบการณ์ของฉันเช่นมันไม่ควรใช้ UDP และสร้างใหม่คุณสมบัติของ TCP UPD มีประโยชน์เฉพาะเมื่อแพ็คเกจที่สูญหายไม่มีผลกระทบใด ๆ เลยนั่นคือแพ็คเกจ UDP ทุกอันมีสถานะที่เกี่ยวข้องอย่างสมบูรณ์ของโลก WoW ใช้ TCP, SL กำลังดำเนินการย้ายจาก UDP เป็น TCP (แม้แต่ HTTP สำหรับเนื้อหาแบบสแตติก) และมีการปรับปรุงประสิทธิภาพอย่างมากเมื่อมีการเปลี่ยนแปลงเหล่านี้
Hendrik Brummermann

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

2
Second Life ปรับปรุงประสิทธิภาพอย่างมากโดยเปลี่ยนจาก UDP เป็น HTTP ผ่าน TCP: blogs.secondlife.com/community/technology/blog/2010/08/13/…
Hendrik Brummermann

5
ไม่จริงพวกเขาปรับปรุงประสิทธิภาพของการสตรีมเนื้อหาโดยเปลี่ยนวิธีการทำงาน การใช้ HTTP / TCP ในอินสแตนซ์นั้นทำให้ง่ายต่อการใช้งานไม่ใช่เร็วขึ้น ฉันอาจทราบด้วยว่า zeromq เป็นโครงการที่น่าสนใจและมันอาจขยายได้อย่างมากสำหรับเครือข่ายเกม zeromq.org
jsimmons

8

คุณอาจสามารถหลีกเลี่ยงการเขียนโปรแกรมเครือข่ายระดับต่ำได้ทั้งนี้ขึ้นอยู่กับประเภทของเกมที่คุณเขียน เกมบางประเภทไม่ต้องการการสื่อสารไปมาระหว่างไคลเอนต์และเซิร์ฟเวอร์จำนวนมาก ในกรณีเช่นนี้เราสามารถเลือกใช้เฟรมเวิร์กระดับสูงกว่าได้ ตัวอย่างเช่นฉันกำลังพัฒนาเกมวางแผนเทิร์นเบสใน C # /. NET เกมกลยุทธ์แบบเปิดใช้งานจะมีลักษณะเฉพาะที่การสื่อสารของลูกค้า / เซิร์ฟเวอร์ส่วนใหญ่เกิดขึ้นที่จุดเริ่มต้นและจุดสิ้นสุดของเทิร์นด้วยค่อนข้างน้อยในระหว่าง ดังนั้นฉันเลือกที่จะใช้ Windows Communication Foundation (WCF) ซึ่งเป็นเฟรมเวิร์กการสื่อสารระดับสูงที่ออกแบบมาสำหรับเว็บเซอร์วิสเป็นหลัก แทนที่จะทำงานกับซ็อกเก็ตโดยตรงและเครือข่ายไร้สาระระดับต่ำทั้งหมดฉันสามารถทำให้สิ่งที่ดูเหมือนเป็นการเรียกใช้เมธอดมาตรฐาน และให้ WCF จัดการกับโปรโตคอลและเลเยอร์การขนส่งสำหรับฉัน ครั้งเดียวที่ฉันต้องจัดการกับสิ่งต่าง ๆ ในเครือข่ายระดับต่ำคือเมื่อฉันกำหนดค่าจุดปลายซึ่งเป็นข้อตกลงครั้งเดียวในไฟล์ปรับแต่ง อาจยังจำเป็นต้องใช้ตรรกะการทำให้เป็นอนุกรมที่กำหนดเองบางอย่าง แต่คุณต้องทำสิ่งนั้นโดยไม่คำนึงถึง


8

คำถามกว้างเกินไป คำตอบสามารถเติมเว็บไซต์ทั้งหมดด้วยตัวเอง แต่มีหนังสือที่สัมผัสกับสิ่งนี้เป็นหลักสองคนนี้:

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

(โปรดทราบว่าฉันกำลังพูดถึง MMO มากขึ้นในคำถามเดิม - 'เกมเครือข่าย' อาจหมายถึงสิ่งต่าง ๆ ทุกอย่างตั้งแต่เกมข้อความที่ใช้ PHP ไปจนถึง MMO และคำถามย่อยไม่ได้มีทั้งหมด นำไปใช้กับแต่ละประเภท)


7

วิธีการสมดุลปัญหาโหลด?

ขนาดทางภูมิศาสตร์คงที่ + อินสแตนซ์หลายตัวเป็นวิธีที่ง่ายที่สุด พวกที่ทำงานกับ SWG ลองใช้ขนาดไดนามิกและรู้สึกเสียใจ

วิธีจัดการสถานะเกม

เซิร์ฟเวอร์มีสิทธิ์

ทำอย่างไรให้ซิงโครไนซ์กัน?

อัพเดทการซิงค์เป็นระยะจากเซิร์ฟเวอร์ (ไม่ค่อยแน่ใจว่าสิ่งที่เป็นกังวลอยู่ที่นี่)

วิธีการป้องกันการสื่อสารและลูกค้าจากวิศวกรรมย้อนกลับ?

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

วิธีแก้ไขปัญหาความล่าช้า

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

สิ่งใดที่ควรคำนวณภายในเครื่องและสิ่งใดบนเซิร์ฟเวอร์

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

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


4

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

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