在love2d中使用canvas会导致内存不足错误

时间:2015-10-05 21:39:51

标签: canvas resize out-of-memory ram love2d

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

不使用canvas,我的程序使用252,8mb ram,但是一旦我使用canvas,使用的内存会越来越多,直到程序崩溃。而且由于我对lua和new2d相对较新,我无法查明并摆脱我的代码中的问题。

我的代码(带画布):

我有一个全局变量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

没有画布,我的代码看起来像这样:

function love.draw()
    gameStates[activeState].draw()
end

(表gameStates[activeState]返回例如mainMenu - 表中带有绘制函数的表格。

顺便说一句,调整大小与画布一起工作正常,直到ram已满并且程序崩溃。

非常感谢帮助!

2 个答案:

答案 0 :(得分:0)

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

我的解决方法: 我在love wiki中找到了函数love.graphics.scale(sx,sy)并用它来摆脱整个画布代码问题。 我的draw()函数现在看起来像这样:

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)

更改窗口大小

答案 1 :(得分:0)

你可以画画布。不确定您使用的图片是什么,但没有必要。

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