แอปล่มเมื่อถึง 1.5Gb
สิ่งนี้ชี้ให้เห็นอย่างชัดเจนว่าคุณไม่ได้เป็นตัวแทนของกระเบื้องอย่างถูกต้องเพราะนั่นหมายความว่าแต่ละแผ่นมีขนาดประมาณ 80 ไบต์
สิ่งที่คุณต้องเข้าใจก็คือจะต้องมีการแยกระหว่างแนวคิดการเล่นเกมของไทล์และไทล์วิชวลที่ผู้ใช้เห็น ทั้งสองแนวคิดที่มีไม่ใช่สิ่งเดียวกัน
ยกตัวอย่าง Terraria Terraria ที่เล็กที่สุดในโลกใช้กระเบื้อง 4200x1200 ซึ่งเป็น 5 ล้านแผ่น ทีนี้หน่วยความจำใช้เวลาเท่าไหร่ในการเป็นตัวแทนโลกใบนี้?
ดีแต่ละกระเบื้องมีเลเยอร์เบื้องหน้าเลเยอร์พื้นหลัง (ผนังพื้นหลัง), "เลเยอร์ลวด" ที่สายไปและ "เลเยอร์เฟอร์นิเจอร์" ที่รายการเฟอร์นิเจอร์ไป หน่วยความจำแต่ละไฟล์ใช้เวลาเท่าใด อีกครั้งเรากำลังพูดถึงแนวคิดไม่ใช่มองเห็น
ไทล์พื้นหน้าสามารถจัดเก็บได้อย่างง่ายดายในช่วงสั้น ๆ มีประเภทไทน์เดอร์พื้นหน้าไม่เกิน 65536 ดังนั้นจึงไม่มีประโยชน์ในการใช้หน่วยความจำมากกว่านี้ แผ่นพื้นหลังอาจอยู่ในไบต์ที่ไม่ได้ลงนามได้ง่ายเนื่องจากมีแผ่นพื้นหลังน้อยกว่า 256 ชนิด ชั้นลวดเป็นไบนารีล้วนๆ: ทั้งกระเบื้องมีลวดอยู่ในนั้นหรือไม่ นั่นคือหนึ่งบิตต่อแผ่น และเลเยอร์ของเฟอร์นิเจอร์อาจเป็นไบต์ที่ไม่ได้ลงนามอีกครั้งทั้งนี้ขึ้นอยู่กับจำนวนชิ้นส่วนของเฟอร์นิเจอร์ที่เป็นไปได้
ขนาดหน่วยความจำทั้งหมดต่อไทล์: 2 ไบต์ + 1 ไบต์ + 1 บิต + 1 ไบต์: 4 ไบต์ + 1 บิต ดังนั้นขนาดโดยรวมของแผนที่ Terraria ขนาดเล็กคือ 20790000 ไบต์หรือ ~ 20MB (หมายเหตุ: การคำนวณเหล่านี้มีพื้นฐานมาจาก Terraria 1.1 เกมมีการขยายตัวมากตั้งแต่นั้นมา แต่แม้ Terraria สมัยใหม่อาจมีขนาดไม่เกิน 8 ไบต์ต่อตำแหน่งที่ตั้งของกระเบื้องหรือประมาณ 40MB แต่ก็ยังทนได้อยู่)
คุณไม่ควรจัดเก็บการแสดงนี้เป็นอาร์เรย์ของคลาส C # ควรเป็นอาร์เรย์ของจำนวนเต็มหรือบางอย่างที่คล้ายกัน AC # struct จะทำงานเช่นกัน
ตอนนี้เมื่อถึงเวลาต้องวาดส่วนหนึ่งของแผนที่ (สังเกตจุดเน้น) Terraria จำเป็นต้องเปลี่ยนแผ่นกระเบื้องแนวคิดเหล่านี้เป็นแผ่นกระเบื้องจริง กระเบื้องแต่ละอันต้องเลือกภาพพื้นหน้าภาพพื้นหลังภาพเฟอร์นิเจอร์เสริมและภาพลวด นี่คือที่ XNA มาพร้อมกับแผ่นสไปรต์ที่หลากหลายและเช่นนั้น
สิ่งที่คุณต้องทำคือการแปลงส่วนที่มองเห็นของแผนที่ความคิดของคุณให้เป็นแผ่นสไปรท์แผ่น XNA จริง คุณไม่ควรจะพยายามที่จะแปลงสิ่งทั้งหมดในครั้งเดียว ไทล์แต่ละอันที่คุณเก็บควรเป็นดัชนีที่บอกว่า "ฉันเป็นไทล์ประเภท X" โดยที่ X เป็นจำนวนเต็ม คุณใช้ดัชนีจำนวนเต็มนั้นเพื่อดึงข้อมูลสไปรต์ที่คุณใช้แสดง และคุณใช้สไปรต์แผ่นงานของ XNA เพื่อทำให้มันเร็วขึ้นกว่าแค่การวาดภาพแต่ละคน
ตอนนี้พื้นที่ที่มองเห็นได้ของกระเบื้องจะต้องแตกออกเป็นชิ้น ๆ หลาย ๆ ชิ้นดังนั้นคุณจะไม่ต้องสร้างแผ่นสไปรต์ทุกครั้งที่มีการเคลื่อนไหวของกล้อง ดังนั้นคุณอาจมี 64x64 ชิ้นของโลกเป็นแผ่นผีสาง ไม่ว่าชิ้นส่วนใดของโลกที่มองเห็นได้จากตำแหน่งกล้องปัจจุบันของผู้เล่นคือชิ้นส่วนที่คุณวาด ส่วนอื่น ๆ ไม่มีแผ่นผีสาง หากชิ้นส่วนหลุดออกจากหน้าจอคุณจะโยนแผ่นงานนั้นออก (หมายเหตุ: คุณไม่ได้ลบมันจริงๆคุณเก็บมันไว้รอบ ๆ และให้ความช่วยเหลือกับชิ้นใหม่ที่อาจปรากฏให้เห็นในภายหลัง)
ฉันต้องการให้มีการประมวลผลแผนที่ทั้งหมดอย่างน้อยในแอปเซิร์ฟเวอร์ (และลูกค้าถ้าเป็นไปได้)
เซิร์ฟเวอร์ของคุณไม่จำเป็นต้องรู้หรือสนใจเกี่ยวกับการแสดงภาพของไทล์ สิ่งที่จะต้องใส่ใจคือการนำเสนอแนวคิด ผู้ใช้เพิ่มไทล์ที่นี่ดังนั้นจึงเปลี่ยนดัชนีไทล์นั้น