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条)