mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
parent
4d05baf97c
commit
eeb8fea778
@ -55,6 +55,9 @@ type Image struct {
|
|||||||
|
|
||||||
w2 int
|
w2 int
|
||||||
h2 int
|
h2 int
|
||||||
|
|
||||||
|
// priority indicates whether the image is restored in high priority when context-lost happens.
|
||||||
|
priority bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var dummyImage *Image
|
var dummyImage *Image
|
||||||
@ -62,6 +65,7 @@ var dummyImage *Image
|
|||||||
func init() {
|
func init() {
|
||||||
dummyImage = &Image{
|
dummyImage = &Image{
|
||||||
image: graphicscommand.NewImage(16, 16),
|
image: graphicscommand.NewImage(16, 16),
|
||||||
|
priority: true,
|
||||||
}
|
}
|
||||||
theImages.add(dummyImage)
|
theImages.add(dummyImage)
|
||||||
}
|
}
|
||||||
@ -98,11 +102,7 @@ func NewScreenFramebufferImage(width, height int) *Image {
|
|||||||
|
|
||||||
func (i *Image) clear() {
|
func (i *Image) clear() {
|
||||||
// There are not 'drawImageHistoryItem's for this image and dummyImage.
|
// There are not 'drawImageHistoryItem's for this image and dummyImage.
|
||||||
// This means dummyImage might not be restored yet when this image is restored.
|
// As dummyImage is a priority image, this is restored faster than other regular images.
|
||||||
// However, that's ok since this image will be stale or have its updated pixel data soon,
|
|
||||||
// and this image can be restored without dummyImage.
|
|
||||||
//
|
|
||||||
// dummyImage should be restored later anyway.
|
|
||||||
w, h := i.Size()
|
w, h := i.Size()
|
||||||
sw, sh := dummyImage.Size()
|
sw, sh := dummyImage.Size()
|
||||||
dw := graphics.NextPowerOf2Int(w)
|
dw := graphics.NextPowerOf2Int(w)
|
||||||
|
@ -164,15 +164,23 @@ func (i *images) restore() error {
|
|||||||
}
|
}
|
||||||
images := map[*Image]struct{}{}
|
images := map[*Image]struct{}{}
|
||||||
for i := range i.images {
|
for i := range i.images {
|
||||||
|
if !i.priority {
|
||||||
images[i] = struct{}{}
|
images[i] = struct{}{}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
edges := map[edge]struct{}{}
|
edges := map[edge]struct{}{}
|
||||||
for t := range images {
|
for t := range images {
|
||||||
for s := range t.dependingImages() {
|
for s := range t.dependingImages() {
|
||||||
edges[edge{source: s, target: t}] = struct{}{}
|
edges[edge{source: s, target: t}] = struct{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sorted := []*Image{}
|
sorted := []*Image{}
|
||||||
|
for i := range i.images {
|
||||||
|
if i.priority {
|
||||||
|
sorted = append(sorted, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
for len(images) > 0 {
|
for len(images) > 0 {
|
||||||
// current repesents images that have no incoming edges.
|
// current repesents images that have no incoming edges.
|
||||||
current := map[*Image]struct{}{}
|
current := map[*Image]struct{}{}
|
||||||
@ -198,6 +206,7 @@ func (i *images) restore() error {
|
|||||||
delete(edges, e)
|
delete(edges, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, img := range sorted {
|
for _, img := range sorted {
|
||||||
if err := img.restore(); err != nil {
|
if err := img.restore(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user