2015-10-05 55 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)

相關問題