【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法
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(九):上下文丢失处理方法的更多相关文章
- 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...
- 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西
我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
- 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽
还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...
- 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵
如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...
- 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序
本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...
- 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程
这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...
- 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF
我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...
- 【Stage3D学习笔记续】山寨Starling(一):从事件说起
我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...
随机推荐
- MySQL追加注释或者大量修改注释
MySQL追加注释或者大量修改注释 2016-01-25 20:28:05 分类: MySQL MySQL 5.6.14 之前一个项目比较仓促,开发给的建表语句没有注释.现在要补全注释信息.但是My ...
- git rebase无法处理的问题
在进行代码整理的时候,遇到了冲突 现在chucklu_master分支指向这个commit SHA-1: 88fa1ee9263402626d85b5a4362e1b620935953f * remo ...
- ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引 因为表KOL_XX_FIN050_TEMP 为临时表,而且有其他session正在使用. 处理步骤: 1.先从 dba ...
- WinCE发展史
Windows CE概述 WindowsCE是微软公司嵌入式.移动计算平台的基础,它是一个开放的.可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,W ...
- SharePoint 2010 获取当前用户的权限
转:http://blog.csdn.net/sygwin_net/article/details/6790500 操作环境:SharePoint 2010 关于SharePoint 的权限架构,具体 ...
- Rails常用命令
rails new Project rails g scaffold location uuid:string deviceid:string latitude:float longitude:flo ...
- 《深入Java虚拟机学习笔记》- 第18章 finally子句
本章主要介绍字节码实现的finally子句.包括相关指令以及这些指令的使用方式.此外,本章还介绍了Java源代码中finally子句所展示的一些令人惊讶的特性,并从字节码角度对这些特征进行了解释. 1 ...
- Month Calendar
http://www.codeproject.com/Articles/10840/Another-Month-Calendar#xx4614180xx Another Month Calendar ...
- LeetCode题解——Longest Substring Without Repeating Characters
题目: 给定一个字符串,返回其中不包含重复字符的最长子串长度. 解法: 维持两个指针,第一个指向子串开始,第二个负责遍历,当遍历到的字符出现在子串内时,应计算当前子串长度,并更新最长值:然后第一个指针 ...
- Mongodb千万级数据在python下的综合压力测试及应用探讨
http://rfyiamcool.blog.51cto.com/1030776/1329351