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. QDialog之屏蔽Esc键(过滤,或者丢弃)

    http://blog.csdn.net/u011012932/article/details/50357323

  2. 登陆shell与交互式非登陆shell的区别

    登录shell 所谓登录shell,指的是当用户登录系统时所取的那个shell,登录shell属于交互式shell. 登录shell将查找4个不同的启动文件来处理其中的命令. bash shell处理 ...

  3. pb 插入控件是出问题

    http://m.blog.csdn.net/blog/jqz1225/34417493 是的http://blog.163.com/wufeng_1213/blog/static/167783313 ...

  4. 不能设置sublime text 2 为默认编辑器

    今天遇到一个有趣的事情,当我设置 css 样式表的默认打开方式的时候,却始终无法设置成功,系统总是随机选取一种打开方式来打开文件.比如:pdf.DW.txt等方式. 我设置默认打开方式的步骤如下: 1 ...

  5. win设置壁纸

    默认壁纸图片位置: C:\Windows\Web\Wallpaper\Scenes 你可以自己建文件夹,放自己喜欢的桌面壁纸. 设置壁纸: 桌面右键  ->  个性化 然后点击 “桌面背景” - ...

  6. freemarker得到数组的长度

    取得list的长度:${fields?size}.用?size不是用?length,代码如下所示: <#list properties as item> <#assign layer ...

  7. bzoj2243:[SDOI2011]染色

    链剖就可以了.一开始的想法错了.但也非常接近了.妈呀调的要死...然后把字体再缩小一号查错起来比较容易QAQ. #include<cstdio> #include<cstring&g ...

  8. 信息学院第九届ACM程序设计竞赛题解

     A: 信号与系统 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 238 Accepted: 44 Page View: 69 Des ...

  9. Vs 引用第三方DLL文件 版本不一致问题 (npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案)

    最近在 做 MailChimp 与网站功能 集成时,发现 MailChimp 2API 中的 MailChimp.dll  中的依赖项 SerivceStack.Text.dll (版本为3.9.71 ...

  10. eayui 验证扩展

    $.extend($.fn.validatebox.defaults.rules, { idcard : {// 验证身份证 validator : function(value) { return ...