fix: Eliminates List allocations in various places. (#2158)

This commit is contained in:
Kamron Batman 2025-11-16 18:33:53 -08:00 • committed by GitHub
parent 6f64cddd0b
commit 4836bff5eb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 263 additions and 200 deletions

View file

@ -430,8 +430,8 @@ public partial class Container : Item
public virtual bool TryDropItems(Mobile from, bool sendFullMessage, params ReadOnlySpan<Item> droppedItems)
{
var dropItems = new List<Item>();
var stackItems = new List<ItemStackEntry>();
using var dropItems = PooledRefQueue<Item>.Create();
using var stackItems = PooledRefQueue<ItemStackEntry>.Create();
var extraItems = 0;
var extraWeight = 0;
@ -451,7 +451,7 @@ public partial class Container : Item
if (item is not Container && CheckHold(from, dropped, false, false, 0, extraWeight) &&
item.CanStackWith(dropped))
{
stackItems.Add(new ItemStackEntry(item, dropped));
stackItems.Enqueue(new ItemStackEntry(item, dropped));
extraWeight += (int)Math.Ceiling(item.Weight * (item.Amount + dropped.Amount)) -
item.PileWeight; // extra weight delta, do not need TotalWeight as we do not have hybrid stackable container types
stacked = true;
@ -461,7 +461,7 @@ public partial class Container : Item
if (!stacked && CheckHold(from, dropped, false, true, extraItems, extraWeight))
{
dropItems.Add(dropped);
dropItems.Enqueue(dropped);
extraItems++;
extraWeight += dropped.TotalWeight + dropped.PileWeight;
}
@ -469,14 +469,15 @@ public partial class Container : Item
if (dropItems.Count + stackItems.Count == droppedItems.Length) // All good
{
for (var i = 0; i < dropItems.Count; i++)
while (dropItems.Count > 0)
{
DropItem(dropItems[i]);
DropItem(dropItems.Dequeue());
}
for (var i = 0; i < stackItems.Count; i++)
while (stackItems.Count > 0)
{
stackItems[i].m_StackItem.StackWith(from, stackItems[i].m_DropItem, false);
var stackItem = stackItems.Dequeue();
stackItem.m_StackItem.StackWith(from, stackItem.m_DropItem, false);
}
return true;

View file

@ -547,10 +547,29 @@ public class Region : IComparable<Region>, IValueLinkListNode<Region>
public virtual bool AcceptsSpawnsFrom(Region region) =>
AllowSpawn() && (region == this || Parent?.AcceptsSpawnsFrom(region) == true);
public PooledRefList<Mobile> GetPlayersPooled()
{
var list = PooledRefList<Mobile>.Create();
for (var i = 0; i < Sectors?.Length; i++)
{
var sector = Sectors[i];
foreach (var ns in sector.Clients)
{
var player = ns.Mobile;
if (player?.Deleted == false && player.Region.IsPartOf(this))
{
list.Add(ns.Mobile);
}
}
}
return list;
}
public List<Mobile> GetPlayers()
{
var list = new List<Mobile>();
List<Mobile> list = [];
for (var i = 0; i < Sectors?.Length; i++)
{
var sector = Sectors[i];
@ -609,6 +628,25 @@ public class Region : IComparable<Region>, IValueLinkListNode<Region>
return list;
}
public PooledRefList<Mobile> GetMobilesPooled()
{
var list = PooledRefList<Mobile>.Create();
for (var i = 0; i < Sectors?.Length; i++)
{
var sector = Sectors[i];
foreach (var mobile in sector.Mobiles)
{
if (mobile.Region.IsPartOf(this))
{
list.Add(mobile);
}
}
}
return list;
}
public int GetMobileCount()
{
var count = 0;
@ -649,6 +687,26 @@ public class Region : IComparable<Region>, IValueLinkListNode<Region>
return list;
}
public PooledRefList<Item> GetItemsPooled()
{
var list = PooledRefList<Item>.Create();
for (var i = 0; i < Sectors?.Length; i++)
{
var sector = Sectors[i];
foreach (var item in sector.Items)
{
if (Find(item.Location, item.Map).IsPartOf(this))
{
list.Add(item);
}
}
}
return list;
}
public int GetItemCount()
{
var count = 0;

View file

@ -16,7 +16,6 @@
using System;
using System.Buffers;
using System.Runtime.CompilerServices;
using System.Text;
using Server.Buffers;
using Server.Text;