[MVC]ASP.NET MVC Performance Tips(1):RenderPartial

mikel阅读(933)

转载:http://www.cnblogs.com/Terrylee/archive/2009/05/08/ASPNET-MVC-Performance-Tips-Part1.html

背景

ASP.NET MVC中,HtmlHelper的扩展方法RenderPartial为我们使用UserControl带来了极大的方便,当我们指定一个 UserControl时,RenderPartial会在当前View文件夹下查找相应的UserControl,如果没有找到则会到Shared文件 夹下查找。然后在使用RenderPartial方法有一些性能方面的考虑,值得我们去关注。

设想有这样一个场景,一篇文章有很多个评论,在页面中我们需要呈现出一个评论列表,自然我们会定义一个评论的UserControl,如下代码所示:

Code 1:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Comment>" %>
<%@ Import Namespace="TerryLee.MvcPerformance01.Models" %>
<p>
ID: <%=Model.ID %> <br />
Author: <%=Model.Author %> <br />
Description: <%= Model.Description %>
</p>
<hr />

在页面中呈现评论列表,代码非常简单,仅仅是遍历所有的评论而已:

Code 2:

<div>
<%
     foreach (var comment in Model.Comments)
{
Html.RenderPartial("CommentsItem", comment);
}
%>
</div>

运行后效果如下,可以看到正确的输出了评论:

aspnetmvc_performance_tips_001 

性能优化1

然而当我们同时输出200条评论的时候, 却要花费大量的时间,用Stopwatch来测量一下会发现,输出200条评论花费的时间基本在210ms左右,也就是说平均每条评论的输出花费了 1ms。我们不妨看一下ASP.NET MVC的源代码,在WebFormViewEngine中当查找UserControl时,遵循如下查找模式:

Code 3:

public WebFormViewEngine() {
MasterLocationFormats = new[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
PartialViewLocationFormats = ViewLocationFormats;
}

所以如果我们在RenderPartial方法中,指定了UserControl的完全路径,是不是可以避免这个查找过程呢?修改Code 2代码如下所示:

Code 4:

<div>
<%
       foreach (var comment in Model.Comments)
{
Html.RenderPartial("~/Views/Shared/CommentsItem.ascx", comment);
}
%>
</div>

现在再测试一下会发现呈现200条评论的时间平均值保持在10ms左右,比前面的方式提升了近200ms。然而我们是否真的找到了解决问题的方 法?ASP.NET MVC难道不对查找的View路径进行缓存?带着这样的疑问,我们在ASP.NET MVC源代码VirtualPathProviderViewEngine的构造函数中,找到这样一段代码:

Code 5:

protected VirtualPathProviderViewEngine() {
if (HttpContext.Current == null || HttpContext.Current.IsDebuggingEnabled) {
ViewLocationCache = DefaultViewLocationCache.Null;
}
else {
ViewLocationCache = new DefaultViewLocationCache();
}
}

这里的判断说明如果启用了Debug模式,将会使用NullViewLocationCache,即不进行缓存,否则会使用DefaultViewLocationCache对View路径进行缓存。所以上面的测试结果都是基于Debug模式:

Code 6:

<compilation debug="true">

如果关闭了Debug模式,测试结果又该如何呢?使用下面代码关闭Debug模式:

Code 7:

<compilation debug="false">

再次进行测试,会发现使用Code 2代码呈现200条评论时,花费的时间平均值也是在10ms左右。所以在使用RenderPartial方法时,大可不必为了提升性能而指定 UserControl的完全路径,ASP.NET MVC已经为我们做好了这一切,我们要做的仅仅是在发布到生产环境时,别忘了关闭Debug模式!在本示例中,开启Debug和关闭Debug模式在一次调用时的性能差距如下图所示:

aspnetmvc_performance_tips_002 

性能优化2

现在回过头来看前面的代码,其实并没有做什么性能优化,仅仅时给大家提个醒而已。在Code 2中,我们的遍历代码放在了主页面中,即在每一次迭代中调用RenderPartial方法,尽管ASP.NET MVC在RenderPartial时,对于UserControl路径做了缓存,但是200次的调用仍然有不小的开销。如果我们的遍历代码放在 UserControl中,而在主页面中只进行一次调用RenderPartial方法,结果又将如何呢?修改UserControl为下代码所示:

Code 8:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<Comment>>" %>
<%@ Import Namespace="TerryLee.MvcPerformance01.Models" %>
<%
    foreach(Comment comment in Model)
{
%>
<p>
ID: <%= comment.ID%> <br />
Author: <%= comment.Author%> <br />
Description: <%= comment.Description%>
</p>
<%} %>
<hr />

这样在主页面中,只进行一次RenderPartial调用,如下代码所示:

<div>
<%
     Html.RenderPartial("CommentsItem", Model.Comments);
%>
</div>

此时再次测试,可以看到呈现200条评论所花费的时间不足1ms!为了直观期间,我们仍然使用图形表示如下:

aspnetmvc_performance_tips_003 

从上图中可以看到,通过在UserControl中进行遍历,减少RenderPartial方法调用,带来的性能提升还是非常可观的。

总结

本文主要讨论在ASP.NET MVC中使用RenderPartial方法时的一些性能问题,记住两点:一是在ASP.NET MVC应用程序发布到生产服务器时,别忘了关闭Debug模式(对于ASP.NET WebForm应用程序也是一样);二时尽可能的减少调用RenderPartial方法的次数,如通过在UserControl中进行遍历等方法。希望 对大家有用。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

[Flash]Flash实现文件上传

mikel阅读(883)

 

********************************************************************
*                                                 版权声明
*
* 本文以Creative Commons的知识共享署名-非商业性使用-相同方式共享发布,请严格遵循该授权协议。
* 本文首发于博客园, 此声明为本文章中不可或缺的一部分。
* 作者网名:    浪子
* 作者EMAILdayichen (at)163.com
* 作者BLOG:  Http://Www.Cnblogs.Com/Walkingboy
*
********************************************************************

[Flash FileUpload]用flash.net.FileReference实现无刷新文件上传

-Written by http://walkingboy.cnblogs.com/ (07-02-07)

摘要:

还在用UpdatePanel嘛?是否还为文件上传苦恼?

还在用Callback嘛?是否对文件上传无计可施?

还在用Ajax上传组件嘛?是否为其不稳定性而头疼不已?

兄弟忘了这些吧,让我们拾起古老的Flash,跟我一道将积蓄已久的无奈、郁闷踩于脚下……

一、楔子

一直都无法忘怀那段痴迷Flash的大学时代,从认识动画,到ActionScript,再到苦练鼠绘,所有付出的时间和睡眠都代表了我对 Flash的情有独钟,曾经一直都在幻想毕业后可以从事Flash编程工作。可能自己的先天美感不足或者运气不佳,最终还是远离了自己一直钟爱的 Flash。

时隔多年,Flash有了长足的发展,Flex更是呈现一片喜人的景象。

但是个人认为,如果Flash定位为富客户端,而不掺合服务端的推广,我相信现在的很多js类库将失去他们的市场。

喂,谁的臭袜子,稍微理解下我沉浸往事,不能自拔的心情嘛:)

二、上传难题

以前用UpdatePanel的时候,涉及到上传都只能在做一个小页面用Postback来做;

现在用Callback,还是只能使用新页面在Postback;

尝试过好几个Ajax 上传组件,最终败倒在其不稳定下。

昨天偶在codeproject查找资料,看到Flash 上传文件的介绍,才突然想起这个被自己遗忘在角落里的咚咚。

察看了下Flash 的API,发现FileReference和FileReferenceList对文件的上传支持已经相当的好了。 

事件摘要
事件        说明
 
onCancel = function(fileRef:FileReference) {}
当用户取消文件浏览对话框时调用。
 
onComplete = function(fileRef:FileReference) {}
当上载或下载操作成功完成时调用。
 
onHTTPError = function(fileRef:FileReference, httpError:Number) {}
当上载由于 HTTP 错误而失败时调用。
 
onIOError = function(fileRef:FileReference) {}
当发生输入/输出错误时调用。
 
onOpen = function(fileRef:FileReference) {}
当上载或下载操作开始时调用。
 
onProgress = function(fileRef:FileReference, bytesLoaded:Number, bytesTotal:Number) {}
在文件上载或下载操作期间定期调用。
 
onSecurityError = function(fileRef:FileReference, errorString:String) {}
当上载或下载由于安全错误而失败时调用。
 
onSelect = function(fileRef:FileReference) {}
当用户从文件浏览对话框选择要上载或下载的文件时调用。
 
 

基本上上传文件所需要的功能都有了。

三、SWF FileUpload

很久没有写ActionStcript,变得好生疏了,熟悉了一个下午才算缓过气来了。定下了这个上传组件的需求:

接受Handler:支持内嵌的HttpHandler处理和自定义的Aspx处理(提供传递参数)

进度条显示:计算总数和已上传数

提供结束JS事件:上传结束触发指定的js方法,并将文件名作为参数

花了一个晚上才写好这个swf,调用相当的简单 

     内嵌HttpHandler,不做任何处理的调用
         <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
                width="250" height="80" id="SWFFileUpload" align="middle">
                <param name="allowScriptAccess" value="sameDomain" />
                <param name="movie" value="SWFFileUpload.swf" />
                <param name="quality" value="high" />    
                <param name="FlashVars" value="CompletedFunction=OnCompleted">        
                <embed src="SWFFileUpload.swf" name="fileUpload1" align="middle" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
            </object>

 使用内置的HttpHandler,需要在WebConfig配置HttpHandler信息: 

<httpHandlers>
    <add verb="*" path="SWFFileUpload.axd" type="SWFFileUpload.SWFFileUpload" validate="false"/>
</httpHandlers>

 

 然后文件会默认被上传到root/UploadFiles/底下,文件名与客户端文件名同,同名则覆盖 

        指定HttpHandler,指定参数    
        <br />
             <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
                width="250" height="80" id="Object1" align="middle">
                <param name="allowScriptAccess" value="sameDomain" />
                <param name="movie" value="SWFFileUpload.swf" />
                <param name="quality" value="high" />
                <param name="wmode" value="transparent">
                <%--flash组件的参数传递:
                    UploadPage:自定义的ASPX文件接受Handler
                    Args:传递到UploadPage的参数,最终以QueryString的形式传递,以;分割
                    CompletedFunction:上传结束后调用的js方法
                    FileExtension:上传文件类型过滤,以;分割
                    --%>
                <param name="FlashVars" value="UploadPage=CustomerHandler.aspx&Args=name=cdy;blog=walkingboy.cnblogs.com&CompletedFunction=OnCompleted&FileExtension=*.jpg;*.txt">
                <embed src="SWFFileUpload.swf" name="fileUpload2" align="middle"
                    allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
            </object>

         如果文件大的话,需要在webconfig配置(Macromedia官方声称可以支持100M的上传) 

<httpRuntime maxRequestLength="1550000"/>

 

四、扩展&Demo

目前我只做了单文件的上传,可以利用FileReferenceList将其扩展为多文件上传。

如果你的IE打了最新的补丁,你可能发现出现“单击以激活并使用此控件”的问题,可以考虑封装一个js类,来动态Writer swf object,就可以搞定这个问题。 

function FileUpload(){
return{
     Show:function(){
    //TODO:
     },
     Hide:function(){
    //TODO:
     }
}
}();

DEMO代码下载:SWFFileUpload.WetTest.rar
有些朋友使用过程中出现问题,没办法得到真正的错误信息,现将flash的源代码fla上传,有问题的朋友自己测试下吧: SwfFileUpload.fla updated by langzi at 07.11.21 
 Update 07.12.19 原来上传的swffileupload.fla丢失了,重新上传。

[AR] ARToolKit 非官方安装指南(转载)

mikel阅读(1402)

安装并配置ARToolKit

  • 安装介绍
  • 编译toolkit
    • Windows
    • Linux/SGI Irix
    • Mac OS X
  • 运行例子和工具

安装介绍

ARToolKit的核心部分是一组可供应用程序调用的函数库。出于这个理 由,ARToolKit以源代码的方式发布。所以,你需要对它进行编译使之工作于你的平台。因此,你需要一个开发环境。开源开发环境(如GCC)可工作于 任何平台,你可以选择使用它来进行编译。当然,ARToolKit也支持在Microsoft Visual Studio中进行编译。

尽管ARToolKit为各种平台提供了类似的功能,安装方法却不尽相同。本文档的这个部分就是介绍如何在不同平台上安装并配置ARToolKit。

要安装并使用ARToolKit,你的机器、操作系统和平台必须满足基本要求。你的硬件必须 能获取视频流,并且CPU性能要足够好,以便同时进行图像的处理和显示。在软件方面需要满足一些(软件包的)依赖关系,否则会导致编译错误。主要的依赖关 系都是跨平台的(如OpenGL和GLUT),其他的依赖关系需要根据你自己的操作系统来满足(如DirectShow,V4L,QuickTime)

下面的部分将具体列出各操作系统中的依赖关系。

 

编译ToolKit

在Windows中编译

安装前的准备:

 需满足的软件包  安装指导
 开发环境  Microsoft Visual Studio 6和Microsoft Visual Studio .NET 2003都可以。也可以使用开源开发环境(例如Cygwin, http://www.cygwin.com/
DSVideoLib-0.0.8b-win32

在Win系统中,DSVideoLib是用来和摄像头驱动进行通信的包。ARToolKit 2.71需要使用DSVideoLib-0.0.8b或更新的版本。DSVideoLib的源代码和二进制包在ARToolKit downloads page on sourceforge可以下载到。

GLUT

确定GLUT运行包和SDK包都正确安装了。如果没有安装,可以在http://www.xmission.com/~nate/glut.html下载GLUT的二进制包。

在你的系统目录下(如c:\windows\system32)察看是否有glut32.dll,如果有,说明GLUT运行包已经被安装了。

在VC++的安装目录下(Include\gl\glut.h和Lib\glut32.lib)察看glut.h与glut32.lib是否存在。如果存在,说明GLUT SDK已经被安装了。

DirectX Runtime

Windows XP下是默认安装DirectX运行期包的。如果没有,请在microsoft网站下在安装DirectX 9.0b或更新版本的运行期包。

视频采集设备

安装摄像头和相关驱动。确保你的摄像头有VFW驱动或WDM驱动。确认方法是运行amcap.exe(这个程序在DirectX SDK中,Samples\C++\DirectShow\Bin目录下)。从Devices中可以察看到设备的状态(见下图)。

(可选项,用于VRML渲染) OpenVRML-0.14.3-win32

OpenVRML的源代码和二进制包可以在ARToolKit downloads page on sourceforge下载

编译ARToolKit:

按照以下步骤编译ARToolKit. Build:

1。将ARToolKit.zip解压到任一的目录下。为叙述方便,后面用{ARToolKit}代替该目录。

2。把DSVideoLib.zip也解压到{ARToolKit}。确保解压后的文件在名为“DSVL”的目录下。

3。把{ARToolKit}\DSVL\bin下的DSVL.dll和DSVLd.dll拷贝到{ARToolKit}\bin下。

4。把GLUT DLL拷贝到\Windows\System32\目录下,把GLUT SDK的.h和.lib文件放到VStudio的相应目录下(参考前表)

5。运行脚本{ARToolKit}\Configure.win32.bat,自动建立include/AR/config.h。

6。打开ARToolKit.sln(如果开发环境是VS.NET)或者ARToolkit.dsw(VS6的情况)。

7。编译toolkit.。

VRML渲染库和例子根据需要进行编译(libARvrml 和 simpleVRML)。步骤如下:

1。把OpenVRML.zip解压到{ARToolKit}。

2。把js32.dll从{ARToolKit}\OpenVRML\bin中拷贝到{ARToolKit}\bin。

3。在 VS配置管理器(configuration manager)中激活libARvrml和simpleVRML项目,然后编译。

 

运行例子和工具

当前的ARToolKit发布版本并没有要求把ARToolKit安装在特定的位置。在你编译自己的应用程序的时候,应该保证能找到ARToolKit。如果把ARToolKit编译为静态库,它将会被连接到所有你编译的程序中去。

为了使用ARToolKit,你需要有做一些“标志物”:例子程序使用的标志物放在 patterns目录下。你可以用把它打印出来。这些标志对你以后的开发也是有用的。ARToolKit需要一个不易形变的标志物,所以简单的做法是把标 志物粘在硬卡片上。然后,使用/bin目录下的graphicsTest来测试ARToolKit的图形部分是否正常工作。如果工作正常的话,应该显示一 个旋转的茶壶。

这个测试用来测试你的摄像头对ARToolKit的的图形模块的支持。图形模块使用了OpenGL。最小的允许幀率是15fps。低于这个数值会明显的限制ARToolKit渲染模块的正常工作(参考FAQ)。除此之外,还需要测试视频熟如是否正常、视频是否能显示。在/bin目录下的videoTest可以完成上述测试。如果没有错误的话,应该出现一个视频窗口,显示出摄像头采集的内容。这个测试用来测试你的摄像头对ARToolKit视频模块和图形模块的支持。

如果没有显示,可能是你的摄像头没有正确配置导致其不能正常工作(参考FAQ

第一个例子

  • 介绍
  • 运行ARToolKit
  • simpleTest的输出

介绍
当ARToolKit正常安装后,在/bin目录下有一个叫simpleTest(或simple,根据版本的不同名字有不同)的 程序可以展示ARToolKit的功能。不过你还需要把hiroPatt.pdf中的标志物打印出来。为了获得更好的效果,推荐把它粘在一个平的硬卡片 上。

在任何情况下,这个程序的输出都是一样的。所以本章的最后一个部分给出了程序在不同平台上的输出。

运行ARToolKit

运行方法,目前只有两种:一种是直接单/双击;一种是在控制台里运行。后一种要更好,因为从命令行启动会给出ARToolKit的错误和标准输出流信息(对ARToolKit来说很有用)。每个平台都提供了一个对话框用来在运行主AR循环之前设置视频。

Windows
双击simple.exe,会打开一个控制台窗口,当摄像头被检测出来后,会显示如下所示的对话框。也可以从“开始->程序->附件->命令行窗口”(winxp中文版)里运行simple.exe。

 

 

在这个对话框中,你可以设置视频输出的尺寸和格式。需要注意的是,最好使用与ARToolKit定位相同的格式,这样会会一些(RGB)。某些摄像头还允许你改变帧率。默认情况下,该对话框的设置与你先前视频输入的设置相同。此设置可能会引起一些问题(参考FAQ)。
Linux

如果你安装了gnome或KDE桌面环境,也可以直接双击运行simpleTest(不过这样运行看不到错误和输出流信息)。也可以在终端中运行它。如果你安装的是V4L,会显示如下的对话框。

在这个对话框中,你可以设置视频输出的尺寸和格式。需要注意的是,最好使用与ARToolKit定位相同的格式,这样会会一些(RGB)。某些摄像头还允许你改变帧率。默认情况下,该对话框的设置与你先前视频输入的设置相同。此设置可能会引起一些问题(参考FAQ).

MacOS

On MacOS X double click on the simple icon in the bin directory from your mac explorer. A console window will open and when the camera is detected the follow dialog will open. Otherwise start the Terminal program, go the bin directory and run simple.

The default Mac video dialog is really advanced so you can change a lot of elements, like video input, format or setup the video parameters (saturation, brightness). Furthermore, a preview window is displayed that help for the configuration. You need to notice that better the format is similar to ARToolKit tracking format, faster is the acquisition (RGB more efficient).
SGI

On SGI you need to use a terminal, go to the bin directory, and run simple.

simpleTest的输出

如果成功了,会显示一个视频窗口(如果遇到什么问题,可以参考FAQmailing list)。当你把摄像头对准标志物的时候(内部印有“hiro”的黑框),在视频窗口里,会看到有一个蓝色的方块出现在标志物上。 下图是运行的截图。当移动标志物的时候,虚拟图像(蓝色方块)会随标志物一起移动。

为了让虚拟物体显示在标志物上,必须能在视频中看到完整的黑框 和黑框中的图形。如果看不到虚拟物体,或者它时隐时现,可能是照明的问题。这个问题可以通过修改图像处理历程的阈值来解决。键入“t”,会提示你输入新的 阈值。阈值的取值范围为0~255,默认值是100。键入“d”会显示在主窗口下显示阈值图像(如下图)。在阈值图像中,会用红框把可能的定位区域标出 来。这样将便于你检查光照和阈值的设置是否合适。
键入“esc”退出程序并打印幀率信息。

[AR]完整版Flash Augmented Reality(增强现实)

mikel阅读(990)

Flash Augmented Reality

by shine on Jan.12, 2009, under ActionScript, 交互技术研究


Papervision – Augmented Reality (extended) from Boffswana on Vimeo.
大家对于VR都很熟悉,今天来讲讲AR···

AR全称为Augmented Reality(增强现实), 也被称之为混合现实。它通过电脑技术,将虚拟的信息应用到真实世界,真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。增强现实提供了在一 般情况下,不同于人类可以感知的信息。它不仅展现了真实世界的信息,而且将虚拟的信息同时显示出来,两种信息相互补充、叠加。在视觉化的增强现实中,用户 利用头盔显示器,把真实世界与电脑图形多重合成在一起,便可以看到真实的世界围绕着它。

增强现实借助计算机图形技术和可视化技术产生现实环境中不存在的虚拟对象,并通过传感技术将虚 拟对象准确“放置”在真实环境中,借助显示设备将虚拟对象与真实环境融为一体,并呈现给使用者一个感官效果真实的新环境。因此增强现实系统具有虚实结合、 实时交互、三维注册的新特点。

该技术在众多领域都有令人啧啧称奇的表现和体验感,而今天介绍的这个案例则是由AS3+WEBCAM完成的。

原地址:http://www.boffswana.com/news/

体验步骤:

1.下载并打印 这个PDF

2.确认您的摄像头已正确链接主机。

3.打开这个FLASH,等待加载完成,点击START开始体验。

将打印好的PDF放在摄像头前,如果步骤一切顺利的话您可以获得和文章开头视频中一样的效果。

点击此处下载源码

简单的来说就是通过摄像头实时分析视讯数据,解析中画面中的mark(就是制订好的那个二维码),比较分析得出二维码的方向,斜率,大小等数据,然 后通过视觉表现将该数据体现出来(视频中的怪兽就是用PV3D做的,你可以用其他的任何表现形式)。通过视频和FLASH DEMO,我们可以看到实时效率,多mark识别还尚待解决,目前还难以将此技术应用到FLASH项目的实际开发中。不过这种新型的人机交互形式还是让人 大呼过瘾。

你可以点击以下地址,了解一下该技术的应用领域

http://www.youtube.com/results?search_query=Augmented+Reality&search_type=&aq=f

http://www.designboom.com/weblog/cat/8/view/4912/augmented-reality-geisha.html

上面这跨快时代的宅男产品现提供破解版的下载地址

http://qiyeji.1stfreehosting.com/simple/index.php?t88.html

本人已经下载并且亲手制作以上道具,实际体验了一下,相当有意思。

实时运行的画面,我的显示器,我的桌面,我的钱包,我的小扑(当成摄像头垫子的那个)

这是我亲手制作的道具

[FlARToolKit]使用Flash实现增强现实

mikel阅读(865)

使用Flash实现增强现实

作者 Jon Rose译者 张龙

最近随着FLARToolKit的发布,增强现实(augmented reality)成为Flash社区的一个时髦词,它能将真实世界的对象与计算机生成的对象混合在一起。

Bartek Drozdz在其博客上科普了增强现实这个概念:

增强现实使用模式识别在视频上渲染3D图形。模式(又叫做标记)是一个矩形,你用其在相机前打印和定位。来自相机的流经过分析后由标记生成其捕获世界的坐标系统,接下来将该坐标系统发送到3D引擎,由后者在视频图像上渲染对象。

Duane Nickull在其博客上高度评价了FLARToolKit:

FLARToolKit是ARToolKit的AS3版本。ARToolKit是个可以创建增强现实的C程序库,然而兼容于Adobe Flash/Flex/AIR的FLARToolKit并不仅仅只是对之前C版本的移植。FLARToolKit是从Java版本移植过来的,其名称叫做NyARToolKit(经过nyatla的艰苦努力之后,现在NyARToolKit的执行速度要比原始的C版本快)。

构建基于浏览器应用的能力(包括增强现实)可以提高开发者对软件的认识。为了让开发者尽快上手,Adobe布道者Lee Brimelow发布了一个视频教程,其中包括GE的智能网格增强现实应用的示例。该示例在真实应用中使用了增强现实的叫声因子(wow factor),是绝佳的学习资源。

请阅读维基百科关于增强现实的说明来进一步了解其背景信息。 查看英文原文:Augmented Reality with Flash

[SWF]一个名字叫“Spark project”的超级强大的AS3库

mikel阅读(873)

这是一个超级大的项目工程,叫“Spark project”。在里面,你会找到不少实用的AS3类库,例如 swfassist ,一个解析SWF文件的库,支持Flash player 9,可以用as动态生成swf文件;又例如BMPDecoder、ICODecoder、PSDParser,从名字可以看出分别是用来解析bmp文件、 ico文件以及psd文件(没错,就是PhotoShop的源文件格式 PSD !);也有 AS3D 库,用来处理 3D 的;还有 SQLControls ,可以在AIR里方便操作SQLite数据库;还有很多很多…… 总体来说,包含以下这些相关:

  • 图形/颜色处理
  • 显示对象处理
  • 3D
  • 图像处理
  • 音频处理
  • 通信处理
  • 数学运算
  • 物理现象
  • 游戏算法
  • 时间日期处理
  • Flash Player/系统
  • 调试/测试
  • 二进制文件处理(bmp、ico、psd等等)
  • 其它…

        该项目是日本人做的,幸好有英文版本的页面。要学会用应该也需要一段时间了,想要研究他们的源代码,想必不是一件快乐事 🙂

项目首页http://www.libspark.org/
一堆AS3类库的英文版页面http://www.libspark.org/wiki/WikiStart/en

[Google]调试学习Google AJAX APs好去处

mikel阅读(833)

转载;http://www.xuewolf.com/?p=104
Google AJAX APIs Playground

Google AJAX APIs Playground

 

 

 

 

 

 

 

 

 

给调试和学习google api的朋友(绝大多数应该是地图类api吧!)一个调试和学习google api的好去处 — — Google AJAX APIs Playground.

本周一,Google发布了他的第二个版本。(看来老外清明节没有放三天假!)Google依然在跟我们搞笑,该工具在google自家的浏览器上无法正常使用。

这个版本加入了几个新特性:

1.支持断点。

2.用Firebug Lite做调试工具。

3.代码编辑框显示行号了。

4.可以直接编辑示例的HTML了。

[JQuery]JGTranslation:基于GOOGLE AJAX API的jQuery

mikel阅读(794)

转载:http://www.evlook.com/?p=126

平常上网遇见不懂单词和句子的时候,都喜欢用翻译软件来翻译一下,一般都用有道和google。这几天看google API的时候发现他好像早就提供了翻译的方法,不过好像没什么人用 :( 那我来用,呵呵。

写了个JQuery的小插件,结合google ajax API,提供页面文字的即时翻译功能,只要你指定要使用即时翻译的模块ID并指定翻译语言(如果不指定就按照操作系统默认语言进行翻译。)就能简单调用,非常方便。

如果你的blog是中文但是很多国外访问者那你可以用了试试,如果你的是英文blog,但是很多用中文的用户访问,你也可以使用。总之都是为了大家提供便利,呵呵。

可以选择下面的两段文字看看效果

曲曲折折的荷塘上面,弥望的是田田的叶子。叶子出水很高,像亭亭的舞女的裙。层层的叶子中间,零星地点缀着些白花,有袅娜地开着的,有羞涩地打着朵儿的; 正如一粒粒的明珠,又如碧天里的星星,又如刚出浴的美人。微风过处,送来缕缕清香,仿佛远处高楼上渺茫的歌声似的。这时候叶子与花也有一丝的颤动,像闪电 一般,霎时传过荷塘的那边去了。叶子本是肩并肩密密地挨着,这便宛然有了一道凝碧的波痕。叶子底下是脉脉的流水,遮住了,不能见一些颜色;而叶子却更见风 致了
Now that I’ve lost everything to you,
you say you want to start something new,
and it’s breaking my heart you’re leaving,
baby I’m grieving.
But if you wanna leave take good care,
hope you have a lot of nice things to wear,
but then a lot of nice things turn bad out there.

一、你必须引用google提供的API

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("language", "1");
</script>

二、翻译控件用到的默认样式

.JGTranslationPopStyle{font : normal normal normal 12px Verdana, Arial, Helvetica, sans-serif;border:2px solid #C5D7EF;background:#fff;}
.JGTranslationPopStyle p{padding:3px;margin:0px;line-height:150%;}
.JGTranslationPopStyle div{text-align:right;background:#E5ECF9;}

三、调用方法

$(selector).JGTranslation(options)
//可选参数
//Language:string(default = "userLanguage")
//PopStyle: string(default = "JGTranslationPopStyle")
//Branding:boolean(default = true)

示例:

<div id="TS1">
曲曲折折的荷塘上面,弥望的是田田的叶子。叶子出水很高,像亭亭的舞女的裙。层层的叶子中间,零星地点缀着些白花,有袅娜地开着的,有羞涩地打着朵儿的;正如一粒粒的明珠,又如碧天里的星星,又如刚出浴的美人。微风过处,送来缕缕清香,仿佛远处高楼上渺茫的歌声似的。这时候叶子与花也有一丝的颤动,像闪电一般,霎时传过荷塘的那边去了。叶子本是肩并肩密密地挨着,这便宛然有了一道凝碧的波痕。叶子底下是脉脉的流水,遮住了,不能见一些颜色;而叶子却更见风致了
</div>
<div id="TS2">
Now that I've lost everything to you,
you say you want to start something new,
and it's breaking my heart you're leaving,
baby I'm grieving.
But if you wanna leave take good care,
hope you have a lot of nice things to wear,
but then a lot of nice things turn bad out there.
</div>
$('#TS1').JGTranslation({Language:'en'})
$('#TS2').JGTranslation()


点击下载jquery.JGTranslation.js

[开发技巧]VS2008快捷键大全

mikel阅读(710)

Ctrl+m+Crtr+o折叠所有大纲
Ctrl+M+Crtr+P: 停止大纲显示
Ctrl+K+Crtr+C: 注释选定内容
Ctrl+K+Crtr+U: 取消选定注释内容
Ctrl+J : 列出成员 智能感知
Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写
代码快捷键
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息
Ctrl+E,U / Ctrl+K,U: 取消选定注释内容
Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码
F12: 转到所调用过程或变量的定义
窗口快捷键
Ctrl+W,W: 浏览器窗口
Ctrl+W,S: 解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
trl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲
Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口
Ctrl+Tab: 活动窗体切换
Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项
Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写