7 Commits

Author SHA1 Message Date
abf948a310 adjusted debug mode 2025-04-27 14:15:14 +02:00
2cd6a757dc fixed memory leak
fixed trying to draw out of bounds
2025-04-27 14:00:54 +02:00
4ce265e722 fixed unnecessary write to texture if no changes happened 2025-04-27 13:49:35 +02:00
572e02956c fixed benchmark placement 2025-04-27 13:18:18 +02:00
de99d54ad6 fixed brush Y dimension 2025-04-27 13:04:06 +02:00
2bcdeecb81 Merge branch 'performance-improvements' 2025-04-21 18:57:20 +02:00
7b2845ee01 added benchmark function
added .txt for benchmark results
fixed generating level message
2024-10-27 14:08:19 +01:00
5 changed files with 58 additions and 43 deletions

View File

@@ -3,13 +3,10 @@ using Godot;
public partial class PerfDetails : Label public partial class PerfDetails : Label
{ {
[Export]
public bool ShowDetails = true;
public override void _Process(double delta) public override void _Process(double delta)
{ {
Text = ""; Text = "";
if (!ShowDetails) return; if (!Main.Instance.DebugMode) return;
int activeElements = 0; int activeElements = 0;
foreach (Chunk c in Main.Instance.Level.GetChunks()) foreach (Chunk c in Main.Instance.Level.GetChunks())

View File

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

View File

@@ -18,6 +18,7 @@ public class Element {
protected int lastMove = 0; 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 Color originalColor; private Color originalColor;
@@ -33,6 +34,7 @@ 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 {
@@ -42,7 +44,7 @@ public class Element {
active = value; active = value;
Chunk.SetElementActive(this, value); Chunk.SetElementActive(this, value);
// SetDebugColor(value, new Color(0.2f, 0.2f, 0.2f)); Moved();
} }
} }
@@ -68,6 +70,7 @@ 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,12 +109,18 @@ public class Element {
} }
public void SetDebugColor(Color color) { public void SetDebugColor(Color color) {
if (!Main.Instance.DebugVisualization) 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;
}
public bool WasMoved() {
return wasMovedThisTick;
} }
} }

View File

@@ -69,7 +69,7 @@ public class Level {
GD.Print("benchmark"); GD.Print("benchmark");
for (int x = 0; x < chunksPerX; x++) { for (int x = 0; x < chunksPerX; x++) {
for (int y = 0; y < chunksPerY; y++) { for (int y = 0; y < chunksPerY; y++) {
WritePixel<Dirt>(x * chunkResX/2, y * chunkResY/2, 100); WritePixel<Dirt>((x * chunkResX) + chunkResX/2, (y * chunkResY) + chunkResY/2, 100);
} }
} }
} }
@@ -92,64 +92,73 @@ public class Level {
public void WritePixel<T>(int x, int y, int size) { public void WritePixel<T>(int x, int y, int size) {
int halfsize = size/2; int halfsize = size/2;
int startPtX = x % chunkResX;
int startPtY = y % chunkResY;
for (int i = -halfsize; i <= halfsize; i++) { for (int i = -halfsize; i <= halfsize; i++) {
for (int j = 0; j < 1; j++) { for (int j = -halfsize; j <= halfsize; j++) {
// for (int j = -halfsize; j <= halfsize; j++) {
// calculate in-chunk coordinates // calculate in-chunk coordinates
int inChunkX = x % chunkResX; int iteratorX = i;
int inChunkY = y % chunkResY; int iteratorY = j;
int brushX = i; int ptX = startPtX;
int brushY = j; int ptY = startPtY;
// calculate chunk to write to // calculate chunk to write to
int chunkX = x/chunkResX; int chunkX = x/chunkResX;
if (inChunkX + i < 0) {
chunkX--;
// 320 -22
brushX = chunkResX + inChunkX + i;
inChunkX = chunkResX - inChunkX;
} else if (inChunkX + i >= chunkResX) {
chunkX++;
inChunkX = 0;
brushX = i % chunkResX;
}
inChunkX += brushX;
if (chunkX < 0 || chunkX >= chunksPerX) { // left of chunk
GD.PrintErr($"Trying to write out of bounds: {x}:{y}"); if (startPtX + iteratorX < 0) {
return; chunkX--;
iteratorX = chunkResX + startPtX + iteratorX;
ptX = startPtX + iteratorX;
// right of chunk
} else if (startPtX + iteratorX >= chunkResX) {
chunkX++;
ptX = startPtX + iteratorX - chunkResX;
} else {
ptX = startPtX + iteratorX;
} }
int chunkY = y/chunkResY; int chunkY = y/chunkResY;
if (inChunkY + j < 0) {
// above chunk
if (startPtY + iteratorY < 0) {
chunkY--; chunkY--;
brushY = chunkResY - (inChunkY + j); ptY = chunkResY + (startPtY + iteratorY);
inChunkY = chunkResY - inChunkY;
} else if (inChunkY + j >= chunkResY) { // left of chunk
} else if (startPtY + iteratorY >= chunkResY) {
chunkY++; chunkY++;
inChunkY = 0; ptY = iteratorY % chunkResY;
brushY = j % chunkResY; } else {
} ptY = startPtY + iteratorY;
inChunkY += brushY;
if (chunkY < 0 || chunkY >= chunksPerY) {
GD.PrintErr($"Trying to write out of bounds: {x}:{y}");
return;
} }
chunks[chunkX, chunkY].WritePixel<T>(inChunkX, inChunkY); // ignore everything outside
if (chunkX < 0) continue;
if (chunkX >= chunksPerX) continue;
if (chunkY < 0) continue;
if (chunkY >= chunksPerY) continue;
chunks[chunkX, chunkY].WritePixel<T>(ptX, ptY);
} }
} }
} }
public Image DrawLevel() { public Image DrawLevel() {
// chunk
for (int cx = 0; cx < chunksPerX; cx++) { for (int cx = 0; cx < chunksPerX; cx++) {
for (int cy = 0; cy < chunksPerY; cy++) { for (int cy = 0; cy < chunksPerY; cy++) {
// pixel in chunk
for (int x = 0; x < chunkResX; x++) { for (int x = 0; x < chunkResX; x++) {
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
image.SetPixel(cx*chunkResX + x, cy*chunkResY + y, chunks[cx,cy].Elements[x, y].Color);
if (chunks[cx, cy].Elements[x, y].WasMoved())
image.SetPixel(cx*chunkResX + x, cy*chunkResY + y, chunks[cx, cy].Elements[x, y].Color);
} }
} }
} }

View File

@@ -3,7 +3,7 @@ using FOU.Scripts.Elements;
using Godot; using Godot;
public partial class Main : Node2D { public partial class Main : Node2D {
[Export] public bool DebugVisualization = false; [Export] public bool DebugMode = false;
[Export] public int BrushSize = 5; [Export] public int BrushSize = 5;
[Export] public float TextureResolution = 0.5f; [Export] public float TextureResolution = 0.5f;
@@ -32,6 +32,7 @@ public partial class Main : Node2D {
} }
public override void _Process(double delta) { public override void _Process(double delta) {
mLevelDrawer.Texture?.Dispose();
mLevelDrawer.Texture = ImageTexture.CreateFromImage(Level.DrawLevel()); mLevelDrawer.Texture = ImageTexture.CreateFromImage(Level.DrawLevel());
} }