批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可以回头查看Stage3D学习笔记(五):通过矩阵操作纹理这篇文章: 绘制流程: 我们创建了两个矩阵,一个正交矩阵一个模型矩阵: 清除3D图像: 我们创建了顶点缓冲对象和索引缓冲对象比上传数据到GPU,我们编写了四个顶点数据表示图像的四个顶点,以及使用索引数据指示了这四个顶点数据要绘制的两个三角形(S…
这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以参照原有的知识体系来阅读Straling的代码. Starling类: Straling类是整个Starling框架的核心,该类会管理Straling的显示列表.Touch事件.动画处理等等多个模块的功能: 同时Starling类会实现框架内部的帧循环: 实例化Starling类后会Starling…
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读Starling的源码来了解其它的内部运行方式. Touch事件体系无疑是除了核心渲染外最重要的东西了,我们笔记中的Touch事件体系是基于Starling v1.1来解读的. Touch事件体系简介: 在Starling的承继关系里是没有InteractiveObject类,因此所有的显示对象都默认…
还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操作顶点数据了. 所以引入了VertexData(顶点数据)这个类来进行封装. 在Starling中一个顶点需要记录9个数据,分别如下: 坐标数据 x 和 y(2D游戏就不需要z轴了,但是Starling中留下了 z 轴的位置的),开始索引为 0: 颜色数据 r.g.b.a(顶点颜色),开始索引为 3…
我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中只会贴出核心的代码,完整的代码和示例大家可以去GitHub中查看. 同时为了避免Starling中和原生API重名的问题,所有可能导致重名的类名我都会在后面加上2D,比如Starling中的EventDispatcher被我山寨过来后就重命名为EventDispatcher2D. 另外由于高版本的S…
如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上真3D,但是正是由于有了之前的学习我们实现真3D世界的学习才会更加轻松,下面的笔记就让我们真正的进入3D世界吧! 补充一下,我们的这部分学习笔记是基于<Adobe Flash 11 Stage3D(Molehill) 游戏编程初学者指南>一书的学习而来的. 赶快进入我们的主题,是否还记得之前的2D…
我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starling内部的一部分,有兴趣的朋友可以继续看Starling的源码,一定会有更多的收获! 后悔的是我到这个时间才悔悟过来(切确的说是面试被鄙视的结果),开始看3D这块的知识,但我始终坚信一个道理,付出永远不会太迟,Let`s keep moving! 查看Starling的更新日志来了解这个框架的动态也…
本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-Stage3D/zip/v0.1 先看看Demo: 代码 代码 下面说一下一些比较关键的点: 事件播放处理: DisplayObject2D类添加了一个内部方法dispatchEventOnChildren,核心实现在DisplayObjectContainer2D类中,该方法主要作用是使当前容器及递归…
我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后程序的效果吧! 首先,为了能明显的看出差距,我把未优化v0.2版本的MovieClipTest.swf的动画数量调到250个,同时QuadBatchTest.swf的代码一致也是250个动画,只是使用的是经过批处理优化的v0.3版本. 为了查看实际的性能差异,我使用了scout,下面看看我们的成果吧…
Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中,当按下Ctrl+Alt+Delete键时会出现类似“锁定计算机”和“启动任务管理器”的菜单选项,这就会引起渲染内容丢失.但这不是唯一的可能,还有些情况,在某些屏保程序激活时又或笔记本盖子合上时也会引起渲染内容丢失.甚至可以通过调用Context3D.dispose()方法来模拟渲染内容丢失事件.所以…
关于事件的优化: 遍历注册的事件由foreach改变为fori,在大量数据遍历时会有提升: 事件池优化: 所有的事件都使用一个对象池进行保存,而不是使用到时进行创建,使用EventDispatcher类的dispatchEventWith方法可以使用事件池,使用事件池在大量使用事件的情况下可以极大的提升运行效率,因为FlashPlayer不需要对大量的事件对象进行垃圾回收了. 该特性在Starling1.2中添加,我们的山寨版本就不添加这个功能了,有兴趣的童鞋可以自行查看. 关于算法的优化: 在…
我发布了一个版本v0.2,该版本是未优化版本,且没有添加Touch事件体系,但是由于是最基础且未优化的,所以可以通过参考代码快速的了解实现原理. 接下来的一段笔记开始进行渲染优化,我会把所有的目光都集中到渲染的优化之上. 点击下载:https://codeload.github.com/hammerc/hammerc-study-Stage3D/zip/v0.2 先看看Demo(特别说明:我使用了Whack的素材,Whack游戏开源地址:https://github.com/byxb/whack…
尺寸计算: Starling中的尺寸是以像素为单位的,这一切都得力于我们使用的正交矩阵,还记得我们顶点数据中的位置数据么,如果我们提交的矩形的四个顶点为(0, 0)(0, 100)(100, 0)(100, 100),那么最终通过正交矩阵的转换后绘制到舞台时将会是长宽都为100个像素的矩形. 那么Starling中的尺寸获取其实就是基于顶点数据来进行获取,详细代码可以参考DisplayObject中的getBounds方法,主要看继承类DisplayObjectContainer和Quad的具体…
混合模式: 代码 示例是<Stage3D指南>中的直接弄出来的,可以通过点击键盘上的Q.W.E这3个按键,更换混合模式.模型和纹理,可以直观的查看不同混合模式的效果,住:下方的地形使用"context3D.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);"正常混合模式渲染,上方中心的模型使用特定的混合模式渲染. 深度测试(Z-Buffer): 使用Z-Buffer的话,GPU会把每个像…
前面几个星期抽空用Starling做了一个打飞机的小游戏(所以没有接着看书了),准备面试时用的,结果面试还是没过%>_<%...这个游戏打算过几天全部开源了 那么接下来打算这周把<Stage3D初学者指南>全部看完,昨晚照着书上已经把一个可以用来展示的空间大战搞定了,效果如下: 在我们的例子中,可以通过键盘控制飞船飞行,通过鼠标调整摄像机的角度,下面我们主要说一下核心的代码(源码中带有注释,可直接点开查看): Entity 实体类是核心的渲染基类,我们可以通过继承该类来扩展我们的渲…
这就是书上的最终效果了,一个完整的空间大战游戏: 点击查看源码 这里并没有太多的新知识,所涉及的东西更多的是游戏开发方面的优化和技巧,下面我们大家一起来看看: 飞船: 类似粒子效果中的粒子创建方法,我们的游戏飞船也需要一样的创建机制进行创建,大家可以点击查看源码: GameActor GameActorPool 需要额外说明的是,添加了进行碰撞检测的机制,代码里写了基于球形的距离的碰撞检测(简单高效)和基于AABB盒的碰撞检测,但AABB盒的碰撞检测在实际的游戏中并没有使用. 另外添加了一点优化…
先看效果,按下空格键添加粒子特效: 一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码看看作者是怎么处理的. Particle 在我还没有看这本书的这章之前我认为一个Particle应该是一个单一的粒子(或许是一个面片或者是一个简单的模型),而最终的粒子效果则是有成千上万个Particle组成渲染得出的,所以应该存在一个JSON或XML描述文件来指定每个粒子的运动轨迹和生命周期,不过…
虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告别直接使用代码编写顶点数据的时代了,想想上一节,平面的四边形手写顶点或许还过得去,但是如果手写一个立方体的8个顶点数据就有点难了吧,如果是显示更加复杂的形状呢? 要显示一个3D模型,就需要一个特定格式的3D模型文件,3D模型文件一般使用3D建模工具创建,美术完成建模后会将模型导出为特定格式的3D模型…
虽然我们上一节已经实现了正交矩阵的显示,但是可以明显的感觉到要调整显示纹理的坐标和尺寸是相当复杂的,需要对每个顶点进行操作,如果还要加上注册点和旋转的话,用上一节的方法来做是会让人发疯的! 所以我们距离实用还有很长的路要走,加上之前面试时由于对Starling内部实现的不了解导致的失利,所以接下来的一段学习笔记会专注在通过正交矩阵来实现2D框架的实现上,并参考Starling的架构做一个精简的山寨版! 首要任务,就是要能方便的对纹理设置位置.尺寸和旋转!下面介绍Starling中使用的方法,借助…
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达). /** * 堆内存溢出demo * VM Options: -Xms6m -Xmx6m */ public class HeapOOM { static class OOMObejct { } public static void main(String[] args) { List<OOMObe…
通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. //先建一个node Node * node = Node::create(); //创建完之后打印node的引用计数 schedule([node](float f){ //获得node的引用计数 int count = node->getReferenceCount(); //打印node的引用计…
首先准备我们需要的图片,尺寸必须是2的幂数,我修改了一下Starling的图标拿来用: 还是先看看最终效果: 代码是居于上一节的代码进行修改的: package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Bitmap; import flash.display.Sprite; import flash.display.Stage3D; import flash.display3D.Context3D; imp…
本章用来作为Starling的滤镜实现原理的一个补充,但是为了了解原理,我们会使用原生API进行编码. 我们知道,当我们调用drawTriangles方法时,我们的图像是绘制到后台缓冲区的,只有调用present方法时才会把图像呈现到屏幕. 我们先来看看Context3D的两个方法: setRenderToTexture:我们默认的渲染都是在后台缓冲区进行的,使用该方法可以把渲染修改到一个纹理上,调用该方法后,Context3D对象的渲染操作(clear.drawTriangles等)都会渲染到…
我们这节在上一篇代码的基础上再进一步,让显示的纹理进行旋转. 实现旋转,只需要每帧修改_modelViewMatrix的旋转角度即可,我们需要一个变量来记录旋转: //旋转度数 private var _rotation:Number = 0; 每帧修改后的数据需要重新提交到GPU,而已经提交的数据不改动则不需要重新进行提交,所以我们修改一下render方法即可: private function render(event:Event):void { //没有变动的数据就不需要进行重复的上传了…
继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问) 面向对象提供了继承语法.能大大简化代码,把公共的方法和实例对象写在父类里.子类只需要写自己独有的实例变量和方法即可 继承既能保证类的完整,又能简化代码 继承特点 oc中只允许单继承 没有父类的类称为根类,oc中得根类是NSObject(祖宗) 继承的内容:所有的实例变量…
我们需要使用到Adobe自家提供的AGALMiniAssembler代码类,可以在网下进行下载: 关于AGAL的入门知识可以参考下面的文章: AGAL介绍系列文章(第一部分)AGAL介绍系列文章(第二部分)AGAL介绍系列文章(第三部分) 最终效果如下: 直接上代码了,亲们请查看相关的注释说明: package { import com.adobe.utils.AGALMiniAssembler; import flash.display.Sprite; import flash.display…
这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦的歌词~~ 基本文件操作: 打开文件时,需要指定文件路径和以何种方式打开文件如果是中文的还需要指定字符集,后面通过此文件句柄对该文件操作,打开文件的模式有: "+" 表示可以同时读写某个文件 "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,…
Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状态之间的关系 临时状态:由Java的new命令开辟内存空间的java对象也就是普通的java对象,如果没有变量引用它它将会被JVM收回.临时对象在内存中 是孤立存在的,它的意 义是携带信息载体,不和数据库中的数据由任何的关联.通过Session的save()方法和saveOrUpdate()方法可以…
重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段代码就有重复: <dependency> <groupId>org.springframework</groupId> <artifactid>spring-beans</artifactId> <version>2.5</vers…
首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activity的布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu…