Nidavelir Filesı ile Grafiksel Çıldırmacalar

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 20
  • Gösterim Gösterim 785
Benim kodlarda model.cpp dosyasında

bool CGrannyModel::LoadMeshs():
Genişlet Daralt Kopyala
eski:
granny_int32x grni32xTypeCount =
    GrannyGetTotalTypeSize(
        pgrnMesh->PrimaryVertexData->VertexType
    ) / 32;
 
yeni:

const granny_int32x grni32xTypeCount =
    GrannyGetTotalTypeSize(pgrnMesh->PrimaryVertexData->VertexType) /
    static_cast<granny_int32x>(sizeof(granny_data_type_definition));

değişmiş oldu yapay zeka açıklaması ise :

Granny’nin model bilgilerini tutan granny_data_type_definition isimli bir veri yapısı var.

Eski kod bu yapının boyutunu her sistemde 32 bayt kabul ediyordu. Bu varsayım 32 bit istemcide tesadüfen çalışıyordu. x64’e geçince yapı içindeki pointerlar 4 bayttan 8 bayta çıktığı için yapının gerçek boyutu değişti.

Kod hâlâ 32 bayt üzerinden ilerleyince:

  • Bellekte yanlış adrese gidiyordu.
  • Dizinin sınırını aşıyordu.
  • GR2 model yüklenirken bozuk pointer okuyordu.
  • Karakter seçiminden sonra CGrannyModel::LoadMeshs içerisinde istemci kapanıyordu.
Sabit değer kaldırılıp gerçek boyut kullanılmaya başlandı:
Yani kod artık veri yapısının 32 veya 64 bit sistemdeki gerçek boyutunu kendisi hesaplıyor. Bu düzeltme GR2 dosyasını değiştirmedi; yalnızca x64 istemcinin Granny verisini bellekte doğru okumasını sağladı.
Şimdi hatırladım, ben ilk başta başka bir şey sandım o yüzden sormuştum.

Ayrıca directx9ex kullanıyorsan eski dx9dan kalma reset ve case bloklarının ve bunların çağrılarının sıklığını silip azaltabilirsin. Dx9Ex'de cihazın lost, need_reset döndürmesi falan çok çok düşük bir ihtimal. Process fonksiyonu içinde sadece cihazın D3DERR_DEVICEREMOVED(gpu driver sorunu / gpunun kendisiyle alakalı fiziksel bir sorun) ya da S_PRESENT_MODE_CHANGED(tam ekran oynarken masaüstü çözünürlüğü değiştirilmesi vb.) döndürüp döndürmediğini sorgulayıp ona göre işlem yaptırman yeterli. Buna bağlı olan diğer yerlerdeki eski Release.../Create... çağrılarını falan silebilirsin, kod sadeliği için.

Ben dx9ex kullanırken hepsini kökten silmiştim ama mimari olarak tercih edilen bir tasarım değil tabi. DX11 düşüncen varsa da öylece bırakabilirsin, zaten ileride otomatik olarak çöp olacaklar.
 
Geri
Üst