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"]
script = ExtResource("1_k1i8e")
DebugMode = true
BrushSize = 2
RainAmount = 1.0

View File

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

View File

@@ -3,11 +3,12 @@
namespace FOU.Scripts.Elements;
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() {
if (!base.Update()) return false;
if (lastMove + STEPS_UNTIL_INACTIVE < Engine.GetFramesDrawn()) Active = false;
Tick();

View File

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