如果 window 在创建 canvas 后调整了大小,则退出时 Love2d 会崩溃

Love2d crash when quitting, if window was resized after canvas creation

我的问题是,当您调整 window 的大小时,通过在控制台中按一个键退出,love.exe 会崩溃。只有在使用 canvas 时才会发生这种情况。 以下是重现崩溃的方法:

如果你只运行代码是行不通的,因为在conf.lua中需要启用控制台,所以请运行love文件。如果 window 未调整大小,则不会发生崩溃。

崩溃

function draw()
   love.graphics.circle("fill", 100, 100, 50)  -- Draw circle
   love.graphics.setColor(255, 255, 255, 255)
   love.graphics.setCanvas()
   love.graphics.draw(canvas, 0, 0, 0, 2)  -- 200% zoom
   love.graphics.setCanvas(canvas)
   love.graphics.present()  -- Refresh screen
end

love.window.setMode(500, 500)
canvas = love.graphics.newCanvas(1000, 1000)  -- Create canvas
love.graphics.setCanvas(canvas)
draw()  -- Draw circle
love.timer.sleep(1)

love.window.setMode(800, 800)  -- Resize window
love.graphics.setCanvas(canvas)
draw()  -- Redraw circle

love.timer.sleep(2)
love.window.close()
print("Should crash when you quit this by pressing key")
os.execute("pause")
love.event.push("quit")

没有崩溃

function draw()
   love.graphics.circle("fill", 100, 100, 50)  -- Draw circle
   love.graphics.setColor(255, 255, 255, 255)
   love.graphics.setCanvas()
   love.graphics.draw(canvas, 0, 0, 0, 2)  -- 200% zoom
   love.graphics.setCanvas(canvas)
   love.graphics.present()  -- Refresh screen
end

love.window.setMode(500, 500)

canvas = love.graphics.newCanvas(1000, 1000)  -- Create canvas
love.graphics.setCanvas(canvas)
draw()  -- Draw circle
love.timer.sleep(1)

-- Window was resized once, before canvas creation --> no crash

love.window.close()
os.execute("pause")
love.event.push("quit")

Download .love file

请注意,我也在 LOVE 论坛 here 上发布了这个问题,但还没有好的答案。我想也许我可以在这里得到答案。

根据 setMode documentation:

Changing the display mode may have side effects: for example, canvases will be cleared and values sent to shaders with Shader:send will be erased. Make sure to save the contents of canvases beforehand or re-draw to them afterward if you need to.

您可以通过在 setMode 操作期间将渲染目标重置为主屏幕来维护 canvas 数据并防止崩溃:

love.graphics.setCanvas() -- Reset render target to screen
love.window.setMode(800, 800)  -- Resize window
love.graphics.setCanvas(canvas) -- Render to canvas again

HTH,

西奥齐姆