作者 主题: Andrew Bell 回答#Cinder#和#openFrameworks#的区别[已翻译]  (阅读 8897 次)

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Andrew Bell 回答#Cinder#和#openFrameworks#的区别[已翻译]
« 于: 八月 20, 2012, 01:17:39 下午 »
vinjn 注:此文发于 2010 年 4 月,彼时,Cinder 刚从 TBG (The Barbarian Group) 的私有代码转为开源,
还没有为 Creative Coder 所熟知。而 Andrew Bell 则是 TBG 公司的 Cinder 项目主架构师。
以下为正文:



这是个美好的时代,人们开始使用代码做艺术。Processing 和 OpenFrameworks 已经不只是工具,它们成为了哲学和生活方式。
它们是免费开源的,同时拥有轻量级的语法,不同的代码库整合在一起使得多媒体“可以使用”,
艺术家不再局限于“修修补补”,而是开始创作奇妙的作品,快速高效地表达想法。

我仔细研究过 OF 一阵子,毋庸置疑它背后有很多天才。OF的许多核心社区成员与我们都是朋友。
他们将 C++ 作为创意编码的工具带给更广大的人民群众,我们表示以十万分的尊敬。
他们的工作也创建了令 Processing 社区感到熟悉的编程方式。

很明显的 OF 与 Cinder 是有重叠的,首先它们都是创意编码的 C++ 库,在特性方面也有很多交集。
我们支持几乎相同的平台,尽管 OF 支持了更古老的 Mac OS X 以及 Linux。然而,
如果你查看两者实现相同功能的代码,那么你会发现本质上截然不同的设计哲学。

不妨以这两个库处理一件日常任务来做说明,比如载入一副图像到 OpenGL 贴图中。
先从 OF 开始,涉及的是 ofImage 类的 loadImage()。
OF 使用 FreeImage 库,这是一个开源库,支持载入 30 多种图像格式,非常可怕的数量。
因此在 OF 中,如果你想在 Mac 上载入一副图像,作为用户你会这么说,“嗨,我需要你打开whatever.png”。
然后 OF 请求 FreeImage 去载入文件,后者会做些判断然后决定请求 libpng(它被包含在 FreeImage 中)来进行处理,
现在轮到 libpng 进行思考并请求操作系统进行磁盘读写,最终你以像素集合的方式得到该 PNG。

但是事实上 Mac OS X (以及 Windows 和 iPhone OS) 本身就知道如何处理大多数我们需要的文件格式。
Cinder 会自动借助这些平台自带的功能。
因此在 Cinder 中,你调用 loadImage()函数(函数名相同)时,它知道如何让操作系统直接载入一个文件。
这意味着当操作系统升级、修复 bug 或安全升级时,或者能够处理新的文件格式时,所有的 Cinder 应用都能自动获益。
这也意味着 Cinder 应用可以更轻量级,因为我们不需要发布一堆依赖库或是一堆用于读取罕见格式的无用代码。
 Cinder 被设计为不需要使用额外库来读取罕见的文件格式,但是你可以集成它作为头等公民,不必修改 Cinder 本身。
载入机制运行外部代码无缝衔接至 loadImage() 等函数。类似这样的设计使得 Cinder 能够拥有难以置信的强大插件。

回到载入图像的例子,其实 ofImage 既包含基于内存的图像,也包含一个可选的 OpenGL 贴图(它的内容存储在显卡中)。
在 Cinder 中,我们使用 loadImage() 的结果来创建一个 gl::Texture,因此代码如下:
程序代码
gl::Texture myTexture( loadImage( "whatever.png" ) );

优点在于,loadImage() 以及 gl::Texture 的构造函数知道如何根据文件内容挑选出最优的表现方式,而不需要额外的中间内存。
因此 Cinder 能够自动实现一些非常聪明的事情。例如,如果你的 PNG 恰巧有 16位 的数据(例如,它是法向贴图/normal map),
那么 gl::Texture 会创建一个合适的 OpenGL 贴图格式以保留重要数据。可以应用于浮点数的 高动态范围/HDR 图像,也可以用于灰度图像。
loadImage()也了解图像的 alpha 值是否预乘过。其中一些特性只对高级应用才有意义,
因此即便 OF 缺少它们对于它的用户而言也不会产生极大的困扰。

但是初学者应该知道在 Cinder 中,这些事情是会自动发生的,没有额外的开销。

继续讨论图像 I/O 的问题,如果你拥有图像的 URL,需要通过网络载入它,那么在 Cinder 中也能轻松实现:
gl::Texture myTexture( loadImage( loadUrl( "http://libcinder.org/whatever.png" ) ) );

非常简单,代码样式也始终如一,所有之前介绍的便利之处都可以应用到来自网络的图像中。回到先前讨论的设计哲学中,
合适的异常、命名空间、现代的内存管理技术如 shared_ptr 等等,不只是有经验的 C++ 用户期望看到的,
事实上它们也让初学者的 C++ 之路更美好了一些。不得不承认,要让 C++ 新手开始学习 Cinder 会比较困难,
但是我们自己的经验表示搞这行业的人智商没问题,他们能很快适应。

需要提醒的是,我们才发布第一个版本,而 OF 已经出来很久了。很多理念是细微的,它们不会出现在网站的特性列表中,
另一些需要第一手的经验才能感受。坦白说,我们的路还很长。Cinder 的未来会很美好!!!

via CDM
« 最后编辑时间: 四月 17, 2013, 02:53:39 下午 作者 vinjn »

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Re: Andrew Bell 回答#Cinder#和#openFrameworks#的区别[已翻译]
« 回复 #1 于: 十一月 20, 2012, 02:25:50 下午 »
翻译完成

Tags: