Browse Source

perf: 🔒 Interlock the lockDegree and lock the parent

dev
shangfengh 2 years ago
parent
commit
8f1af37714
3 changed files with 17 additions and 17 deletions
  1. +7
    -2
      logic/GameClass/GameObj/Character/Character.Student.cs
  2. +7
    -13
      logic/GameClass/GameObj/Map/Door.cs
  3. +3
    -2
      logic/Gaming/ActionManager.cs

+ 7
- 2
logic/GameClass/GameObj/Character/Character.Student.cs View File

@@ -111,13 +111,18 @@ namespace GameClass.GameObj
}
public class Golem : Student, IGolem
{
private readonly object parentLock = new();
private Character? parent; // 主人
public Character? Parent
{
get => parent;
get
{
lock (parentLock)
return parent;
}
set
{
lock (gameObjLock)
lock (parentLock)
{
parent = value;
}


+ 7
- 13
logic/GameClass/GameObj/Map/Door.cs View File

@@ -57,17 +57,11 @@ namespace GameClass.GameObj
private int lockDegree = 0;
public int LockDegree
{
get
{
lock (gameObjLock)
return lockDegree;
}
set
{
value = (value > GameData.degreeOfLockingOrOpeningTheDoor) ? GameData.degreeOfLockingOrOpeningTheDoor : value;
lock (gameObjLock)
lockDegree = value;
}
get => Interlocked.CompareExchange(ref lockDegree, -1, -1);
}
public int AddLockDegree(int add)
{
return Interlocked.Add(ref lockDegree, add);
}

private long openStartTime = 0;
@@ -119,7 +113,7 @@ namespace GameClass.GameObj
{
if (!isOpen) return false;
if (whoLockOrOpen != null) return false;
lockDegree = 0;
Interlocked.Exchange(ref lockDegree, 0);
whoLockOrOpen = character;
return true;
}
@@ -128,7 +122,7 @@ namespace GameClass.GameObj
{
lock (gameObjLock)
{
if (lockDegree >= GameData.degreeOfLockingOrOpeningTheDoor)
if (LockDegree >= GameData.degreeOfLockingOrOpeningTheDoor)
isOpen = false;
whoLockOrOpen = null;
}


+ 3
- 2
logic/Gaming/ActionManager.cs View File

@@ -515,12 +515,13 @@ namespace Gaming
}
Thread.Sleep(GameData.checkInterval);
new FrameRateTaskExecutor<int>(
loopCondition: () => stateNum == player.StateNum && gameMap.Timer.IsGaming && doorToLock.LockDegree < GameData.degreeOfLockingOrOpeningTheDoor,
loopCondition: () => stateNum == player.StateNum && gameMap.Timer.IsGaming,
loopToDo: () =>
{
if ((gameMap.PartInTheSameCell(doorToLock.Position, GameObjType.Character)) != null)
return false;
doorToLock.LockDegree += GameData.checkInterval * player.SpeedOfOpeningOrLocking;
if (doorToLock.AddLockDegree(GameData.checkInterval * player.SpeedOfOpeningOrLocking) >= GameData.basicSpeedOfOpeningOrLocking)
return false;
return true;
},
timeInterval: GameData.checkInterval,


Loading…
Cancel
Save