fixed drawpixel optimization

minor class refactoring
This commit is contained in:
2025-04-27 14:50:23 +02:00
parent abf948a310
commit da3afd22fc
5 changed files with 33 additions and 18 deletions

View File

@@ -7,6 +7,7 @@
[node name="Main" type="Node2D"] [node name="Main" type="Node2D"]
script = ExtResource("1_k1i8e") script = ExtResource("1_k1i8e")
DebugMode = true
BrushSize = 2 BrushSize = 2
RainAmount = 1.0 RainAmount = 1.0

View File

@@ -2,7 +2,7 @@
namespace FOU.Scripts.Elements; namespace FOU.Scripts.Elements;
public class Element { public class Element{
public Chunk Chunk; public Chunk Chunk;
public Vector2I Position; public Vector2I Position;
@@ -15,12 +15,12 @@ public class Element {
protected const float MAX_COLOR_VARIANCE = 0.1f; protected const float MAX_COLOR_VARIANCE = 0.1f;
protected static readonly Vector2I VERTICAL_OPPOSITE = new Vector2I(-1, 1); protected static readonly Vector2I VERTICAL_OPPOSITE = new Vector2I(-1, 1);
protected int lastMove = 0;
private bool active = false; private bool active = false;
private bool wasMovedThisTick = false;
private int lastUpdate = -1; private int lastUpdate = -1;
private int lastMove = 0;
private Color originalColor; private Color originalColor;
private bool markedForUpdate = false;
public Element(Element e) { public Element(Element e) {
Position = e.Position; Position = e.Position;
@@ -34,7 +34,6 @@ public class Element {
Chunk = chunk; Chunk = chunk;
lastMove = Engine.GetFramesDrawn(); lastMove = Engine.GetFramesDrawn();
Active = false; Active = false;
wasMovedThisTick = true;
} }
public bool Active { public bool Active {
@@ -44,7 +43,10 @@ public class Element {
active = value; active = value;
Chunk.SetElementActive(this, value); Chunk.SetElementActive(this, value);
Moved(); if (!active)
ResetColor();
else
Moved();
} }
} }
@@ -58,8 +60,13 @@ public class Element {
public virtual bool Update() { public virtual bool Update() {
if (!Active) return false; if (!Active) return false;
if (lastUpdate == Engine.GetFramesDrawn()) return false; // already updated this frame int frame = Engine.GetFramesDrawn();
lastUpdate = Engine.GetFramesDrawn(); if (lastMove + STEPS_UNTIL_INACTIVE < frame)
Active = false;
if (lastUpdate == frame)
return false; // already updated this frame
lastUpdate = frame;
return true; return true;
} }
@@ -70,7 +77,6 @@ public class Element {
protected virtual void Tick() { protected virtual void Tick() {
Vector2I randomDirection = RandomDirectionDown(); Vector2I randomDirection = RandomDirectionDown();
wasMovedThisTick = false;
if (Chunk.IsEmpty(Position + Vector2I.Down)) if (Chunk.IsEmpty(Position + Vector2I.Down))
Chunk.Swap(this, Position + Vector2I.Down); Chunk.Swap(this, Position + Vector2I.Down);
@@ -106,21 +112,25 @@ public class Element {
public void ResetColor() { public void ResetColor() {
color = originalColor; color = originalColor;
MarkForUpdate();
} }
public void SetDebugColor(Color color) { public void SetDebugColor(Color color) {
if (!Main.Instance.DebugMode) return; if (!Main.Instance.DebugMode) return;
this.color = color; this.color = color;
wasMovedThisTick = true;
} }
public void Moved() { public void Moved() {
lastMove = Engine.GetFramesDrawn(); lastMove = Engine.GetFramesDrawn();
wasMovedThisTick = true; MarkForUpdate();
} }
public bool WasMoved() { public bool MarkedForUpdate() {
return wasMovedThisTick; return markedForUpdate;
}
public void MarkForUpdate(bool mark = true) {
markedForUpdate = true;
} }
} }

View File

@@ -5,11 +5,12 @@ namespace FOU.Scripts.Elements;
public abstract class Liquid : Element { public abstract class Liquid : Element {
public const int MAX_VERTICAL_SPREAD = 3; public const int MAX_VERTICAL_SPREAD = 3;
protected Liquid(int x, int y, ref Chunk chunk) : base(x, y, chunk) { } protected Liquid(int x, int y, ref Chunk chunk) : base(x, y, chunk) {
MarkForUpdate();
}
public override bool Update() { public override bool Update() {
if (!base.Update()) return false; if (!base.Update()) return false;
if (lastMove + STEPS_UNTIL_INACTIVE < Engine.GetFramesDrawn()) Active = false;
Tick(); Tick();

View File

@@ -3,11 +3,12 @@
namespace FOU.Scripts.Elements; namespace FOU.Scripts.Elements;
public abstract class Solid : Element { public abstract class Solid : Element {
protected Solid(int x, int y, ref Chunk chunk) : base(x, y, chunk) { } protected Solid(int x, int y, ref Chunk chunk) : base(x, y, chunk) {
MarkForUpdate();
}
public override bool Update() { public override bool Update() {
if (!base.Update()) return false; if (!base.Update()) return false;
if (lastMove + STEPS_UNTIL_INACTIVE < Engine.GetFramesDrawn()) Active = false;
Tick(); Tick();

View File

@@ -157,8 +157,10 @@ public class Level {
for (int y = 0; y < chunkResY; y++) { for (int y = 0; y < chunkResY; y++) {
// TODO: multithreading here! use Chunk.DrawLevel() and stitch images together // TODO: multithreading here! use Chunk.DrawLevel() and stitch images together
if (chunks[cx, cy].Elements[x, y].WasMoved()) if (chunks[cx, cy].Elements[x, y].MarkedForUpdate()) {
image.SetPixel(cx*chunkResX + x, cy*chunkResY + y, chunks[cx, cy].Elements[x, y].Color); image.SetPixel(cx * chunkResX + x, cy * chunkResY + y, chunks[cx, cy].Elements[x, y].Color);
chunks[cx, cy].Elements[x, y].MarkForUpdate(false);
}
} }
} }
} }