奥斯汀项目第1部分(共6部分):简介

我的名字是豪尔赫佩雷拉,我是微软的开发人员。  在过去的几个月里,我一直在研究Windows 8应用程序以及VisualC++团队中的一个小开发团队。 我们称之为项目代号奥斯汀。

null

Austin是一款适用于Windows8的数字笔记应用程序。你可以在笔记本上添加、删除或移动页面。你可以用数码墨水在那些纸上写字或画画。您可以从计算机、SkyDrive或直接从计算机的相机添加照片。您可以将创建的笔记共享到其他Windows 8应用程序,如电子邮件或SkyDrive。

当我们坐下来创建它的时候,我们想建立一个非常简单的数字替代品,来代替人们在工作会议、学校、家里到处乱涂乱画和快速记笔记时随身携带的纸质笔记本。

这个应用程序的另一个非常重要的目标是展示本地平台和C++的功能,以及VisualStudio 2012中的一些新特性,如 自动代码矢量化 C++ AMP .  Austin的目标是用真实的代码演示我们最新的本地工具在Windows8平台上构建的设备优化、流畅和响应迅速的用户体验。

因此,我们在 可在此处下载源代码 .  我们还计划在Visual C++团队博客中发表一系列博客文章。 我们的经验,以及我们使用的一些技术。

奥斯汀并不希望成为OneNote这样功能齐全的笔记应用程序。它没有给你一种方式来组织你的笔记,除了他们在书中的位置,它也不支持打字或搜索。这些都是有意识的决定。我们相信一支笔和一张纸的简单美,这就是我们试图用它来重现的。  奥斯汀应用程序的很多灵感和代码都来自一个早期的项目,代号为Courier。

我用奥斯汀已经有一段时间了。例如,我在花园的一个角落拍了张照片,然后在上面画了一个我计划建造的菜园盒子。我用它来制作购物清单,写烹饪食谱,并在制作时拍照。有时,我发现画一些东西并发邮件比打一堆文本更容易。我也用它来写我的想法,当我编码。

仅仅一支笔和一张纸本身就有多大的用处,真是令人惊讶。但是,当你把这个概念带到计算机领域,并将其扩展到像添加照片和当场注释这样的事情,并以数字方式共享你所创建的内容时,那么可能性就无穷无尽了。

这是我在整理我的想法时写的一页笔记,然后我重写了一些奥斯汀项目的相机代码:

图片[1]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库

这是我菜园的草图:

图片[2]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库 但一段视频胜过一千张素描!我们把这些放在一起介绍奥斯汀:

(您可以使用下载mp4格式的视频 此链接 )

我们为什么建造它

我们建立奥斯汀有两个主要目标。首先,我们想建立一个功能齐全的真实世界的应用程序,实际上是有用的和高质量的。第二,我们想 演示C++和Windows 8平台的功能,并展示我们团队在VisualStudio 2012中提供的一些新技术,如 C++ AMP 自动代码矢量化 . 我们想用DirectX来创建一个身临其境的 用户界面,构建为一个三维场景,带有灯光、阴影和照相机,以便可以从不同角度查看页面。

一点历史帮助你了解奥斯汀计划的起源…

C++

当我开始研究奥斯丁时,我在7年内没有编写C++代码,因为我主要是用C语言编写代码。因为奥斯汀计划的目标之一就是展示如何写作 “现代”C++ 我花了不少时间阅读了一些经典的和更新的C++书籍,试图了解一个关于“现代”C++代码是什么的写作。我拿出我那本从学校起就放在书架上的书。)我也得到了来自团队中的一些专家的极大帮助,毕竟,有一些明显的优势被一群构建VisualC++编译器的人所包围。其结果是我们在整个代码中使用了一组编码准则和样式。

对于字符串、集合和智能指针,我们广泛使用C++标准库。我们在代码中几乎没有任何“裸露”的C++指针;相反,我们使用智能指针类型,例如 标准::共享u ptr 微软::WRL::ComPtr . 我们使用 RAII模式 一般来说,我们不检查HRESULTs,而是使用异常处理大多数错误。在创建或销毁对象时,我们不会显式地调用new或delete。我们的编码惯例是受 BOOST库 .

当然,我确信我们做了很多愚蠢的事情,或者我们可以做得更好或不同的事情,但是我们团队中的所有人都对代码的编写方式和我们的工作效率感到非常满意。尽管是C++团队的一部分,但我绝不是C++专家,所以这个源代码不是用来规定在C++中做事情的规范方式。它们确实代表了我们在用最适合我们的方式使用语言方面的努力,在这方面,这是一个巨大的成功。

建筑

Austin的代码是由一个库(代号为“baja”)中的常见函数组成的,它的设计灵感来自于现代的模块化设计原则。  这个库一开始是一个基本的工具箱,其中包含诸如调用堆栈遍历、跟踪和断言之类的工具。后来,它提供了一个图形引擎、一个数学库、存储器,并围绕底层操作系统提供输入和主应用程序循环等功能。

奥斯汀的 代码和库 正在进行工作。它是由一个团队构建一个真正的应用程序而成的工具箱,有它所有的缺陷和缺点。它不是一个“官方”的微软图书馆。我们将在没有任何保证或承诺的情况下分发此代码,使用此代码的风险由您自己承担!我们可能会不断改进它,添加或更改功能。

技术

奥斯丁主要是用C++构建的,我们使用了大量的STL和一些Boost。我们还使用C++和CX与Windows运行时和XAML进行交互,以显示一些用户界面元素。  下面列出了我们认为奥斯汀最有趣的部分。  在接下来的几周里,我们将发布更多关于这些的详细文章。

三维图形和用户界面

我们的图形引擎是建立在DirectX上的。图形引擎为我们提供了一个简单的场景图、摄影机、灯光、一个非常简单的“效果”库,其中包含一些基本的着色器、材质、字体和一些简单的几何体。总的来说,它对应用程序的其余部分隐藏了很多DirectX较低级别的复杂性。

这张照片显示了奥斯汀的一页,从不同的视角拍摄。  它显示“视口”(蓝色矩形)、参考栅格、光源和坐标原点。

图片[3]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库

如上所述,Austin与XAML集成,我们使用XAML来显示用户界面的一部分,如菜单弹出、按钮等。  它使用 交换链背景面板 渲染我们的3D场景,包括笔记本的页面、照片、笔画和背景。我们将XAML用于设置菜单、应用程序栏和用户界面的其余部分。

保管部

我们 使用可扩展存储引擎(ESE)作为我们的存储引擎。ESE是一个相当低级的存储引擎,您可以在其中操作表和索引,而不是使用更高级的SQL语句。ESE在许多Microsoft产品中用作存储引擎。  我们发现它超级快速高效,而且它包含在Windows8中。

墨水

我们使用了一种自制的方法来显示数字墨水,因为我们想在3D页面上绘制墨水,我们想对它进行绝对控制,这样我们最终可以做一些事情,比如把墨水滴到纸上,并根据纸的纹理改变它的光照。  ink的最初实现使用了一个几何体着色器来生成网格,但是当逻辑对于我有限的HLSL编码技能来说有点太复杂时,我们最终将代码移到了CPU上。因此,当前,网格在CPU中生成,然后顶点缓冲区被发送到GPU,以便使用像素着色器进行渲染。

此图显示了我们的第一个(基于几何体着色器的)墨迹实现。请注意形成墨迹笔划的网格:

图片[4]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库

油墨平滑

奥斯汀的另一个有趣的特点是它的墨水平滑。当用户在屏幕上移动手写笔、手指或鼠标指针时,就会捕捉到点、压力和速度,并最终进入我们的应用程序。我们使用这些点来生成形成墨迹笔划的网格。但是,如果用户移动手写笔的速度非常快,这些点之间的距离可能会很明显,并且墨迹笔划显示的笔直部分使其看起来不是很好。在本例中,您可以看到差异,尤其是在笔划的锐角处。这很微妙,但也有区别。  这段代码也被矢量化,以获得额外的性能提升。

图片[5]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库

导航和可扩展性

我们想给Austin的另一个重要功能是能够以快速和可扩展的方式浏览笔记本的许多页面。我们投入了大量的精力,使用 并行模式库 (PPL),生成页面缩略图纹理,缓存一些视图数据,并使用DirectX延迟呈现来避免中断UI线程和造成不和谐的输入体验。

纸上模拟

奥斯汀提供了几种浏览网页的方法。您可以在3行网格或单行列表中查看它们,也可以将它们“堆叠”在一起查看。在第三种模式中,当您在屏幕上滑动时,页面会像实际的物理页面一样进行反应和翻转。把这页卷曲的权利也是一个有趣的工作。我们开始用一个物理引擎来模拟这张纸,但结果看起来太像布料了。最后,我们编写了一些受[1]启发的代码,该代码将纸张包裹在一个“虚拟”的、不可见的圆锥体上,当用户在屏幕上滑动手指时,圆锥体的形状会发生变化。这个简单得多的方法的结果看起来很棒。 此图显示了页面卷曲时的外观:

图片[6]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库

C++ AMP

当纸网格变形时,需要计算其顶点的法向量,以便正确地应用着色。我们曾经 C++ AMP 编写在CPU和GPU上运行的代码(当兼容GPU不可用时,经纱或基准装置运行C++ AMP代码。性能提升非常棒。我们计划用C++ AMP重写奥斯丁的更多部分。

阴影和后期处理效果

奥斯汀最后一个有趣的部分是它渲染阴影的方式。 我不是一个很好的老师 有 经验 因此,我不得不投入大量的精力,使这个看起来很好,同时有一个良好的性能。页面将阴影投射到背景上,然后我们在GPU中应用一些后处理过滤器,使事情变得更加有趣。结果看起来很棒,而且速度非常快。

这张照片显示了奥斯汀的几页,在背景上投射阴影。  有一个高斯模糊过滤器应用于阴影,以及一个径向暗过滤器对整个背景,使它更深入。

图片[7]-奥斯汀项目第1部分(共6部分):简介-yiteyi-C++库 现在就这些!我们将写更多关于奥斯汀和巴哈计划,因为我们想与大家分享我们的经验,建立这个应用程序。

工具书类

[1] L。香港,S.K.卡,  和J。陈先生,   “翻页3D电子图书”,正在进行中。3DUI,2006年,第159-165页。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享