{"name":"memos/1024", "uid":"2HEiRTfKFKreMyBZbxourz", "rowStatus":"ACTIVE", "creator":"users/1", "createTime":"2025-09-03T21:58:37Z", "updateTime":"2025-09-03T23:00:28Z", "displayTime":"2025-09-03T21:58:37Z", "content":"Love2D fucking rectangles benchmark, normal and OOP...\nCommon part of the code:\n```lua\nlocal screenW, screenH\nlocal sprites = {}\nlocal tospawn = 200\nlocal prespawn = false\nlocal partialdraw = false\n\nfunction love.load()\n  screenW, screenH = love.graphics.getDimensions()\n  if prespawn then makesprites(200000) end\nend\n\nfunction picklast(array, count)\n  local result = {}\n  local total = #array\n  local start = math.max(1, total - count + 1)\n  for i = start, total do\n    table.insert(result, array[i])\n  end\n  return result\nend\n```\nNormal implementation:\n```lua\nfunction love.update(dt)\n  local start = love.timer.getTime()\n\n  if not prespawn then makesprites(tospawn) end\n  \n  for _, sprite in ipairs(sprites) do\n    sprite.x = sprite.x + sprite.dx * dt\n    sprite.y = sprite.y + sprite.dy * dt\n\n    -- Bounce off edges\n    if sprite.x < 0 or sprite.x + sprite.width > screenW then sprite.dx = -sprite.dx end\n    if sprite.y < 0 or sprite.y + sprite.height > screenH then sprite.dy = -sprite.dy end\n  end\n\n  print(\"Sprites:\", #sprites, \"Update:\", love.timer.getTime() - start)\nend\n\nfunction love.draw()\n  local list = partialdraw and picklast(sprites, 500) or sprites\n  for _, rectangle in ipairs(list) do\n    love.graphics.setColor(unpack(rectangle.color))\n    love.graphics.rectangle(\"fill\", rectangle.x, rectangle.y, rectangle.width, rectangle.height)\n  end\n  love.graphics.setColor(1, 1, 1)\n  love.graphics.print(\"Sprites: \" .. #sprites, 10, 10)\nend\n\nfunction makesprites(max)\n  for i = 0, max do\n    table.insert(sprites, {\n      x = math.random(0, screenW),\n      y = math.random(0, screenH),\n      dx = math.random(-100, 100),\n      dy = math.random(-100, 100),\n      width = math.random(10, 30),\n      height = math.random(10, 30),\n      color = { math.random(), math.random(), math.random() },\n    })\n  end\nend\n```\nOOP (`classic`) implementation:\n```lua\nObject = require \"classic\"\n\nPoint = Object:extend()\nfunction Point:new(x, y)\n  self.x = x or 0\n  self.y = y or 0\nend\n\nDrawable = Object:extend()\n\nRectangle = Drawable:extend()\nfunction Rectangle:new(width, height, color, mode)\n  self.width = width\n  self.height = height\n  self.mode = mode or \"fill\"\n  self.color = color\nend\nfunction Rectangle:draw(x, y)\n  love.graphics.setColor(unpack(self.color))\n  love.graphics.rectangle(self.mode, x, y, self.width, self.height)\nend\n\nNode = Object:extend()\nfunction Node:new(x, y)\n  Point.new(self, x, y)\nend\n\nSprite = Node:extend()\nfunction Sprite:new(x, y, drawable)\n  Sprite.super.new(self, x, y)\n  self.drawable = drawable\nend\nfunction Sprite:draw()\n  self.drawable:draw(self.x, self.y)\nend\n\nfunction love.update(dt)\n  local start = love.timer.getTime()\n\n  if not prespawn then makesprites(tospawn) end\n\n  for _, sprite in ipairs(sprites) do\n    sprite.x = sprite.x + sprite.dx * dt\n    sprite.y = sprite.y + sprite.dy * dt\n\n    -- Bounce off edges\n    if sprite.x < 0 or sprite.x + sprite.drawable.width > screenW then sprite.dx = -sprite.dx end\n    if sprite.y < 0 or sprite.y + sprite.drawable.height > screenH then sprite.dy = -sprite.dy end\n  end\n\n  print(\"Sprites:\", #sprites, \"Update:\", love.timer.getTime() - start)\nend\n\nfunction love.draw()\n  local list = partialdraw and picklast(sprites, 500) or sprites\n  for _, rectangle in ipairs(list) do\n    rectangle:draw()\n  end\n  love.graphics.setColor(1, 1, 1)\n  love.graphics.print(\"Sprites: \" .. #sprites, 10, 10)\nend\n\nfunction makesprites(max)\n  for i = 0, max do\n    local sprite = Sprite(\n      math.random(0, screenW),\n      math.random(0, screenH),\n      Rectangle(\n        math.random(10, 30),\n        math.random(10, 30),\n        { math.random(), math.random(), math.random() }))\n    sprite.dx = math.random(-100, 100)\n    sprite.dy = math.random(-100, 100)\n    table.insert(sprites, sprite)\n  end\nend\n```", "nodes":[{"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Love2D fucking rectangles benchmark, normal and OOP..."}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Common part of the code:"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"CODE_BLOCK", "codeBlockNode":{"language":"lua", "content":"local screenW, screenH\nlocal sprites = {}\nlocal tospawn = 200\nlocal prespawn = false\nlocal partialdraw = false\n\nfunction love.load()\n  screenW, screenH = love.graphics.getDimensions()\n  if prespawn then makesprites(200000) end\nend\n\nfunction picklast(array, count)\n  local result = {}\n  local total = #array\n  local start = math.max(1, total - count + 1)\n  for i = start, total do\n    table.insert(result, array[i])\n  end\n  return result\nend"}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Normal implementation:"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"CODE_BLOCK", "codeBlockNode":{"language":"lua", "content":"function love.update(dt)\n  local start = love.timer.getTime()\n\n  if not prespawn then makesprites(tospawn) end\n  \n  for _, sprite in ipairs(sprites) do\n    sprite.x = sprite.x + sprite.dx * dt\n    sprite.y = sprite.y + sprite.dy * dt\n\n    -- Bounce off edges\n    if sprite.x < 0 or sprite.x + sprite.width > screenW then sprite.dx = -sprite.dx end\n    if sprite.y < 0 or sprite.y + sprite.height > screenH then sprite.dy = -sprite.dy end\n  end\n\n  print(\"Sprites:\", #sprites, \"Update:\", love.timer.getTime() - start)\nend\n\nfunction love.draw()\n  local list = partialdraw and picklast(sprites, 500) or sprites\n  for _, rectangle in ipairs(list) do\n    love.graphics.setColor(unpack(rectangle.color))\n    love.graphics.rectangle(\"fill\", rectangle.x, rectangle.y, rectangle.width, rectangle.height)\n  end\n  love.graphics.setColor(1, 1, 1)\n  love.graphics.print(\"Sprites: \" .. #sprites, 10, 10)\nend\n\nfunction makesprites(max)\n  for i = 0, max do\n    table.insert(sprites, {\n      x = math.random(0, screenW),\n      y = math.random(0, screenH),\n      dx = math.random(-100, 100),\n      dy = math.random(-100, 100),\n      width = math.random(10, 30),\n      height = math.random(10, 30),\n      color = { math.random(), math.random(), math.random() },\n    })\n  end\nend"}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"OOP ("}}, {"type":"CODE", "codeNode":{"content":"classic"}}, {"type":"TEXT", "textNode":{"content":") implementation:"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"CODE_BLOCK", "codeBlockNode":{"language":"lua", "content":"Object = require \"classic\"\n\nPoint = Object:extend()\nfunction Point:new(x, y)\n  self.x = x or 0\n  self.y = y or 0\nend\n\nDrawable = Object:extend()\n\nRectangle = Drawable:extend()\nfunction Rectangle:new(width, height, color, mode)\n  self.width = width\n  self.height = height\n  self.mode = mode or \"fill\"\n  self.color = color\nend\nfunction Rectangle:draw(x, y)\n  love.graphics.setColor(unpack(self.color))\n  love.graphics.rectangle(self.mode, x, y, self.width, self.height)\nend\n\nNode = Object:extend()\nfunction Node:new(x, y)\n  Point.new(self, x, y)\nend\n\nSprite = Node:extend()\nfunction Sprite:new(x, y, drawable)\n  Sprite.super.new(self, x, y)\n  self.drawable = drawable\nend\nfunction Sprite:draw()\n  self.drawable:draw(self.x, self.y)\nend\n\nfunction love.update(dt)\n  local start = love.timer.getTime()\n\n  if not prespawn then makesprites(tospawn) end\n\n  for _, sprite in ipairs(sprites) do\n    sprite.x = sprite.x + sprite.dx * dt\n    sprite.y = sprite.y + sprite.dy * dt\n\n    -- Bounce off edges\n    if sprite.x < 0 or sprite.x + sprite.drawable.width > screenW then sprite.dx = -sprite.dx end\n    if sprite.y < 0 or sprite.y + sprite.drawable.height > screenH then sprite.dy = -sprite.dy end\n  end\n\n  print(\"Sprites:\", #sprites, \"Update:\", love.timer.getTime() - start)\nend\n\nfunction love.draw()\n  local list = partialdraw and picklast(sprites, 500) or sprites\n  for _, rectangle in ipairs(list) do\n    rectangle:draw()\n  end\n  love.graphics.setColor(1, 1, 1)\n  love.graphics.print(\"Sprites: \" .. #sprites, 10, 10)\nend\n\nfunction makesprites(max)\n  for i = 0, max do\n    local sprite = Sprite(\n      math.random(0, screenW),\n      math.random(0, screenH),\n      Rectangle(\n        math.random(10, 30),\n        math.random(10, 30),\n        { math.random(), math.random(), math.random() }))\n    sprite.dx = math.random(-100, 100)\n    sprite.dy = math.random(-100, 100)\n    table.insert(sprites, sprite)\n  end\nend"}}], "visibility":"PUBLIC", "tags":[], "pinned":false, "resources":[], "relations":[], "reactions":[], "property":{"tags":[], "hasLink":false, "hasTaskList":false, "hasCode":true, "hasIncompleteTasks":false}, "snippet":"Love2D fucking rectangles benchmark, normal and OOP...\nCommon part of the code:\nlocal screenW, scree..."}