2015-10-05 132 views
0

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

没有使用画布,我的程序使用252,8mb ram,但只要我使用画布,使用的内存会越来越多,直到程序崩溃。而且,由于我对lua比较陌生,对love2d也是新手,所以我无法找到并摆脱我在代码中遇到的问题。

我的代码(用帆布):

我有一个全局变量canvas这(在我resources.lua)设置为:

帆布= love.graphics.newCanvas(STANDARD_SETTINGS.display.width ,STANDARD_SETTINGS.display.height)

(宽度等于1280P和高度720p)的 和在我main.lua,我在draw() FUNC这个代码重刑:

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 - 表与它绘制函数被调用)

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

帮助真的很感谢!

回答

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

+1

我不得不更新(清除和重新填充画布)我的画布内容每次love.draw叫,但您的代码完全适用于那也是,thx。 我只需将'canvas:renderTo(mydraw)'放入'draw'函数而不是'load',并且必须在其上方调用'canvas:clear'。 这个没有内存问题。 =) – frosty

+0

@frosty你说得对,我把它作为一个绘制画布的简单例子,但我已经编辑了答案,以你需要的方式去做。 –

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)