Hata giderme

GMod'da ED_Alloc: no free edicts: edict limiti nedir?

ED_Alloc: no free edicts, tüm edict'lerin dolu olduğu anlamına gelir. Edict nedir, GMod'da limit nerede, mapper'lar ve sunucu sahipleri ne yapabilir?

Edict, ağ üzerinden eşitlenen entity'lerin, yani sunucunun client'lara aktarabildiği tüm nesnelerin listesindeki bir slottur. Garry's Mod'da bu slotlardan 8192 tane vardır. Hepsi dolduğunda motor ağ üzerinden eşitlenen yeni bir entity oluşturamaz; yine de birine ihtiyaç duyarsa sunucu ED_Alloc: no free edicts ile sonlanır. Tek çare daha az entity oluşturmaktır: mapper olarak dinamik nesneler yerine statik nesnelerle, sunucu sahibi olarak limitlerle, temizliklerle ve kendisi az şey getiren bir haritayla.

Edict nedir ve neler edict kullanır

Motor iki liste tutar. Birinde edict'i olan entity'ler bulunur. Edict sayesinde bir entity sunucuda ve her client'ta aynı numaraya sahip olur ve aktarılabilir. Diğerinde yalnızca sunucuda ya da yalnızca bir client'ta var olan entity'ler bulunur. Ağ üzerinden eşitlenen bir entity, hiç hareket etmese bile oluşturulduğu andan kaldırıldığı ana kadar edict'ini meşgul eder.

Edict kullanırKullanmaz
Oyuncular, taşınan her silah, projectile'larBSP'ye gömülü olan prop_static ve prop_detail
prop_physics, prop_dynamic, prop_ragdoll, araçlar, NPC'lerDünya geometrisinin parçası olan world brush'lar ve func_detail
func_door ya da func_brush gibi brush entity'lerlogic_timer, logic_case ya da math_counter gibi mantık entity'leri ve fizik constraint'leri
env_sprite ve adı olan ışıklarTemp entity olarak gönderilen kısa ömürlü efektler

Tablo, Source Engine'in standart kodunu (Source SDK 2013) ve Valve Developer Community'yi izler, çünkü GMod'un kendi motor kodu herkese açık değildir. Sağ sütundaki mantık entity'leri bedava değildir. Bunlar ikinci listeye sayılır; Valve Developer Community'ye göre bu liste de GMod'da 8192 girdi alır. Statik prop'ların neden en baştan entity olarak hiç var olmadığı prop_static, prop_dynamic ve prop_physics yazısında anlatılıyor.

GMod'da limit nerede

Source Engine kodunda MAX_EDICT_BITS sabiti, bir entity numarasını aktarmak için kaç bit kullanılacağını belirler. Source SDK 2013'te bu 11 bittir, bu da 2048 edict eder. Garry's Mod limiti yükseltti. Birbirine karıştırmaman gereken üç limit var:

LimitGMod'daki değerAşıldığında ne olur
Ağ üzerinden eşitlenen entity'ler (edict'ler)8192Yeni entity'ler reddedilir; en kötü durumda sunucu ED_Alloc: no free edicts ile sonlanır
Ağ üzerinden eşitlenmeyen entity'ler8192Motor entity'yi oluşturmaz ve konsola bir uyarı yazar
Derleme sırasında harita dosyasındaki girdiler65536VBSP durur

İlk iki değer Valve Developer Community'den gelir, Garry's Mod wiki'si de ilkini doğrular. Üçüncüsü VBSP'nin MAX_MAP_ENTITIES değeridir; Garry's Mod'un Mart 2024 güncellemesi bunu yalnızca derleme araçları için 65k'ya yükseltti. Bir testte güncel VBSP, harita dosyası dünya dahil 65536 girdi içerir içermez num_entities == MAX_MAP_ENTITIES ile durdu ve her prop_static sayıya dahildi. VBSP'nin limitleri Source Engine harita limitleri yazısının konusudur.

Pratikte son daha erken gelir. GMod wiki'sine göre ents.Create, oyuncu slotu sayısına ve diğer entity'lere bağlı olarak, kullanılan edict sayısı daha 8064 ile 8176 arasında bir yerdeyken başarısız olur. Limite yaklaşıldığında GMod bilerek yeni entity oluşturmayı bırakır. Sandbox'ta oyuncu o zaman "Failed to create an entity. Server likely hit the entity limit." mesajını görür. Geçersiz bir entity beklemeyen addon'lar o andan itibaren Lua hataları vermeye başlar. Çökme, bu önleme rağmen hiç slot kalmadığında kapıya dayanır.

Sunucuda entity'leri ve edict'leri saymak

Şu komutları sunucu konsoluna gir:

lua_run print(ents.GetEdictCount(), ents.GetCount())
report_entities
sv_lowedict_threshold
sv_lowedict_action
  • ents.GetEdictCount() ağ üzerinden eşitlenen entity'lerin sayısını, ents.GetCount() ise tüm entity'lerin sayısını döndürür.
  • report_entities tüm entity'leri sınıflarına göre adetleriyle listeler ve edict'leri de belirten bir toplam satırıyla biter.
  • sv_lowedict_threshold ve sv_lowedict_action motor değişkenleridir. Değer vermeden girildiklerinde geçerli ayarı gösterirler.

İki kez ölç: bir kez harita başladıktan hemen sonra oyuncu yokken, bir kez de en yoğun saatte. İlk sayı haritanın taban maliyetidir. Aradaki fark, oyuncuların ve addon'ların oluşturduklarıdır.

Harita beraberinde ne getirir ve mapper olarak nasıl tasarruf edersin

BSP'de entity olarak kayıtlı olan ve başlangıçta kendini kaldırmayan her şey slotunu kalıcı olarak tutar. Taban maliyeti şöyle düşük tutarsın:

  1. Prop'ları statik yap. Her prop_dynamic ve prop_physics bir edict'e mal olur, bir prop_static ise hiçbirine.
  2. Brush'ları birleştir. Tek bir func_brush içindeki birkaç brush tek bir entity'dir. Bir işleve ihtiyaçları yoksa onları func_detail yap; derleme sırasında entity listesinden tamamen kaybolurlar.
  3. Işıkları adsız bırak. Source Engine'in standart kodunda (Source SDK 2013), adı olmayan bir light ya da light_spot harita başlarken kendini kaldırır, çünkü ışığı zaten lightmap'lerdedir. Adı varsa entity olarak kalır.
  4. Sprite'ları kontrol et. Her env_sprite ağ üzerinden eşitlenen bir entity'dir. GMod'un FGD'sinde env_sprite_clientside bulunur. Valve Developer Community'ye göre bu entity, ne adı ne de parent'ı olduğu sürece başlangıçtan sonra sunucuda kaldırılır.
  5. Bone follower'lara dikkat et. Modeli eklemli bir çarpışma modeline sahip olan bir prop, her parça için ek bir phys_bone_follower entity'si oluşturur. prop_dynamic üzerindeki Disable Bone Followers özelliği bunu önler ama çarpışmadan olursun.

Sonucu Map Scanner ile kontrol edebilirsin. Bir BSP için entity sayısını ve en sık geçen entity sınıflarını gösterir. Başka ayar noktaları GMod harita performans optimizasyonu yazısında ele alınıyor.

Oyuncular ve addon'lar çalışma zamanında neler ekler

  • Oyuncular: Her oyuncu bir entity'dir, envanterindeki her silah da bir başka entity'dir.
  • Spawn'lanan prop'lar: Sandbox her prop'u prop_physics olarak oluşturur. sbox_maxprops için varsayılan değer oyuncu başına 200'dür. 40 oyuncuyla bu, 8000'e kadar prop ve dolayısıyla neredeyse bütçenin tamamı demek olurdu.
  • Diğer Sandbox limitleri: Sandbox varsayılan olarak oyuncu başına ayrıca 10 ragdoll'a, 4 araca, 10 NPC'ye ve 100 entity'ye (sbox_maxsents) izin verir.
  • Wiremod: Expression 2'den gelen her hologram ağ üzerinden eşitlenen bir entity'dir. Wiremod, oyuncu başına sayıyı wire_holograms_max ile sınırlar.
  • Bileşik nesneler: Pratikte araç addon'ları ve büyük yapılar çoğu zaman birçok ayrı entity'den oluşur. Kesin sayı addon'a bağlıdır.

Bir oyuncu sunucudan ayrıldığında Source Engine'in standart kodu silahlarını da onunla birlikte kaldırır. Sandbox'ta prop'ları, biri temizleyene kadar kalır.

Sunucu sahibi olarak neler yapabilirsin

  1. Hesabını yap. sbox_max değerlerini olağan oyuncu sayısıyla çarp ve haritanın taban maliyetini ekle. Sonuç kabaca 8000'in üzerindeyse limitleri düşür.
  2. Temizle. Admin olarak kullanıldığında gmod_admin_cleanup, oyuncuların spawn'ladığı her şeyi kaldırır ve haritayı sıfırlar. gmod_cleanup ile her oyuncu kendi nesnelerini temizler. Prop protection addon'ları çoğu zaman, bağlantısı kesilen oyuncuların prop'larını bir süre sonra kaldırma seçeneği sunar.
  3. Erken uyarı al. İki değişkenin yardım metnine göre motor, yalnızca sv_lowedict_threshold ile belirtilen sayı kadar edict boş kaldığında sv_lowedict_action eylemini çalıştırır: 0 hiçbir şey, 1 log'a uyarı, 2 oyunu yeniden başlat, 3 haritayı yeniden başlat, 4 map cycle'daki sonraki harita.
  4. Uygun bir harita seç. bspmarket.de'de bir haritanın Teknik veriler kısmında yaklaşık değerler olan Entity (harita) ve Statik prop listelenir. Kategoriler sayfasında entity sayısına göre filtreleyebilirsin. Seçimde başka nelere bakılacağı DarkRP haritası seçimi yazısında anlatılıyor.

Bu mesajın ve ilgili mesajların açıklamalarını hata veritabanında da bulabilirsin.

Sık sorulan sorular

Edict limitini yükseltebilir miyim?

Hayır. Değer motora derlenmiştir ve Valve Developer Community'ye göre motorla uyumluluğu bozmadan değiştirilemez. Yapabileceğin tek şey entity sayısını azaltmaktır.

Limit diğer Source oyunlarında da geçerli mi?

Çoğunda daha düşüktür. Valve Developer Community'ye göre Source oyunlarının çoğu 2048 edict'e izin verir. Bu yüzden GMod'da sorunsuz çalışan bir harita, başka bir oyunda daha yüklenir yüklenmez limite takılabilir.

Spawn'lama neden daha 8192'nin altındayken başarısız oluyor?

Çünkü GMod bir payı boş tutar. GMod wiki'sine göre ents.Create, kullanılan edict sayısı 8064 ile 8176 arasındayken başarısız olur. Tam olarak nerede olacağı, başka etkenlerin yanında oyuncu slotu sayısına bağlıdır.

Görünmez entity'ler de edict kullanır mı?

Evet, ağ üzerinden eşitlenen entity'lerse. Bir entity'nin görünür olup olmaması ya da hareket edip etmemesi fark etmez. Önemli olan tek şey edict alıp almadığıdır. Source Engine'in standart kodunda saf mantık entity'leri edict almaz.