1.5 Gb'ye ulaştığında uygulama kilitleniyor.
Bu, döşemelerinizi doğru bir şekilde temsil etmediğinizi kuvvetle önerir, çünkü bu, her döşemenin ~ 80 bayt boyutunda olduğu anlamına gelir.
Anlamanız gereken şey , bir döşemenin oyun konsepti ile kullanıcının gördüğü görsel döşeme arasında bir ayrım olması gerektiğidir . Bu iki kavram aynı şey değildir .
Örneğin Terraria'yı ele alalım. En küçük Terraria dünyası, 5 milyon fayans olan 4200x1200 fayans alır. Şimdi, o dünyayı temsil etmek için ne kadar bellek gerekiyor ?
Her karonun bir ön plan katmanı, bir arka plan katmanı (arka plan duvarları), tellerin gittiği bir "tel katmanı" ve mobilya öğelerinin gittiği bir "mobilya katmanı" vardır. Her kutucuk ne kadar bellek kaplar? Yine, sadece kavramsal olarak konuşuyoruz, görsel olarak değil.
Bir ön plan karosu, imzasız bir kısa sürede kolayca saklanabilir. 65536'dan fazla ön plan döşeme türü yoktur, bu nedenle bundan daha fazla bellek kullanmanın bir anlamı yoktur. Arka plan döşemeleri, 256'dan az farklı arka plan döşemesi olduğundan, işaretsiz bir baytta kolayca olabilir. Tel katman tamamen ikiliktir: bir kiremitin içinde bir tel vardır veya yoktur. Yani her karo için bir bit. Ve mobilya katmanı, olası kaç farklı mobilya parçasına bağlı olarak, yine işaretsiz bir bayt olabilir.
Döşeme başına toplam bellek boyutu: 2 bayt + 1 bayt + 1 bit + 1 bayt: 4 bayt + 1 bit. Bu nedenle, küçük bir Terraria haritası için toplam boyut 20790000 bayt veya ~ 20MB'dir. (not: bu hesaplamalar Terraria 1.1'e dayanmaktadır. Oyun o zamandan beri çok genişlemiştir, ancak modern Terraria bile fayans yeri başına 8 bayt veya ~ 40MB'ye sığabilir. Yine de tolere edilebilir).
Sen gerektiğini asla C # sınıfların diziler olarak depolanan bu temsilin. Tamsayı dizileri veya benzeri bir şey olmalıdırlar. AC # struct da çalışır.
Şimdi, bir haritanın bir parçasını çizmenin zamanı geldiğinde (vurguyu not edin), Terraria'nın bu kavramsal karoları gerçek karolara dönüştürmesi gerekiyor . Her döşemenin aslında bir ön plan görüntüsü, arka plan görüntüsü, isteğe bağlı bir mobilya görüntüsü seçmesi ve bir tel görüntüsüne sahip olması gerekir. XNA, çeşitli sprite sayfaları ve benzeri ile buraya gelir.
Yapmanız gereken, kavramsal haritanızın görünür kısmını gerçek XNA sprite sayfası döşemelerine dönüştürmektir. Sen dönüştürmek için çalışıyor olmamalıdır seferde şeyin tamamını . Sakladığınız her bir döşemenin "Ben X döşemeliyim" diyen bir dizin olması gerekir; burada X bir tamsayıdır. Görüntülemek için kullandığınız hareketli grafiği almak için bu tamsayı dizinini kullanırsınız. Ve bunu tek tek dörtlü çizmekten daha hızlı yapmak için XNA'nın sprite sayfalarını kullanırsınız.
Şimdi, döşemelerin görünür bölgesinin çeşitli parçalara bölünmesi gerekiyor, böylece kamera her hareket ettiğinde sürekli sprite sayfaları oluşturmuyorsunuz. Yani dünyanın sprite sayfaları olarak 64x64 parçalarına sahip olabilirsiniz. Dünyanın 64x64 parçaları hangisinin oynatıcının mevcut kamera konumundan görünür olursa olsun çizdiğiniz parçalardır. Diğer parçaların sprite sayfaları bile yoktur; bir yığın ekrandan düşerse, bu sayfayı dışarı atarsınız (not: gerçekten silmiyorsunuz; etrafında tutuyor ve daha sonra görünebilecek yeni bir yığın için saygı duyuyorsunuz).
Tüm haritanın en azından sunucu uygulamasında (ve mümkünse istemcide) işlenmesini istiyorum.
Kişisel sunucu biliyor ya karoların görsel sunum umurumda gerekmez. Tek dikkat etmesi gereken kavramsal temsildir. Kullanıcı buraya bir kutucuk eklediğinden kutucuk dizinini değiştirir.