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ır | Kullanmaz |
|---|---|
| Oyuncular, taşınan her silah, projectile'lar | BSP'ye gömülü olan prop_static ve prop_detail |
prop_physics, prop_dynamic, prop_ragdoll, araçlar, NPC'ler | Dünya geometrisinin parçası olan world brush'lar ve func_detail |
func_door ya da func_brush gibi brush entity'ler | logic_timer, logic_case ya da math_counter gibi mantık entity'leri ve fizik constraint'leri |
env_sprite ve adı olan ışıklar | Temp 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:
| Limit | GMod'daki değer | Aşıldığında ne olur |
|---|---|---|
| Ağ üzerinden eşitlenen entity'ler (edict'ler) | 8192 | Yeni entity'ler reddedilir; en kötü durumda sunucu ED_Alloc: no free edicts ile sonlanır |
| Ağ üzerinden eşitlenmeyen entity'ler | 8192 | Motor entity'yi oluşturmaz ve konsola bir uyarı yazar |
| Derleme sırasında harita dosyasındaki girdiler | 65536 | VBSP 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_entitiestüm entity'leri sınıflarına göre adetleriyle listeler ve edict'leri de belirten bir toplam satırıyla biter.sv_lowedict_thresholdvesv_lowedict_actionmotor 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:
- Prop'ları statik yap. Her
prop_dynamicveprop_physicsbir edict'e mal olur, birprop_staticise hiçbirine. - Brush'ları birleştir. Tek bir
func_brushiçindeki birkaç brush tek bir entity'dir. Bir işleve ihtiyaçları yoksa onlarıfunc_detailyap; derleme sırasında entity listesinden tamamen kaybolurlar. - Işıkları adsız bırak. Source Engine'in standart kodunda (Source SDK 2013), adı olmayan bir
lightya dalight_spotharita başlarken kendini kaldırır, çünkü ışığı zaten lightmap'lerdedir. Adı varsa entity olarak kalır. - Sprite'ları kontrol et. Her
env_spriteağ üzerinden eşitlenen bir entity'dir. GMod'un FGD'sindeenv_sprite_clientsidebulunur. 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. - Bone follower'lara dikkat et. Modeli eklemli bir çarpışma modeline sahip olan bir prop, her parça için ek bir
phys_bone_followerentity'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_physicsolarak oluşturur.sbox_maxpropsiç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_maxile 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
- Hesabını yap.
sbox_maxdeğerlerini olağan oyuncu sayısıyla çarp ve haritanın taban maliyetini ekle. Sonuç kabaca 8000'in üzerindeyse limitleri düşür. - Temizle. Admin olarak kullanıldığında
gmod_admin_cleanup, oyuncuların spawn'ladığı her şeyi kaldırır ve haritayı sıfırlar.gmod_cleanupile 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. - Erken uyarı al. İki değişkenin yardım metnine göre motor, yalnızca
sv_lowedict_thresholdile belirtilen sayı kadar edict boş kaldığındasv_lowedict_actioneylemini ç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. - 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.