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使所有依赖于着色器的图像失效。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值