Advertisement
Guest User

Untitled

a guest
Oct 18th, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.97 KB | None | 0 0
  1. extends Node2D
  2.  
  3. const GRID_WIDTH: int = 10
  4. const GRID_HEIGHT: int = 10
  5. const ITEM_SIZE: int = 2
  6. const GRID_SIZE: int = GRID_WIDTH * GRID_HEIGHT
  7.  
  8. var inventory: PackedInt32Array = PackedInt32Array()
  9. var availability_mask: PackedInt64Array = PackedInt64Array()
  10. var item_positions: Dictionary = {}
  11.  
  12. func _ready() -> void:
  13. initialize_worst_case_inventory()
  14. print_grid()
  15.  
  16. func initialize_worst_case_inventory() -> void:
  17. inventory.resize(GRID_SIZE)
  18. inventory.fill(1)
  19. availability_mask.resize((GRID_HEIGHT - ITEM_SIZE + 1) * (GRID_WIDTH - ITEM_SIZE + 1) / 64 + 1)
  20. availability_mask.fill(0)
  21.  
  22. var empty_x: int = GRID_WIDTH - ITEM_SIZE
  23. var empty_y: int = GRID_HEIGHT - ITEM_SIZE
  24. var start_index: int = calculate_index(empty_x, empty_y)
  25. for dy in range(ITEM_SIZE):
  26. var row_start: int = start_index + dy * GRID_WIDTH
  27. for dx in range(ITEM_SIZE):
  28. inventory[row_start + dx] = 0
  29. update_availability_mask(empty_x, empty_y, true)
  30.  
  31. func benchmark_find_space(iterations: int) -> float:
  32. var start_time: float = Time.get_ticks_usec()
  33.  
  34. for _i in range(iterations):
  35. find_next_available_space()
  36.  
  37. var elapsed_time: float = (Time.get_ticks_usec() - start_time) / 1_000_000.0
  38. print("GDScript: Find space benchmark (%d iterations) took %.6f seconds" % [iterations, elapsed_time])
  39. return elapsed_time
  40.  
  41. func find_next_available_space() -> Vector2i:
  42. for i in range(availability_mask.size()):
  43. var mask: int = availability_mask[i]
  44. if mask != 0:
  45. var bit: int = 0
  46. while (mask & (1 << bit)) == 0:
  47. bit += 1
  48. var position: int = i * 64 + bit
  49. var y: int = position / (GRID_WIDTH - ITEM_SIZE + 1)
  50. var x: int = position % (GRID_WIDTH - ITEM_SIZE + 1)
  51. return Vector2i(x, y)
  52. return Vector2i(-1, -1)
  53.  
  54. func update_availability_mask(x: int, y: int, available: bool) -> void:
  55. var index: int = y * (GRID_WIDTH - ITEM_SIZE + 1) + x
  56. var mask_index: int = index >> 6
  57. var bit_index: int = index & 63
  58. if available:
  59. availability_mask[mask_index] |= (1 << bit_index)
  60. else:
  61. availability_mask[mask_index] &= ~(1 << bit_index)
  62.  
  63. func calculate_index(x: int, y: int) -> int:
  64. return y * GRID_WIDTH + x
  65.  
  66. func print_grid() -> void:
  67. print("GDScript Grid:")
  68. for y in range(GRID_HEIGHT):
  69. var row: String = ""
  70. var start_index: int = y * GRID_WIDTH
  71. for x in range(GRID_WIDTH):
  72. row += "□ " if inventory[start_index + x] == 0 else "■ "
  73. print(row)
  74. print("")
  75.  
  76. func initialize_inventory_for_sorting() -> void:
  77. inventory.fill(0)
  78. availability_mask.fill(~0)
  79. item_positions.clear()
  80.  
  81. var items: PackedInt32Array = PackedInt32Array([1, 2, 3, 4, 5])
  82. var positions: PackedVector2Array = PackedVector2Array([Vector2i(2, 2), Vector2i(5, 1), Vector2i(1, 5), Vector2i(7, 6), Vector2i(4, 8)])
  83.  
  84. for i in range(items.size()):
  85. place_item(items[i], positions[i].x, positions[i].y)
  86.  
  87. func place_item(item: int, x: int, y: int) -> void:
  88. var start: int = calculate_index(x, y)
  89. for dy in range(ITEM_SIZE):
  90. var row_start: int = start + dy * GRID_WIDTH
  91. for dx in range(ITEM_SIZE):
  92. inventory[row_start + dx] = item
  93. update_availability_mask(x, y, false)
  94. item_positions[item] = Vector2i(x, y)
  95.  
  96. func benchmark_sort_inventory(iterations: int) -> float:
  97. var start_time: float = Time.get_ticks_usec()
  98.  
  99. for _i in range(iterations):
  100. sort_inventory()
  101.  
  102. var elapsed_time: float = (Time.get_ticks_usec() - start_time) / 1_000_000.0
  103. print("GDScript: Sort inventory benchmark (%d iterations) took %.6f seconds" % [iterations, elapsed_time])
  104. return elapsed_time
  105.  
  106. func sort_inventory() -> void:
  107. var items: Array = item_positions.keys()
  108. items.sort()
  109.  
  110. inventory.fill(0)
  111. availability_mask.fill(~0)
  112.  
  113. for item in items:
  114. var new_pos: Vector2i = find_next_available_space()
  115. if new_pos.x != -1 and new_pos.y != -1:
  116. place_item(item, new_pos.x, new_pos.y)
  117.  
  118. func print_inventory_for_sorting() -> void:
  119. print("GDScript Inventory Before Sorting:")
  120. print_grid()
  121. sort_inventory()
  122. print("GDScript Inventory After Sorting:")
  123. print_grid()
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement