Stage3D在运行中是存在随时会丢失上下文的尴尬情况。

渲染内容丢失的问题本身就说明是因为丢失了Context3D对象。出现此问题的原因很多,通常还不是因为Stage3D应用。比如在win7系统中,当按下Ctrl+Alt+Delete键时会出现类似“锁定计算机”和“启动任务管理器”的菜单选项,这就会引起渲染内容丢失。但这不是唯一的可能,还有些情况,在某些屏保程序激活时又或笔记本盖子合上时也会引起渲染内容丢失。甚至可以通过调用Context3D.dispose()方法来模拟渲染内容丢失事件。所以,最倾向的一种假设是——对于大部分Flash应用,在任何情况下任何原因都可能引起渲染内容丢失(囧), 解决办法只能是尽可能地妥善处理。

更多详情可以查看:如何处理Stage3D渲染内容的丢失

我们如何得知Stage3D在运行中丢失了上下文(Context3D)呢?不能得知,因为没有对应的事件或回调方法,但是当上下文丢失了以后,Stage3D会在恢复上下文成功时(可以看做Stage3D在丢失上下文后会自动调用requestContext3D方法)再次抛出Event.CONTEXT3D_CREATE事件,并且Stage3D的context3D属性为新获得的可以使用的上下文对象。老的上下文对象会失效,失效的上下文对象的driverInfo属性值为"Disposed",可以根据该属性判断当前上下文是否失效(即丢失或手动销毁)。

Starling对上下文丢失的处理:

上下文丢失后,我们之前传递到显存的数据就都丢失了,再次获取到Event.CONTEXT3D_CREATE事件时,我们拿到的是一个全新的Context3D对象,所以恢复上下文丢失的第一步就是重新上载数据(包括顶点缓冲、索引缓冲和纹理等)到显存;

顶点数据和常量数据的恢复:

顶点数据(VertexData)和常量数据(正交矩阵和模型矩阵)分别作为每个显示对象的变量常驻内存,而Starling的所有绘制都是放在QuadBatch类中,所以在该类中侦听Event.CONTEXT3D_CREATE事件,当接收到该事件后重新创建顶点和索引缓冲对象即可,每帧都会重新上载顶点数据和常量数据,以及设定着色器对象;

纹理数据的恢复:

纹理数据才是恢复中比较棘手的问题,因为不同于顶点数据,纹理数据一般都会占用大量的内存;

早期的Starling(0.9版)中,纹理在上传到显存后就会从内存中dispose掉,这样可以节约内存,但是一旦发生上下文丢失后,纹理就无法直接从内存中恢复了,所以新版Starling中添加了一个静态变量handleLostContext,设置为true表示纹理会被对应的texture对象持有,不会进行dispose,并且会对Event.CONTEXT3D_CREATE事件进行侦听,一旦侦听到该事件,会再次提交内存中持有的纹理数据到显存中,从而进行数据恢复;

Starling1.4中更好的处理上下文丢失:

1.4版以后,Starling对纹理的恢复更改了策略,之前的纹理采用的方法是在内存中保留BitmapData数据或Atf的ByteArray数据,这样会导致内存中存在相当占用内存的数据,新版的修改,为Texture对象添加了onRestore的属性,但上下文丢失后会调用该方法,我们在该方法中,重新实例化要上载的数据并上传到显存即可。

详请点击这里

【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法的更多相关文章

  1. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

    批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...

  2. 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西

    我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...

  3. 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系

    我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...

  4. 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽

    还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...

  5. 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵

    如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...

  6. 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序

    本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...

  7. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

  8. 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

    我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...

  9. 【Stage3D学习笔记续】山寨Starling(一):从事件说起

    我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...

随机推荐

  1. 编程实现Windows关机、重启、注销

    要想编程使Windows关机.重启或者注销,可以使用ExWindowsEx这个API函数,该函数只有两个参数,第一个表示关机动作的标志,也就是你要让该函数关机呢,还是重启,还是注销等.可以使用EWX_ ...

  2. Python之函数篇

    函数形参 函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情.这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值. 参数在函数定义的圆括号对内 ...

  3. Android invalidate()自动清屏,屏幕刷新

    invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧 ...

  4. git同步远端的分支

    如果用命令行,运行 git fetch,可以将远程分支信息获取到本地, 再运行 git checkout -b local-branchname origin/remote_branchname  就 ...

  5. Android开发之R文件丢失

    在进行android开发的过程中,不知道怎么回事,代码中出现R代码有红色波浪线了,于是进行了clean,结果还是有红色波浪线,然后就重启了eclipse,重启以后还是这个样子,随后发现工程的R文件丢失 ...

  6. mac terminal终端ls命令参数详解

    原文:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ls.1.html -a ...

  7. POJ 1273 (基础最大流) Drainage Ditches

    虽然算法还没有理解透,但以及迫不及待地想要A道题了. 非常裸的最大流,试试lrj的模板练练手. #include <cstdio> #include <cstring> #in ...

  8. C# 向共享文件夹上传及下载文件

    //第一步建立共享链接 public static bool connectState(string path, string userName, string passWord) { bool Fl ...

  9. Deployed component GUIs and figures have different look and feel than MATLAB desktop

    原文:http://www.mathworks.com/support/bugreports/1293244 Description Deployed GUIs and figures look an ...

  10. MySQL SQL优化之字符串索引隐式转换

    之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...