Performance upgrade? (#83)

* Performance upgrade?

* update monster to be on 200ms since 250ms will skip to 300
This commit is contained in:
elb
2025-02-27 10:04:16 -05:00
committed by GitHub
parent 7d37526163
commit 4204d68f23

View File

@@ -2,6 +2,7 @@ package memory
import ( import (
"math" "math"
"time"
"github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data"
"github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/data/stat"
@@ -10,6 +11,14 @@ import (
type GameReader struct { type GameReader struct {
offset Offset offset Offset
Process Process
monstersLastUpdate time.Time
inventoryLastUpdate time.Time
objectsLastUpdate time.Time
cachedMonsters data.Monsters
cachedInventory data.Inventory
cachedObjects []data.Object
} }
var WidgetStateFlags = map[string]uint64{ var WidgetStateFlags = map[string]uint64{
@@ -20,6 +29,9 @@ func NewGameReader(process Process) *GameReader {
return &GameReader{ return &GameReader{
offset: calculateOffsets(process), offset: calculateOffsets(process),
Process: process, Process: process,
monstersLastUpdate: time.Time{},
inventoryLastUpdate: time.Time{},
objectsLastUpdate: time.Time{},
} }
} }
@@ -28,22 +40,52 @@ func (gd *GameReader) GetData() data.Data {
gd.offset = calculateOffsets(gd.Process) gd.offset = calculateOffsets(gd.Process)
} }
// Always refresh core player data
rawPlayerUnits := gd.GetRawPlayerUnits() rawPlayerUnits := gd.GetRawPlayerUnits()
roster := gd.getRoster(rawPlayerUnits)
mainPlayerUnit := rawPlayerUnits.GetMainPlayer() mainPlayerUnit := rawPlayerUnits.GetMainPlayer()
pu := gd.GetPlayerUnit(mainPlayerUnit) pu := gd.GetPlayerUnit(mainPlayerUnit)
hover := gd.hoveredData() hover := gd.hoveredData()
now := time.Now()
// Conditionally update monsters
monsters := gd.cachedMonsters
if now.Sub(gd.monstersLastUpdate) > 200*time.Millisecond {
monsters = gd.Monsters(pu.Position, hover)
gd.cachedMonsters = monsters
gd.monstersLastUpdate = now
}
// Conditionally update inventory 500ms
// Except when hovering over an item
inventory := gd.cachedInventory
if now.Sub(gd.inventoryLastUpdate) > 500*time.Millisecond ||
(hover.IsHovered && hover.UnitType == 4) { // 4 = Item type
inventory = gd.Inventory(rawPlayerUnits, hover)
gd.cachedInventory = inventory
gd.inventoryLastUpdate = now
}
// Conditionally update objects
objects := gd.cachedObjects
if now.Sub(gd.objectsLastUpdate) > 200*time.Millisecond {
objects = gd.Objects(pu.Position, hover)
gd.cachedObjects = objects
gd.objectsLastUpdate = now
}
// Always update other critical data
corpseUnit := rawPlayerUnits.GetCorpse()
roster := gd.getRoster(rawPlayerUnits)
openMenus := gd.openMenus()
// Quests // Quests
// q1 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22E2978, Uint64)) // q1 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22E2978, Uint64))
// q2 := uintptr(gd.Process.ReadUInt(q1, Uint64)) // q2 := uintptr(gd.Process.ReadUInt(q1, Uint64))
// q2 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22F1E79, Uint64)) // q2 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22F1E79, Uint64))
gameQuestsBytes := gd.Process.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x22F1E79, 85) gameQuestsBytes := gd.Process.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x22F1E79, 85)
// gameQuestsBytes = gameQuestsBytes[3:] // gameQuestsBytes = gameQuestsBytes[3:]
corpseUnit := rawPlayerUnits.GetCorpse()
d := data.Data{ d := data.Data{
Corpse: data.Corpse{ Corpse: data.Corpse{
Found: corpseUnit.Address != 0, Found: corpseUnit.Address != 0,
@@ -56,13 +98,13 @@ func (gd *GameReader) GetData() data.Data {
LastGamePassword: gd.LastGamePass(), LastGamePassword: gd.LastGamePass(),
FPS: gd.FPS(), FPS: gd.FPS(),
}, },
Monsters: gd.Monsters(pu.Position, hover), Monsters: monsters,
Corpses: gd.Corpses(pu.Position, hover), Corpses: gd.Corpses(pu.Position, hover),
PlayerUnit: pu, PlayerUnit: pu,
Inventory: gd.Inventory(rawPlayerUnits, hover), Inventory: inventory,
Objects: gd.Objects(pu.Position, hover), Objects: objects,
Entrances: gd.Entrances(pu.Position, hover), Entrances: gd.Entrances(pu.Position, hover),
OpenMenus: gd.openMenus(), OpenMenus: openMenus,
Widgets: gd.UpdateWidgets(), Widgets: gd.UpdateWidgets(),
Roster: roster, Roster: roster,
HoverData: hover, HoverData: hover,