Skip to content

Commit

Permalink
ItemEntity: fixed O(n^2) performance issue when many of the same unst…
Browse files Browse the repository at this point in the history
…ackable item are in the same place

this produced a 40% performance improvement in a simulation with 800 item entities.

If the items were all different, then this would still be a problem. However, many of the same unstackable items occupying the same space is a problem for SkyBlock farms, so this should improve performance for SkyBlock quite a bit.
  • Loading branch information
dktapps committed Jul 31, 2023
1 parent 1c611a0 commit eb53b79
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/entity/object/ItemEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ protected function entityBaseTick(int $tickDiff = 1) : bool{
}
}

if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){
if($this->hasMovementUpdate() && $this->isMergeCandidate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){
$mergeable = [$this]; //in case the merge target ends up not being this
$mergeTarget = $this;
foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){
Expand Down Expand Up @@ -173,12 +173,19 @@ protected function entityBaseTick(int $tickDiff = 1) : bool{
}
}

private function isMergeCandidate() : bool{
return $this->pickupDelay !== self::NEVER_DESPAWN && $this->item->getCount() < $this->item->getMaxStackSize();
}

/**
* Returns whether this item entity can merge with the given one.
*/
public function isMergeable(ItemEntity $entity) : bool{
if(!$this->isMergeCandidate() || !$entity->isMergeCandidate()){
return false;
}
$item = $entity->item;
return $entity !== $this && $entity->pickupDelay !== self::NEVER_DESPAWN && $item->canStackWith($this->item) && $item->getCount() + $this->item->getCount() <= $item->getMaxStackSize();
return $entity !== $this && $item->canStackWith($this->item) && $item->getCount() + $this->item->getCount() <= $item->getMaxStackSize();
}

/**
Expand Down

0 comments on commit eb53b79

Please sign in to comment.