Page 1 of 1

Help needed - Unexpected scary rendering issue

Posted: Mon Apr 25, 2022 10:56 am
by sisyphu2
Hi there, I am currently struggling with an issue that I fear will make my game unreleasable. :cry:

I am rendering a 2d grid-based world map with 3 different layers (each layer is a spritebatch). Sometimes when running the game 2 of the layers render in a very weird way: some of the tiles either flash (either to 0 opacity, or to white), or they seem to stretch from their actual tile coordinates to some (seemingly) random coordinates near the top of the grid, or both. Only some of the tiles do this, not the whole batch. I have encountered the issue multiple times, nothing I've changed has stopped it. What makes it more difficult and weird is that the issue only occurs occasionally, most times I run the game it all works as normal.

Relevant Details:
- There are 3 rendering layers rendered in this order: base map (grass etc), border lines, towns.
- The issue only ever affects layers 2 and 3 (border lines and towns).
- Each layer is contained within its own spritebatch (so as to store a large number of different tiles).
- The border line spritebatch has different colours applied to its various tiles, and also the blend mode is changed to 'add' when actually rendering the layer. The other two layers have no colours or blend modes applied to them.
- There are two texture atlases (1 for base map and the second for border lines and towns).
- The game uses the 'Push' library to double the resolution.
- The game uses a simple camera logic to translate the screen when holding mouse right.
- The issue only occurs sometimes, perhaps 1 in 10 or even 1 in 20 playthroughs.
- I am unable to decipher what the conditions that cause it are.
- The tiles that are affected by the issue vary and are not the same every time.
- When it occurs, most of the tiles remain perfectly normal - but a significant number have this behaviour which completely ruins the game.

Thoughts on issue:
- I have encountered the same issue before with using spritebatches (and I also did not discover the solution to it back then!)
- Could it be to do with the camera / or push?
- Or is there a known issue with spritebatch rendering in love 2d? I cannot seem to find anything on google.
- I believe that my limited knowledge on the underlying rendering processes is hindering me here...

Code extract to follow

Any help greatly appreciated.
Sisyphu2

Re: Help needed - Unexpected scary rendering issue

Posted: Mon Apr 25, 2022 11:14 am
by sisyphu2
Some key code extracts:

The Border Lines spritebatch is 'pre-rendered' in this way:

Code: Select all


local pre_render = function(empires)
              batch:clear()
              batch:setColor(1,1,1,1)

                  for i=1,#empires do
                          local colour = empires[i].colour
                          local this_owner = empires[i].index
                          for j=1,#towns do
                              if towns[j].owner == this_owner then
                                  local town_tiles = towns[j].town_tiles
                                  for k=1,#town_tiles do
                                      local quad_index = get_quad_index(town_tiles[k])
                                      batch:setColor(colour)
                                      batch:add(batch_quads[quad_index], this_tile.x_pos, this_tile.y_pos)
                                  end
                              end
                          end
                      end
                batch:setColor(1,1,1,1)
                batch:flush()
              end
 

That layer is then rendered to screen as follows:

Code: Select all

 local render = function()
     lg.setColor(1,1,1,0.6)
     lg.draw(batch,0,0)
     lg.setColor(1,1,1,0.8)
     lg.setBlendMode('add')
     lg.draw(batch,0,0)
     lg.setBlendMode('alpha')
     lg.setColor(1,1,1,1)
 end
The other two layers are pre-rendered and then rendered in a similar way minus the colour and blend mode changes.

Then all the layers are rendered together very simply:

Code: Select all

 push:start()
 camera.set()

 world_map.render()
 border_lines.render()
 towns.render()

 camera.unset()
 push:finish()
The camera does this (where tx and ty are the x and y translation of the camera):

Code: Select all


local set = function()
    lg.push()
    lg.translate(tx, ty)
end

local unset = function()
    lg.pop()
end

And of course push is a well known library. The settings are:

Code: Select all

push:setupScreen(512, 384, 1024, 768, {
        fullscreen = false,
        vsync = true,
        resizable = false
    })


Re: Help needed - Unexpected scary rendering issue

Posted: Mon Apr 25, 2022 3:12 pm
by pgimeno
Do you think you can provide a minimal, runnable example that exhibits the problem? You can use placeholder assets.

Also, what are your graphics card specs?

Re: Help needed - Unexpected scary rendering issue

Posted: Mon Apr 25, 2022 8:57 pm
by sisyphu2
pgimeno wrote: Mon Apr 25, 2022 3:12 pm Do you think you can provide a minimal, runnable example that exhibits the problem? You can use placeholder assets.

Also, what are your graphics card specs?
Thanks for replying. Yes I will get a minimal running example uploaded as soon as I can.

Specs are: intel(R) HD Graphics 620. 64bit Win10, 8GB Ram,2.5ghz