2021SC@SDUSC Ebiten(六) 恢复像素数据代码详解

2021SC@SDUSC Ebiten(六) 恢复像素数据代码详解,第1张

2021SC@SDUSC Ebiten(六) 恢复像素数据代码详解

2021SC@SDUSC 

Go语言的简单2D游戏库-Ebiten     

目录

可恢复包概述--internal/restorable

* 上下文丢失

* 绘制图像

* 填充、替换像素和处理

* 使图像失效

* 失效的图像

* 不稳定的图像

代码分析--restorable/images.go

forceRestoring

func NeedsRestoring()

func ResolveStaleImages()

func RestoreIfNeeded()

func DumpImages()

type images

func (i *images) makeStaleIfDependingOn(target *Image)

func (i *images) makeStaleIfDependingonShader(shader *Shader)


可恢复包概述--internal/restorable

可恢复包提供了一个 Image 结构,用于存储图像命令并在发生上下文丢失时从命令中恢复其像素数据。

当调用 DrawImage 或 Fill 等函数时,Image 会尝试记录用于恢复的信息。

* 上下文丢失

竞赛丢失是 *** 作系统删除 GPU 内存信息以在 GPU 内存上腾出更多空间的过程。例如,当 GPU 内存使用率很高时,或者只是切换应用程序可能会导致移动设备上的上下文丢失时,就会发生这种情况。由于 Ebiten 的图像数据在 GPU 内存上,因此在不恢复图像信息的情况下发生上下文丢失时,游戏将无法继续。可恢复包是记录此类恢复信息的包。

* 绘制图像

DrawImage 函数尝试在目标图像中记录“绘制图像历史”的项目。如果目标图像陈旧或不稳定,则不会创建任何项目。如果创建了历史的一项,可以说目标图像依赖于源图像。换句话说,如果调用A.DrawImage(B, ...),可以说图像A依赖于图像B。

* 填充、替换像素和处理

这些函数也是绘图函数,目标图像存储像素数据而不是绘图图像历史项。这里没有依赖。

* 使图像失效

调用任何绘图函数后,目标图像不能被任何其他图像依赖。例如,如果图像 A 依赖于图像 B,并且之后 B 被 Fill 调用更改,则图像 A 不能再依赖于图像 B。在这种情况下,由于图像 B 不能再用于恢复图像 A,图像 A 变得“陈旧”。由于在上下文丢失发生之前解决了所有陈旧图像,因此绘制图像历史记录项保持原样(即使图像 C 依赖于陈旧图像 A,它仍然可以)。

* 失效的图像

失效图像是无法从记录的信息中恢复的图像。所有失效图像必须通过在帧结束前从 GPU 读取像素来解决。如果 DrawImage 的源图像是失效图像,则目标总是陈旧。

* 不稳定的图像

易失性图像是一种特殊的图像,它总是在帧开始时被清除。例如,通过更新函数传递的游戏画面是一个易变的图像。易变的图像不必记录绘图历史。如果 DrawImage 的源图像是易失性图像,则目标始终会变得陈旧。

代码分析--restorable/images.go forceRestoring

 

 forceRestoring报告是否强制恢复。

func NeedsRestoring()

func NeedsRestoring报告恢复过程是否有效。

func ResolveStaleImages()

ResolveStaleImages刷新排队的绘图命令并解析所有失效的图像。

ResolveStaleImages会在帧结束时调用。

func RestoreIfNeeded()

 

RestoreIfNeed恢复图像。

还原意味着使所有*graphicscommand.Image对象都具有其纹理和帧缓冲区。

由于isInvalidated()代价高昂,因此仅对一个图像调用此函数。

这假设如果有一个图像无效,则所有图像都无效。

func DumpImages()

DumpImages将所有当前图像转储到指定目录。

这是为了测试使用情况

type images

 

images是一组图像对象 

func (i *images) makeStaleIfDependingOn(target *Image)

makeStaleIfDependingOn使依赖于目标的所有图像都过时。

修改目标时,无法使用目标还原依赖于目标的所有图像。

在这种情况下调用makeStaleIfDependingOn。

func (i *images) makeStaleIfDependingonShader(shader *Shader)

makeStaleIfDependingOn使所有依赖于着色器的图像失效。 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5491115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存