- 浏览: 95105 次
- 性别:
- 来自: 上海
文章分类
最新评论
当你优化你的程序时,要考虑到许多因素。性能的优化并不仅仅与你使用 Papervision3D 的方式
相关。最后所说的是关于如何在 Flash 中进行性能的优化。让我们先测试一些并不只与
Papervision3D 有关的优化技巧。
舞台品质
将 stage quality 调低是得到性能的最容易的方式。降低 stage quality 并不意味你降低了
屏幕的质量。首先,先来看看你可以设置的品质设置选项:
图像是反锯齿的,使用了 4 乘 4 像素栅格,可以使 bitmap 很平滑。
图像是反锯齿的,使用了 4 乘 4 像素栅格,如果 movie 是静态的,
可以使 bitmap 很平滑。一般地,stage 的品质都设置成这个值。
图像是反锯齿的,使用了 2 乘 2 像素栅格,这不会使 bitmap
平滑并对文本阅读有点影响,对动画会有一点优化。
图像不是反锯齿的,bitmap 也不平滑。对文本的显示和动画的优化
有很大的影响。
Chapter 13
[ 383 ]
stage.quality = StageQuality.LOW;
var bmpData:BitmapData = new BitmapData(button.width,button.height);
bmpData.draw(button);
var bmpButton:Bitmap = new Bitmap(bmpData);
bmpButton.x = button.x;
bmpButton.y = button.y;
addChild(bmpButton);
removeChild(button);
将所有东西设低会影响你程序的图像显示。特别是并未优化的文本会更难读,这是需要被
考虑的也是可以优化的。开发的时候最低也要将 stage 设成中等品质,只有在必需的时候
才将 stage 的品质设成低品质。
当 scene 有一个静态视图时应使用中等品质甚至高品质,在包含动画时再将 stage 设成
低品质。当动画在播放时,文本的品质也很难看清,所以可以把品质设低。
另外一个技巧是根据用户电脑在播放 movie 时可以达到的帧速来设置 stage 的品质。如果
帧速下降到某个值时,你的程序可以侦测到这种情况并将 stage 的品质设置成中等或者低
品质。于是,使用配置更快的电脑可以看到最好的图形效果并且程序表现得更好;使用配置
稍慢的电脑也可以通过合理的帧看到不错的图形效果。
为了可以改变 stage 的 quality,你需要导入 StageQuality 类,这样你就可以使用该类
定义 quality 的静态常量。该类可以在 flash.display.StageQuality 找到。通过改变
stage 的 quality 属性,你可以在任何时候改变 quality:
当改变 stage 的 quality 时可能发生的一个问题是:它改变文本的 quality 但并不能使
文本的可读性提高而且也不是 Papervision3D 渲染器的一部分。例如,使用 2D 接口的按钮
的 label 属性。这样情况下你可以创建产生该问题元素的截屏并用该截屏来代替。以下代码
展示了如何创建一个虚构的按钮:
你可以试试将前面的例子设置 stage 的 quality。例如,将 animated mill 的 quality 设置
成中等并看看帧速是如何增加的,它肯定提高了性能。
Optimizing Performance
[] 384
scene.removeChild(do3d);
do3d.material.destroy();
do3d = null;
其它普通的Flash优化
通常情况下,你都应该尝试写优化的代码。在你不需要 event 监听器时,将它移除。不要
创建太多的 enter frame event 或者 timer 的监听器。尽量不要在一个循环里面声明变量。
这样你的程序会表现得更好,Papervision3D 程序也一样。
通常你在使用 Flex Builder 或者 Flash Builder 开发的时候,发布的都是 debug 版本。
发布的时候最好发布成 release 版本,因为它的性能会更好。
删除不需要的对象
作为简洁编程的一部分,你应该将不再需要的对象删除。这样,垃圾回收器在运行它的周期时
会将那些对象在内存中删除。
因为 Papervision3D 使用了大量的 bitmap data 对象,所以在你不再需要那些对象时应将
它们删除。当你不再需要 scene 中子对象时,应将它删除并且将它的引用和 material 删除。
一旦你需要从内在中删除某个对象时,你需要执行以下 3 行代码:
第一行的作用是将该对象从 scene 中删除。第二行将该对象的所有 material 引用都删除。
第三行将该对象的引用设为 null。还需要注意将其它对该对象的引用也要删除。只有将所有
的引用删除,内存才会被清空。
Viewport 大小
你的 viewport 的大小越大,scene 显示的也越多,渲染的也越多。应尽量将需要渲染的总像素
的数量控制得更低,这样性能会更好。虽然那些使用最大可用屏幕的程序会更好看,但你的
Papervision3D 程序使用这种方式来运行的话并不总是一种好主意。在设置 viewport 的大小时
应根据你的需要和 Papervison3D 的限制。
Chapter 13
[] 385
camera.useCulling = true;
镜头视域
镜头(camera)可以看到 scene 中所发生的一切。在同一时间它所看的越多,Flash 播放器
的工作量就越大。因此,你可以将镜头微调一下使它在同一时间看到的物体少一些。如果你
的项目需要尽可能的优化的话,你可以通过使用 camera 的 fov,zom 和 focus 属性来调低
视图。因为这个技巧对需要被渲染三角形的数量影响并不大,所以对性能的影响可能也是比较
小的。如果你将上面的属性设得比较极端的话,虽然优化了性能,但渲染的结果也会不如你意的。
剔除
在关于 camera 的第五章,我们学习了什么是剔除以及它的用法。剔除就是:确认哪些物体在
(或者部分在) camera 的视域里面并且放弃那些不在里面物体的过程。剔除是性能优化的一种,
你可以设置 camera 的属性,如下所示:
将 useCulling 设为 true,所有在视域外的物体都会被忽略,这会节省性能。
创意的想法
性能的优化需要一种有创意的方式。每个程序都是不相同的,它可能还需要这一章中并未提到
的优化方式。你可以试试你自己的想法并看看是否起作用。
在虚拟 3D 中,优化是很常见的。在一个项目的开始,你可以问下自己哪些东西可以是虚拟的,
例如-使用 billboard particle。
优化 material
如果 material 不是以最佳的方式使用的话,可能导致 Papervision3D 使用很多时间来渲染
它们。在关于 material 的第四章,你已经学习了怎样使它们尽可能的轻量的技术。在本部分
里,我们会逐个讨论这些技术并介绍更多优化策略。
Optimizing Performance
[ 386 ]
BitmapMaterial.AUTO_MIP_MAPPING = true;
透明度
MovieMaterial 的实例或者继承了 MovieMaterial 的类可以设置透明度。默认情况下,
movie material 的透明度是关闭的。你最好保持这个设置不变。带透明度的图片是 32
位的而没有透明度的图片是 24 位的。没有透明度的图片渲染得更快。
永远试着把一个 material 的 tiled 属性设成 true。根据你的情况这会轻微地提高了
性能(这是 Flash 播放器存在的一性能的 bug)。
双纹理的作用
双纹理的作用是用来 mipmapping(映射),它允许你将 material 的 smoothing 设为 true
而又不丢失性能。关于 material 的第四章大量阐述了它是如何工作的。
某些情况下为了得到 mipmapping 的好处,你不可以使用 two dimensions,你可以将
BitmapMaterial 的属性 AUTO_MIP_MAPPING 设为 true。
当你设为这样的时候,Papervision3D 会更正所有新建的 bitmap material。缺点就是它会
比把这个属性设为 false 的时候要用更多一点内存。
material 的大小
在 modeling 那一章,你已经学习了你应该将 material 的宽和高尽量做小。例如,当你有
一个车的 model 时,你想把轮子纹理化,聪明是做法是把纹理做得越小越好。因为轮子不可
能以全屏出现,所以使用 1024 乘 1024 的纹理是不合理的。应该使用双纹理来代替,如 64
乘 64 像素的图片。
Tiled
动画化的 material
animated material 是 Flash 播放器比较难处理的一种 material。每次我们在渲染一个使用了
animated material 的对象时候,播放器会创建 movie clip 的一个当前状态的屏幕快照。该屏幕
快照会被用作一个一般的 bitmap material,然后被转换成 3D 视图并被画到屏幕上。
Andy Zupko 在他的博客中介绍了一种会将每一帧储存在内存中 material 类型,并提供
Chapter 13
[ 387 ]
•
•
•
创建这个屏幕快照是很耗 CPU 的,所以当该 material 要动画化时应该将 animated 属性
设为 true。当你不再需要该动画时,将它设为 false。默认情况下,所有继承了 MovieMaterial
的 material 都设成 false,MovieMaterial 包含了一个 VideoStreamMaterial 的异常,
很明显这些 material 需要被动画化。
因为 material 上的动画是很耗 CPU 的,你应该尽量少用带有同步动画的 material。
要想在使用动画化的 material 时获得性能,你可以将动画的每一帧作为一个屏幕快照保存
在内存里。每次动画到达一个帧(该帧之前已经显示过)时,只需从内存读取缓存的屏幕快照,
而不是重新创建该帧的屏幕快照。
很不幸的是, Papervision3D 并没有实现该功能。但是,Papervision3D 核心组的组员
这个类的下载。你可以在这个网页了解:http://blog.zupko.info/?p=248。
当你使用该缓存机制时,你还应该考虑以下事情:
因为所有屏幕快照是作为 bitmap data 储存在内存的,这会使用相当一部分的内存的。
你用得越多帧或者 movie clip 的解析度越高的话,用的内存也越多。
这只会对静态 movie clip 起作用,也就是多次播放该动画时起作用。
因为每个帧是储存为 bitmap data 的,所以 material 是没有交互性的。
在同一时间使用多个动画化的 material时,将帧缓存起来对性能有很大的提高。
优化 object
你的 object 越复杂,越多的三角形需要被画出来。之前已经说过,你应该尽量把三角形
保持得越少。当使用外部工具建模时,最好先建立一个比较简单的多边形模型,然后根据
需要添加更多的多边形或者三角形。反向操作时也一样,从一个复杂的模型中删除三角形时
会需要做更多工作。
Optimizing Performance
[ 388 ]
优化 object 还有更多的技巧。在以下的章节中会有介绍。
将在 object 背后的其它 object 删除
听起来所容易:只需将不可见的 object 删除掉。这些 object 并不是指那些位于 camera
视域外的 object 或者在 3D object 背面的那些,因为 Papervision3D 会自动帮我们检测
这些。我们所说的 object 是指位于视域内的,但从某个视角来看它们是位于其它 object
后面的 object。
因为 Papervision3D 默认使用了 painter 的算法,它描画 object 时是从最远到最近的。
所以,当一个 object 在另一个 object 的前面,它们都会被画到屏幕的。当一个 object
完全掩盖它后面的另一个 object 时,将它们都描画出来将是一种浪费。
我们来想象一下这样一种情形,你建立一个由两个房间(一个卧室,一个冲凉房) 组成的
3D 环境。两个房间由一块墙隔开,你可以自由行走。当你点击门时,你进入另一个房间。
现在你面对着门的那个方向,墙后面是冲凉房。根据 painter 的算法,首先画的是冲凉房,
然后是阻止你看见冲凉房的那一块墙。但是我们都看不到冲凉房,何必把它画出来呢。所以
将冲凉房从 scene 中移除掉会省掉很多的性能。
你可能会想,这不是 far plane 可以做到的吗?far plane 可以使你减少渲染那些太远而
不能被看见的 object,但在这个例子中它仍然会渲染你所面向的那个冲凉房。当 camera
接近门的时候,far plane 就不会起作用了。
当你知道你不能看见那些位于某些 object 后面的 object 时,将它们删除是很节省性能的,
特别是当它们包含很多三角形的时候。
在这方面需要做很多工作。在你计划你的项目时,而且你知道 Papervision3D 可以做到什么,
将那些隐藏的 object 删除掉是一种不错的考虑。
Chapter 13
[ 389 ]
private var slod:SimpleLevelOfDetail;
private function init():void
{
var stats:StatsView = new StatsView(renderer);
addChild(stats);
var mat:WireframeMaterial = new WireframeMaterial
(Math.random()*0xFFFFFF);
var sphere1:Sphere = new Sphere(mat,200,12,12);
var sphere2:Sphere = new Sphere(mat,200,6,6);
var sphere3:Sphere = new Sphere(mat,200,3,3);
var spheres:Array = [sphere1,sphere2,sphere3];
slod = new SimpleLevelOfDetail(spheres,600,2000);
scene.addChild(slod);
}
override protected function onRenderTick(e:Event=null):void
{
slod.z += 5;
super.onRenderTick();
}
Level of detail(细节的级别)
Level of detail(也即是 LOD)是关于:基于 3D object 与 camera 的距离来减少它们的
复杂性。假设你有一个离 camera 很近的 do3。该 do3D 在屏幕上显得很大,你可以看清所有
detail(细节)。然而,在这个 object 被放置在背景的某个地方时,它不需要被看清所有
细节。这是就可以用到 LOD,它可以根据离 camera 的距离来显示一个 object 的三角形数量
的多或少。如果我们想它做得更好,应该在模型中加入更多的三角形,那样,你的 do3D 从
一个样式转换到另一个时就不会有太大的变化。这会轻微地改变了 do3D 的样子。
Papervision3D 内建了对 LOD 的支持,但它不支持 do3D 之间的窜改。这个没有窜改功能的
技术叫做 simple level of detail(细节的简单级别),或者是 SLOD。
提供内建 SLOD 支持的类叫做 SimpleLevelOfDetail,它可以从
org.papervison3d.objects.special.SimpleLevelOfDetail 包导入。
下面是它的用法:
Optimizing Performance
[ 390 ]
Parameter Data type Default
value
Description
1 object Array —
2 minDepth Number 1000
3 maxDepth Number 10000
4 distances Array null
首先,我们实例化三个球形然后把它们放到一个数组里面。该数组作为 SimpleLevelOfDetail
类的第一个参数。你根据 object 的 detail 的不同程度添加到数组,从最近而且有最多
detail 的 object 开始,结束于最远而且最简单的 object。
实例化 SimpleLevelOfDetail 类需要 4 个参数:
一个包含 3D object 的数组。数组的第一个
元素代表最近而且拥有最多 detail 的,最后
的元素是最远而且最简单的 3D object。
定义最近而且最多 detail 的 object 应该
使用的距离。
定义最远而且最少 detail 的 object 应该
使用的距离。
一个用来定义 object 数组中每个 object
深度值的一个 integer 数组。默认设为 null。
如果提供了该数组,它会替换 minDepth 和
maxDepth 参数。
一旦 SimpleLevelOfDetail 类实例化后,它会被添加到 scene 中,因为这个类继承了
DisplayObject3D。
在每次 onRenderTick 的调用时,SLOD sphere 会被移到离 camera 稍远的地方,这会显示了
object 是如何变化的。
Chapter 13
[ 391 ]
Distance: 600 Distance: 1200 Distance: 1700
LODExample
发布之后,你可以看到以下次序的图片。
因为一个 StatsView 实例被添加到 stage,你也可以在左上方见到渲染了的三角形减少的数量。
相关。最后所说的是关于如何在 Flash 中进行性能的优化。让我们先测试一些并不只与
Papervision3D 有关的优化技巧。
舞台品质
将 stage quality 调低是得到性能的最容易的方式。降低 stage quality 并不意味你降低了
屏幕的质量。首先,先来看看你可以设置的品质设置选项:
图像是反锯齿的,使用了 4 乘 4 像素栅格,可以使 bitmap 很平滑。
图像是反锯齿的,使用了 4 乘 4 像素栅格,如果 movie 是静态的,
可以使 bitmap 很平滑。一般地,stage 的品质都设置成这个值。
图像是反锯齿的,使用了 2 乘 2 像素栅格,这不会使 bitmap
平滑并对文本阅读有点影响,对动画会有一点优化。
图像不是反锯齿的,bitmap 也不平滑。对文本的显示和动画的优化
有很大的影响。
Chapter 13
[ 383 ]
stage.quality = StageQuality.LOW;
var bmpData:BitmapData = new BitmapData(button.width,button.height);
bmpData.draw(button);
var bmpButton:Bitmap = new Bitmap(bmpData);
bmpButton.x = button.x;
bmpButton.y = button.y;
addChild(bmpButton);
removeChild(button);
将所有东西设低会影响你程序的图像显示。特别是并未优化的文本会更难读,这是需要被
考虑的也是可以优化的。开发的时候最低也要将 stage 设成中等品质,只有在必需的时候
才将 stage 的品质设成低品质。
当 scene 有一个静态视图时应使用中等品质甚至高品质,在包含动画时再将 stage 设成
低品质。当动画在播放时,文本的品质也很难看清,所以可以把品质设低。
另外一个技巧是根据用户电脑在播放 movie 时可以达到的帧速来设置 stage 的品质。如果
帧速下降到某个值时,你的程序可以侦测到这种情况并将 stage 的品质设置成中等或者低
品质。于是,使用配置更快的电脑可以看到最好的图形效果并且程序表现得更好;使用配置
稍慢的电脑也可以通过合理的帧看到不错的图形效果。
为了可以改变 stage 的 quality,你需要导入 StageQuality 类,这样你就可以使用该类
定义 quality 的静态常量。该类可以在 flash.display.StageQuality 找到。通过改变
stage 的 quality 属性,你可以在任何时候改变 quality:
当改变 stage 的 quality 时可能发生的一个问题是:它改变文本的 quality 但并不能使
文本的可读性提高而且也不是 Papervision3D 渲染器的一部分。例如,使用 2D 接口的按钮
的 label 属性。这样情况下你可以创建产生该问题元素的截屏并用该截屏来代替。以下代码
展示了如何创建一个虚构的按钮:
你可以试试将前面的例子设置 stage 的 quality。例如,将 animated mill 的 quality 设置
成中等并看看帧速是如何增加的,它肯定提高了性能。
Optimizing Performance
[] 384
scene.removeChild(do3d);
do3d.material.destroy();
do3d = null;
其它普通的Flash优化
通常情况下,你都应该尝试写优化的代码。在你不需要 event 监听器时,将它移除。不要
创建太多的 enter frame event 或者 timer 的监听器。尽量不要在一个循环里面声明变量。
这样你的程序会表现得更好,Papervision3D 程序也一样。
通常你在使用 Flex Builder 或者 Flash Builder 开发的时候,发布的都是 debug 版本。
发布的时候最好发布成 release 版本,因为它的性能会更好。
删除不需要的对象
作为简洁编程的一部分,你应该将不再需要的对象删除。这样,垃圾回收器在运行它的周期时
会将那些对象在内存中删除。
因为 Papervision3D 使用了大量的 bitmap data 对象,所以在你不再需要那些对象时应将
它们删除。当你不再需要 scene 中子对象时,应将它删除并且将它的引用和 material 删除。
一旦你需要从内在中删除某个对象时,你需要执行以下 3 行代码:
第一行的作用是将该对象从 scene 中删除。第二行将该对象的所有 material 引用都删除。
第三行将该对象的引用设为 null。还需要注意将其它对该对象的引用也要删除。只有将所有
的引用删除,内存才会被清空。
Viewport 大小
你的 viewport 的大小越大,scene 显示的也越多,渲染的也越多。应尽量将需要渲染的总像素
的数量控制得更低,这样性能会更好。虽然那些使用最大可用屏幕的程序会更好看,但你的
Papervision3D 程序使用这种方式来运行的话并不总是一种好主意。在设置 viewport 的大小时
应根据你的需要和 Papervison3D 的限制。
Chapter 13
[] 385
camera.useCulling = true;
镜头视域
镜头(camera)可以看到 scene 中所发生的一切。在同一时间它所看的越多,Flash 播放器
的工作量就越大。因此,你可以将镜头微调一下使它在同一时间看到的物体少一些。如果你
的项目需要尽可能的优化的话,你可以通过使用 camera 的 fov,zom 和 focus 属性来调低
视图。因为这个技巧对需要被渲染三角形的数量影响并不大,所以对性能的影响可能也是比较
小的。如果你将上面的属性设得比较极端的话,虽然优化了性能,但渲染的结果也会不如你意的。
剔除
在关于 camera 的第五章,我们学习了什么是剔除以及它的用法。剔除就是:确认哪些物体在
(或者部分在) camera 的视域里面并且放弃那些不在里面物体的过程。剔除是性能优化的一种,
你可以设置 camera 的属性,如下所示:
将 useCulling 设为 true,所有在视域外的物体都会被忽略,这会节省性能。
创意的想法
性能的优化需要一种有创意的方式。每个程序都是不相同的,它可能还需要这一章中并未提到
的优化方式。你可以试试你自己的想法并看看是否起作用。
在虚拟 3D 中,优化是很常见的。在一个项目的开始,你可以问下自己哪些东西可以是虚拟的,
例如-使用 billboard particle。
优化 material
如果 material 不是以最佳的方式使用的话,可能导致 Papervision3D 使用很多时间来渲染
它们。在关于 material 的第四章,你已经学习了怎样使它们尽可能的轻量的技术。在本部分
里,我们会逐个讨论这些技术并介绍更多优化策略。
Optimizing Performance
[ 386 ]
BitmapMaterial.AUTO_MIP_MAPPING = true;
透明度
MovieMaterial 的实例或者继承了 MovieMaterial 的类可以设置透明度。默认情况下,
movie material 的透明度是关闭的。你最好保持这个设置不变。带透明度的图片是 32
位的而没有透明度的图片是 24 位的。没有透明度的图片渲染得更快。
永远试着把一个 material 的 tiled 属性设成 true。根据你的情况这会轻微地提高了
性能(这是 Flash 播放器存在的一性能的 bug)。
双纹理的作用
双纹理的作用是用来 mipmapping(映射),它允许你将 material 的 smoothing 设为 true
而又不丢失性能。关于 material 的第四章大量阐述了它是如何工作的。
某些情况下为了得到 mipmapping 的好处,你不可以使用 two dimensions,你可以将
BitmapMaterial 的属性 AUTO_MIP_MAPPING 设为 true。
当你设为这样的时候,Papervision3D 会更正所有新建的 bitmap material。缺点就是它会
比把这个属性设为 false 的时候要用更多一点内存。
material 的大小
在 modeling 那一章,你已经学习了你应该将 material 的宽和高尽量做小。例如,当你有
一个车的 model 时,你想把轮子纹理化,聪明是做法是把纹理做得越小越好。因为轮子不可
能以全屏出现,所以使用 1024 乘 1024 的纹理是不合理的。应该使用双纹理来代替,如 64
乘 64 像素的图片。
Tiled
动画化的 material
animated material 是 Flash 播放器比较难处理的一种 material。每次我们在渲染一个使用了
animated material 的对象时候,播放器会创建 movie clip 的一个当前状态的屏幕快照。该屏幕
快照会被用作一个一般的 bitmap material,然后被转换成 3D 视图并被画到屏幕上。
Andy Zupko 在他的博客中介绍了一种会将每一帧储存在内存中 material 类型,并提供
Chapter 13
[ 387 ]
•
•
•
创建这个屏幕快照是很耗 CPU 的,所以当该 material 要动画化时应该将 animated 属性
设为 true。当你不再需要该动画时,将它设为 false。默认情况下,所有继承了 MovieMaterial
的 material 都设成 false,MovieMaterial 包含了一个 VideoStreamMaterial 的异常,
很明显这些 material 需要被动画化。
因为 material 上的动画是很耗 CPU 的,你应该尽量少用带有同步动画的 material。
要想在使用动画化的 material 时获得性能,你可以将动画的每一帧作为一个屏幕快照保存
在内存里。每次动画到达一个帧(该帧之前已经显示过)时,只需从内存读取缓存的屏幕快照,
而不是重新创建该帧的屏幕快照。
很不幸的是, Papervision3D 并没有实现该功能。但是,Papervision3D 核心组的组员
这个类的下载。你可以在这个网页了解:http://blog.zupko.info/?p=248。
当你使用该缓存机制时,你还应该考虑以下事情:
因为所有屏幕快照是作为 bitmap data 储存在内存的,这会使用相当一部分的内存的。
你用得越多帧或者 movie clip 的解析度越高的话,用的内存也越多。
这只会对静态 movie clip 起作用,也就是多次播放该动画时起作用。
因为每个帧是储存为 bitmap data 的,所以 material 是没有交互性的。
在同一时间使用多个动画化的 material时,将帧缓存起来对性能有很大的提高。
优化 object
你的 object 越复杂,越多的三角形需要被画出来。之前已经说过,你应该尽量把三角形
保持得越少。当使用外部工具建模时,最好先建立一个比较简单的多边形模型,然后根据
需要添加更多的多边形或者三角形。反向操作时也一样,从一个复杂的模型中删除三角形时
会需要做更多工作。
Optimizing Performance
[ 388 ]
优化 object 还有更多的技巧。在以下的章节中会有介绍。
将在 object 背后的其它 object 删除
听起来所容易:只需将不可见的 object 删除掉。这些 object 并不是指那些位于 camera
视域外的 object 或者在 3D object 背面的那些,因为 Papervision3D 会自动帮我们检测
这些。我们所说的 object 是指位于视域内的,但从某个视角来看它们是位于其它 object
后面的 object。
因为 Papervision3D 默认使用了 painter 的算法,它描画 object 时是从最远到最近的。
所以,当一个 object 在另一个 object 的前面,它们都会被画到屏幕的。当一个 object
完全掩盖它后面的另一个 object 时,将它们都描画出来将是一种浪费。
我们来想象一下这样一种情形,你建立一个由两个房间(一个卧室,一个冲凉房) 组成的
3D 环境。两个房间由一块墙隔开,你可以自由行走。当你点击门时,你进入另一个房间。
现在你面对着门的那个方向,墙后面是冲凉房。根据 painter 的算法,首先画的是冲凉房,
然后是阻止你看见冲凉房的那一块墙。但是我们都看不到冲凉房,何必把它画出来呢。所以
将冲凉房从 scene 中移除掉会省掉很多的性能。
你可能会想,这不是 far plane 可以做到的吗?far plane 可以使你减少渲染那些太远而
不能被看见的 object,但在这个例子中它仍然会渲染你所面向的那个冲凉房。当 camera
接近门的时候,far plane 就不会起作用了。
当你知道你不能看见那些位于某些 object 后面的 object 时,将它们删除是很节省性能的,
特别是当它们包含很多三角形的时候。
在这方面需要做很多工作。在你计划你的项目时,而且你知道 Papervision3D 可以做到什么,
将那些隐藏的 object 删除掉是一种不错的考虑。
Chapter 13
[ 389 ]
private var slod:SimpleLevelOfDetail;
private function init():void
{
var stats:StatsView = new StatsView(renderer);
addChild(stats);
var mat:WireframeMaterial = new WireframeMaterial
(Math.random()*0xFFFFFF);
var sphere1:Sphere = new Sphere(mat,200,12,12);
var sphere2:Sphere = new Sphere(mat,200,6,6);
var sphere3:Sphere = new Sphere(mat,200,3,3);
var spheres:Array = [sphere1,sphere2,sphere3];
slod = new SimpleLevelOfDetail(spheres,600,2000);
scene.addChild(slod);
}
override protected function onRenderTick(e:Event=null):void
{
slod.z += 5;
super.onRenderTick();
}
Level of detail(细节的级别)
Level of detail(也即是 LOD)是关于:基于 3D object 与 camera 的距离来减少它们的
复杂性。假设你有一个离 camera 很近的 do3。该 do3D 在屏幕上显得很大,你可以看清所有
detail(细节)。然而,在这个 object 被放置在背景的某个地方时,它不需要被看清所有
细节。这是就可以用到 LOD,它可以根据离 camera 的距离来显示一个 object 的三角形数量
的多或少。如果我们想它做得更好,应该在模型中加入更多的三角形,那样,你的 do3D 从
一个样式转换到另一个时就不会有太大的变化。这会轻微地改变了 do3D 的样子。
Papervision3D 内建了对 LOD 的支持,但它不支持 do3D 之间的窜改。这个没有窜改功能的
技术叫做 simple level of detail(细节的简单级别),或者是 SLOD。
提供内建 SLOD 支持的类叫做 SimpleLevelOfDetail,它可以从
org.papervison3d.objects.special.SimpleLevelOfDetail 包导入。
下面是它的用法:
Optimizing Performance
[ 390 ]
Parameter Data type Default
value
Description
1 object Array —
2 minDepth Number 1000
3 maxDepth Number 10000
4 distances Array null
首先,我们实例化三个球形然后把它们放到一个数组里面。该数组作为 SimpleLevelOfDetail
类的第一个参数。你根据 object 的 detail 的不同程度添加到数组,从最近而且有最多
detail 的 object 开始,结束于最远而且最简单的 object。
实例化 SimpleLevelOfDetail 类需要 4 个参数:
一个包含 3D object 的数组。数组的第一个
元素代表最近而且拥有最多 detail 的,最后
的元素是最远而且最简单的 3D object。
定义最近而且最多 detail 的 object 应该
使用的距离。
定义最远而且最少 detail 的 object 应该
使用的距离。
一个用来定义 object 数组中每个 object
深度值的一个 integer 数组。默认设为 null。
如果提供了该数组,它会替换 minDepth 和
maxDepth 参数。
一旦 SimpleLevelOfDetail 类实例化后,它会被添加到 scene 中,因为这个类继承了
DisplayObject3D。
在每次 onRenderTick 的调用时,SLOD sphere 会被移到离 camera 稍远的地方,这会显示了
object 是如何变化的。
Chapter 13
[ 391 ]
Distance: 600 Distance: 1200 Distance: 1700
LODExample
发布之后,你可以看到以下次序的图片。
因为一个 StatsView 实例被添加到 stage,你也可以在左上方见到渲染了的三角形减少的数量。
发表评论
-
Android游戏开发
2011-07-01 15:26 196Android开发中Activity是个 -
Flash WebGame 开发经验心得和PureMVC框架细说
2011-06-28 14:02 1548→前端的主程序架构和模块划分与人手和人事分工是紧密联系在一起的 ... -
Flash中的深度排序
2011-06-28 11:34 1274As for Multiplayer Games and Vi ... -
Flex 中的callback
2011-06-28 11:16 964Flash支持传递函数做完参数传递。 下面是主函数中的方法 ... -
常用flash引擎和框架
2011-06-27 11:08 2985官方在线帮助(没标英文的都是中文) 用于 Adobe Flas ... -
原来flash player对图片的解码不是异步的,AIR2.6后就异步了
2011-06-27 10:53 850用过 Loader 对象的人都知道,加载图片时,无论是使用 l ... -
Flash WebGame 开发经验心得和PureMVC框架细说
2011-06-27 10:32 1067→前端的主程序架构和模块划分与人手和人事分工是紧密联系在一起的 ... -
简要评说Adobe的FlashPlayer的渲染算法
2011-06-27 10:22 1025前些时候看到CSDN上一篇文章介绍FlashPlayer的渲染 ... -
游戏中的智能寻路
2011-05-22 18:20 1269近年来,游戏产业的快 ... -
as3中ProgressEvent的bytesTotal始终为0
2011-05-16 09:50 1514as3中ProgressEvent的bytesTotal始终为 ... -
使用URI-Style Namespace编译ActionScript/Flex Library
2011-05-12 11:10 819当你开发了一个有着多个Pacakge的类库,并在MXML中使用 ... -
环境贴图
2011-03-29 10:49 1095教程:实时环境映射贴图技术实时环境映射贴图技术(Real-ti ... -
Python之旅
2010-12-09 19:40 948一直用AS3+Red5做一些小游戏,感觉挺方便的,特别在做上下 ... -
flash player10的rotationY的使用
2010-12-07 12:26 1607flash player10提供了对3D的支持,虽然功能不够强 ... -
red5的常用方法
2010-12-03 10:11 976在使用red5+flash做rpg游戏开发的时候有些功能是需要 ... -
PV3D处理3D矢量绘图与3D文本
2010-08-23 11:46 1160Papervision3D主要以位图为 ... -
Flash中矢量和位图的使用
2010-06-09 16:47 889最近在做一个世界地图的Flash,其中导入一个很大的矢量图形, ... -
flex 3 + .net开发flash Remoting四[完整代码
2010-03-02 20:49 761一. 相关说明: 本 ... -
关于PV3D常用材质的讨论
2009-12-17 14:05 1113PV3D中的贴图材质有很多。 颜色材质Co ... -
AS3中的loading与stage
2009-12-16 13:53 1009在AS3中如果用loading在主flash中是不能使用sta ...
相关推荐
9. **性能优化**:PV3D性能取决于很多因素,如对象复杂性、渲染质量等。了解如何优化代码和3D场景以提高运行效率。 10. **实例项目**:PV3D Essentials可能包含了一些实例项目,如简单的3D游戏、产品展示或交互式...
PV3D通常使用GPU加速的硬件渲染,以提高性能。 2. **加载器(Loader)**:用于加载3D模型和其他资源,如纹理和音频文件。 3. **数学库(Math Library)**:提供必要的向量、矩阵和几何计算,支持3D变换和坐标系统...
9. **性能优化**:尽管PV3D提供了强大的3D功能,但处理大量3D对象时,性能优化至关重要,如减少不必要的渲染、使用遮挡剔除等技术。 通过学习和实践PV3D,开发者不仅可以创建出引人入胜的3D Flash应用,还可以为...
2.3 动态性与性能优化:AS3.0的动态性让PV3D能根据需要动态地添加和移除3D对象,同时,通过使用DisplayObjectContainer和DisplayObject的优化技巧,可以提升3D场景的渲染效率。 三、PV3D的关键技术 3.1 面向切面...
5. **优化与性能**:由于3D渲染对计算资源的需求较高,开发者需要关注性能优化,例如使用适当的渲染模式、减少不必要的渲染更新、缓存纹理和几何数据等。 6. **项目结构**:“pv3d简单全景”项目可能包含以下部分:...
这个版本可能包含了修复的bug、性能优化、新功能添加或者对现有功能的改进。通常,库的版本号更新意味着开发者为了解决之前版本的问题或者增加新的特性,进行了代码的修改和更新。 PV3D的核心特性包括: 1. **硬件...
1.5到1.7版本的升级主要关注性能优化、新功能添加以及API的改进。其中,渲染引擎是关键,它负责将3D对象转化为2D屏幕上的像素,包括视口设置、相机操作、光照处理等。 2. 3D对象模型 PV3D中的3D对象模型包括几何体...
8. **性能优化**:交互性可能导致性能问题,文档可能涵盖了一些优化技巧,如减少不必要的计算,使用批处理技术,或者在不影响视觉效果的情况下降低场景复杂度。 学习这个实例可以帮助开发者理解PV3D中的交互设计...
**PV3D技术详解** PV3D,全称 Papervision3D,是一款基于Adobe Flash Platform的开源3D图形库,允许开发者在Flash Player或Adobe AIR环境中创建丰富的三维交互体验。SWC和AS文件是PV3D开发中的关键组件。 **SWC...
PV3D(Papervision3D)是一种基于ActionScript 3.0的开源库,用于在Adobe Flash环境中创建3D图形和交互式应用程序。它为开发者提供了在Web上构建三维场景、游戏以及复杂的可视化应用的可能性。AS3(ActionScript 3.0...
- **Stage3D**: PV3D利用了Adobe Flash Player 10引入的Stage3D API,这是一个底层的硬件加速图形接口,可以显著提高3D渲染性能。 - **Scene3D**: PV3D的核心组件,代表了一个3D场景,包含相机、光源、网格、材质...
4. **性能优化**:为了确保在各种设备上都能流畅运行,源码可能涉及了多线程、对象池、内存管理等性能优化技巧。 5. **事件处理**:PV3D 3D 电子书展示平台需要监听用户的操作,比如点击、滚动等,以便做出相应的...
《使用ActionScript3、XML、SWFProfiler与PV...通过学习这个项目,不仅可以提升ActionScript3编程技能,还能掌握XML数据处理、3D图形编程以及性能优化的方法,对于想要深入理解Flash开发的初学者来说是一份宝贵的资源。
4. ActionScript 3:ActionScript是Adobe Flash的编程语言,版本3进行了许多性能优化,使其更适合处理复杂的3D计算。在PV3D中,ActionScript 3用于控制3D对象、处理用户输入、管理光照和阴影等。 5. 项目结构:根据...
7. **性能优化**:PV3D通过硬件加速和优化的渲染算法,使得在Flash环境中运行的3D应用能够保持流畅的帧率。 黄色星球项目可能涉及到的知识点包括3D模型的创建、纹理应用、光照设置、相机交互以及可能的物理模拟。...
这两个版本可能分别对应不同的解析策略或性能优化。它们负责读取DAE文件,提取顶点、法线、纹理坐标等信息,并将它们转化为PV3D可以理解的数据结构。 2. **Max3dsParser_v1**: 这个解析器专注于处理3DS Max导出的...
8. **性能优化**:由于3D图形处理可能会消耗大量计算资源,开发者需要考虑性能优化,如减少渲染对象的数量、使用LOD(级别细节)技术和预计算动画。 在压缩包中的文件"006"可能包含了实现这一效果的源代码、纹理...
6. **性能优化**:PV3D通过使用DisplayObject容器来组织3D对象,实现了高效的渲染和内存管理,确保了在Web环境中的流畅运行。 在【PV3D半中文化文档】中,读者可以期待学习到以下内容: - PV3D的基本概念和架构,...
5. **渲染优化**:PV3D提供了多线程渲染和硬件加速功能,源码中可能包含针对性能的优化策略。 6. **交互性**:实现用户与3D场景的互动,如点击、拖动等操作,可能会有相应的事件监听和处理机制。 7. **动画系统**:...