Canvas 在love2d中使用画布会导致内存不足错误

Canvas 在love2d中使用画布会导致内存不足错误,canvas,resize,out-of-memory,ram,love2d,Canvas,Resize,Out Of Memory,Ram,Love2d,我目前正在用love2d用lua编写一个游戏(用于学习),今天我想让我的窗口大小可以调整。 我不想单独调整每个图形对象的大小,所以我搜索了网页,找到了在这种情况下使用画布的建议。(在画布上绘制所有内容;调整大小;绘制) 在不使用canvas的情况下,我的程序使用252,8mb的ram,但一旦我使用canvas,使用的内存就会越来越多,直到程序崩溃。由于我对lua和love2d都比较陌生,所以我无法找出并解决代码中存在的问题 我的代码(带画布): 我有一个全局变量canvas,它(在我的参考资料.

我目前正在用love2d用lua编写一个游戏(用于学习),今天我想让我的窗口大小可以调整。 我不想单独调整每个图形对象的大小,所以我搜索了网页,找到了在这种情况下使用画布的建议。(在画布上绘制所有内容;调整大小;绘制)

在不使用canvas的情况下,我的程序使用252,8mb的ram,但一旦我使用canvas,使用的内存就会越来越多,直到程序崩溃。由于我对lua和love2d都比较陌生,所以我无法找出并解决代码中存在的问题

我的代码(带画布):

我有一个全局变量
canvas
,它(在我的
参考资料.lua中)被设置为:

canvas=love.graphics.newCanvas(标准设置.display.width,标准设置.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
如果没有画布,我的代码如下所示:

function love.draw()
    gameStates[activeState].draw()
end
function love.draw()
    love.graphics.scale(settings.display.factor, settings.display.factor)
    gameStates[activeState].draw()
end
(例如,表
gameStates[activeState]
返回
main菜单
-表,其中包含调用的绘图函数)

顺便说一句,调整画布的大小效果很好,直到ram满了,程序崩溃


非常感谢您的帮助

我找到了问题的根源,尽管我不确定原因,但我找到了解决问题的方法(以防有人有类似的问题): 内存问题是由函数
love.graphics.newImage(canvasImageData)
以及方法
canvasImage:refresh()
canvas:getImageData()
引起的,这三种方法都导致了内存不足问题

我的解决方法: 我在中找到了函数
love.graphics.scale(sx,sy)
,并使用它解决了整个画布代码问题。 我的
draw()
函数现在如下所示:

function love.draw()
    gameStates[activeState].draw()
end
function love.draw()
    love.graphics.scale(settings.display.factor, settings.display.factor)
    gameStates[activeState].draw()
end
顺便说一下,为了完整起见:
当我调整窗口内容的大小时,我还可以在另一个函数中使用此函数更改窗口大小
love.window.setMode(settings.display.width,settings.display.height)

您只需绘制画布即可。不确定您使用图像的目的,但这不是必需的

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

您似乎遇到了这个问题:

每次调用love.draw时,我都必须更新(清除并重新填充画布)我的画布内容,但是您的代码也可以很好地实现这一点,thx。我只需要将
canvas:renderTo(mydraw)
放入
draw
函数中,而不是
load
,并且必须调用
canvas:clear
它上面的一行。没有内存问题。=)@frosty你是对的,我把它作为画画布的一个简单例子,但是我已经编辑了答案,按照你需要的方式来做。