在 love2d 中使用 canvas 导致内存不足错误
using canvas in love2d results in out-of-memory error
我目前正在 lua 中使用 love2d 编写一个游戏(出于学习目的),今天我想让我的 window 大小可调整。
我不想单独调整每个图形对象的大小,所以我在网上搜索并找到了在这种情况下使用 canvases 的建议。 (在 canvas 上绘制所有内容;调整大小;绘制它)
不使用 canvas,我的程序使用 252,8mb 内存,但是一旦我使用 canvas,使用的内存就会越来越多,直到程序崩溃。由于我对 lua 和 love2d 比较陌生,所以我无法查明并解决我的代码中存在的问题。
我的代码(canvas):
我有一个全局变量 canvas
,它(在我的 resources.lua
中)设置为:
canvas = love.graphics.newCanvas(STANDARD_SETTINGS.display.width,STANDARD_SETTINGS.display.height)
(宽度等于 1280p,高度等于 720p)
在我的 main.lua
中,我在 draw()
函数中有这段代码:
function love.draw()
canvas:renderTo(function()
gameStates[activeState].draw()
end)
canvasImageData = canvas:getImageData()
canvas:clear()
if canvasImage == nil then
canvasImage = love.graphics.newImage(canvasImageData)
else
canvasImage:refresh()
end
canvasImage:setFilter("linear","nearest")
love.graphics.setColor(255, 255, 255, 255)
love.graphics.draw(canvasImage,0,0,0,settings.display.factor,settings.display.factor)
end
没有 canvas,我的代码如下所示:
function love.draw()
gameStates[activeState].draw()
end
(table gameStates[activeState]
returns 例如 mainMenu
-table 中调用了绘制函数)
顺便说一句,在 ram 已满且程序崩溃之前,canvas 调整大小效果很好。
非常感谢您的帮助!
我找到了问题的根源,虽然我不确定原因,但我找到了解决问题的方法(以防万一有人遇到类似问题):
内存问题是由函数 love.graphics.newImage(canvasImageData)
以及方法 canvasImage:refresh()
和 canvas:getImageData()
引起的,这三个方法都导致了内存不足问题。
我的解决方法:
我在 love wiki 中找到函数 love.graphics.scale(sx,sy)
并用它来解决整个 canvas 代码问题。
我的 draw()
函数现在看起来像这样:
function love.draw()
love.graphics.scale(settings.display.factor, settings.display.factor)
gameStates[activeState].draw()
end
顺便说一下,为了完整起见:
当我调整 window 内容的大小时,我也在另一个函数 love.window.setMode(settings.display.width,settings.display.height)
中用这个更改了 window 的大小
你可以画 canvas。不确定您将图像用于什么目的,但这不是必需的。
local canvas = love.graphics.newCanvas()
local settings = { display = { factor = 0.7 } }
function mydraw()
-- draw something as an example
love.graphics.print("Something", 10, 10)
end
function love.draw()
canvas:clear()
canvas:renderTo(mydraw)
love.graphics.setColor(255, 255, 255, 255)
canvas:setFilter("linear", "nearest")
love.graphics.draw(canvas,0,0,0,settings.display.factor,settings.display.factor)
end
您似乎 运行 关注这个问题:https://bitbucket.org/rude/love/issues/590/memory-leak-with-canvas-getimagedata
我目前正在 lua 中使用 love2d 编写一个游戏(出于学习目的),今天我想让我的 window 大小可调整。 我不想单独调整每个图形对象的大小,所以我在网上搜索并找到了在这种情况下使用 canvases 的建议。 (在 canvas 上绘制所有内容;调整大小;绘制它)
不使用 canvas,我的程序使用 252,8mb 内存,但是一旦我使用 canvas,使用的内存就会越来越多,直到程序崩溃。由于我对 lua 和 love2d 比较陌生,所以我无法查明并解决我的代码中存在的问题。
我的代码(canvas):
我有一个全局变量 canvas
,它(在我的 resources.lua
中)设置为:
canvas = love.graphics.newCanvas(STANDARD_SETTINGS.display.width,STANDARD_SETTINGS.display.height)
(宽度等于 1280p,高度等于 720p)
在我的 main.lua
中,我在 draw()
函数中有这段代码:
function love.draw()
canvas:renderTo(function()
gameStates[activeState].draw()
end)
canvasImageData = canvas:getImageData()
canvas:clear()
if canvasImage == nil then
canvasImage = love.graphics.newImage(canvasImageData)
else
canvasImage:refresh()
end
canvasImage:setFilter("linear","nearest")
love.graphics.setColor(255, 255, 255, 255)
love.graphics.draw(canvasImage,0,0,0,settings.display.factor,settings.display.factor)
end
没有 canvas,我的代码如下所示:
function love.draw()
gameStates[activeState].draw()
end
(table gameStates[activeState]
returns 例如 mainMenu
-table 中调用了绘制函数)
顺便说一句,在 ram 已满且程序崩溃之前,canvas 调整大小效果很好。
非常感谢您的帮助!
我找到了问题的根源,虽然我不确定原因,但我找到了解决问题的方法(以防万一有人遇到类似问题):
内存问题是由函数 love.graphics.newImage(canvasImageData)
以及方法 canvasImage:refresh()
和 canvas:getImageData()
引起的,这三个方法都导致了内存不足问题。
我的解决方法:
我在 love wiki 中找到函数 love.graphics.scale(sx,sy)
并用它来解决整个 canvas 代码问题。
我的 draw()
函数现在看起来像这样:
function love.draw()
love.graphics.scale(settings.display.factor, settings.display.factor)
gameStates[activeState].draw()
end
顺便说一下,为了完整起见:
当我调整 window 内容的大小时,我也在另一个函数 love.window.setMode(settings.display.width,settings.display.height)
你可以画 canvas。不确定您将图像用于什么目的,但这不是必需的。
local canvas = love.graphics.newCanvas()
local settings = { display = { factor = 0.7 } }
function mydraw()
-- draw something as an example
love.graphics.print("Something", 10, 10)
end
function love.draw()
canvas:clear()
canvas:renderTo(mydraw)
love.graphics.setColor(255, 255, 255, 255)
canvas:setFilter("linear", "nearest")
love.graphics.draw(canvas,0,0,0,settings.display.factor,settings.display.factor)
end
您似乎 运行 关注这个问题:https://bitbucket.org/rude/love/issues/590/memory-leak-with-canvas-getimagedata