romegames 1
romegames
kaptanmikro1 1
kaptanmikro1
Reklam vermek için turkmmo@gmail.com

Lazy Item ID

  • Konuyu başlatan Konuyu başlatan Tunga
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 32
  • Görüntüleme Görüntüleme 2K
Merhaba. Oyunda yaratılan her eşyaya, yaratıldığı anda benzersiz bir ID atanıyor (ITEM_MANAGER::CreateItem -> SetID(GetNewID())).
Bu ID'ler db tarafından 10 milyonluk bloklar halinde dağıtılır ve hiçbir zaman geri kullanılmaz. Alan bittiğinde no more item id yazıp kapanır.
Aslında yaratılan eşyaların önemli bir kısmının ID'ye hiç ihtiyacı olmadığını biliyor muydunuz? Yerde süresi dolup kaybolan eşyalar ve alındığı anda mevcut bir stack'e birleşip silinen eşyalar item tablosuna hiç yazılmıyor, ama her biri kalıcı olarak bir ID kullanıyor.
Oyunda aynı anda milyarlarca eşya olması mümkün değil. Ama ID'ler geri kullanılmadığı için, yıllar içinde harcanan toplam 32 bitin sınırına (4,2 milyar) ulaşabiliyor ve bu israf o günü öne çekiyor. Birkaç basit düzenleme ile bu israfı büyük ölçüde ortadan kaldırabiliriz.

Bu düzenleme ile eşya ID'siz, "bekleyen" durumda yaratılıyor. ID, ilk kez istendiğinde atanıyor: envantere girerken, kaydedilirken, takasta, loglanırken. Mevcut GetID() çağrılarının hiçbirini değiştirmek gerekmiyor. Yalnızca, belki hiç kaydedilmeyecek bir eşyanın silindiği ya da loglandığı birkaç yolda ID üretmeyen PeekID() kullanılıyor. Yan kazanç olarak, hiç kaydedilmemiş bir drop yok olurken db'ye gönderilen gereksiz ITEM_DESTROY paketi de kalkıyor.

Test sunucusunda 9 karakter aynı anda otomatik av çalıştırdı AddressSanitizer açık şekilde.
26 dakikalık denetlenmiş pencerede item tablosu 1070'ten 1076 satıra çıktı ve tüm sunucuda yalnızda 8 id üretilid. ve hepsi ardışık, boşluk yok ve sekizi de gerçekten kalıcı bir slota giren eşyaya gitti (4 GM, 1 NPC den alınan, 1 upgrade den çıkan, 2 stack bölme).
Aynı pencerede mevcut stack'e birleşen 5 eşya ve yerde süresi dolan 4 dropta hiç id üretmedi. eski davranışta bunların dokuzu da birer ID tüketirdi. Silinen 2 satırla birlikte tam 1070 + 8 − 2 = 1076.
Yok abi tövbe edicem vallahi billahi daha 2 gün önce çözdüm kendi kendime bugün Alper fixliyor, delirmemek elde degil bendekini iptal edip bunu yamalicam yüksek ihtimalle ellerine saglık.
 
Merhaba. Oyunda yaratılan her eşyaya, yaratıldığı anda benzersiz bir ID atanıyor (ITEM_MANAGER::CreateItem -> SetID(GetNewID())).
Bu ID'ler db tarafından 10 milyonluk bloklar halinde dağıtılır ve hiçbir zaman geri kullanılmaz. Alan bittiğinde no more item id yazıp kapanır.
Aslında yaratılan eşyaların önemli bir kısmının ID'ye hiç ihtiyacı olmadığını biliyor muydunuz? Yerde süresi dolup kaybolan eşyalar ve alındığı anda mevcut bir stack'e birleşip silinen eşyalar item tablosuna hiç yazılmıyor, ama her biri kalıcı olarak bir ID kullanıyor.
Oyunda aynı anda milyarlarca eşya olması mümkün değil. Ama ID'ler geri kullanılmadığı için, yıllar içinde harcanan toplam 32 bitin sınırına (4,2 milyar) ulaşabiliyor ve bu israf o günü öne çekiyor. Birkaç basit düzenleme ile bu israfı büyük ölçüde ortadan kaldırabiliriz.

Bu düzenleme ile eşya ID'siz, "bekleyen" durumda yaratılıyor. ID, ilk kez istendiğinde atanıyor: envantere girerken, kaydedilirken, takasta, loglanırken. Mevcut GetID() çağrılarının hiçbirini değiştirmek gerekmiyor. Yalnızca, belki hiç kaydedilmeyecek bir eşyanın silindiği ya da loglandığı birkaç yolda ID üretmeyen PeekID() kullanılıyor. Yan kazanç olarak, hiç kaydedilmemiş bir drop yok olurken db'ye gönderilen gereksiz ITEM_DESTROY paketi de kalkıyor.

Test sunucusunda 9 karakter aynı anda otomatik av çalıştırdı AddressSanitizer açık şekilde.
26 dakikalık denetlenmiş pencerede item tablosu 1070'ten 1076 satıra çıktı ve tüm sunucuda yalnızda 8 id üretilid. ve hepsi ardışık, boşluk yok ve sekizi de gerçekten kalıcı bir slota giren eşyaya gitti (4 GM, 1 NPC den alınan, 1 upgrade den çıkan, 2 stack bölme).
Aynı pencerede mevcut stack'e birleşen 5 eşya ve yerde süresi dolan 4 dropta hiç id üretmedi. eski davranışta bunların dokuzu da birer ID tüketirdi. Silinen 2 satırla birlikte tam 1070 + 8 − 2 = 1076.
paylaşım için teşekkür ederim kankam (nerde bu yapay zeka ile tokenim bitti limit yenilensin açıklayacağım diyenler :D diyeceğimde her şeyi açıklamışsın anlaşılır şekilde eline sağlık )
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst