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. Creating a web server in pure C(c/c++ 写web server)

    一个简单的例子:https://github.com/fekberg/GoHttp 一个运行在windows上例子:http://www.adp-gmbh.ch/win/misc/webserver. ...

  2. thinkphp框架 中 ajax 的应用

    在thinkphp中,内置了ajax的方法,即: ajaxReturn("data","info","status"); data:传递的数 ...

  3. PL/SQL Developer使用技巧

    1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:PL/SQL ...

  4. Android开发之技术文章索引

    Activity: 1.PreferenceActivity Fragment: 1.fragment中套用PagerSlidingTabStrip,切换底部时viewpager消失的解决 Widge ...

  5. Windows Phone 获取网络类型(GSM/CDMA/WIFI/Ethernet)

    一.判断是否有网络数据连接: 最基本的网络状态判断,如果没有网络连接,一切操作都进行不下去啦. Microsoft.Phone.Net.NetworkInformation.NetworkInterf ...

  6. 基于VPN搭建混合云架构需要考虑的网络因素

     Joy Qiao from MSFT Wed, Jan 21 2015 8:44 AM 很多用户在搭建混合云架构时,会使用到微软Azure虚拟网络中的 VPN功能,来实现Azure中的虚拟网络与用户 ...

  7. (5)jvm垃圾回收器相关垃圾回收算法

    引用计数法[原理]--->引用计数器是经典的也是最古老的垃圾收集防范.--->实现原理:对于对象A,只要有任何一个对象引用A,则计数器加1.当引用失效时,计数器减1.只要对象A的计数器值为 ...

  8. Asp.net mvc中整合autofac

    创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofa ...

  9. Beginning Android 4 Programming Book学习

    Chapter 3 EditText不自动获取焦点,自动获取焦点但不显示软键盘  Page 122-123 只有定义了android:id属性的控件在屏幕翻转后状态才会被持久化  Page 133 C ...

  10. C# 两个ListBox 数据互传-基础操作

    先看效果图: 两个服务设施列,左边:lbFacility1,右边:lbFacility2,中间向左向右箭头. 如果只是单纯的向左向右移动,那很简单. 因为项目遇到要获取选中项的ID,通过给ListBo ...