Ecere SDK:用于 GUI 和图形的跨平台工具包

了解 Ecere 软件开发工具包 20 年的历史,该工具包现在为 GNOSIS GIS 地图软件提供支持。
752 位读者喜欢这篇文章。
Pixelated globe

Geralt。CC0。

1997 年夏天,我是一个狂热的游戏玩家,沉迷于定义那些类型的实时战略 (RTS) 和沉浸式 3D/沙盒角色扮演游戏的黄金经典之作。在浪费了许多小时玩游戏后,我想做一些更有建设性的事情。我梦想着构建自己的视频游戏。

前一年,我为一个名为 3D Coding BlackHole 的教程系列创建了一个基本的纹理映射、软件渲染 3D 引擎。我正在开发一个流行的 RTS 游戏的克隆版本——作为一种学习经验,也是构建一个有潜在贡献者的新游戏的垫脚石。

我也是 Linux 爱好者,但 Linux 游戏几乎不存在。DOS 仍然是游戏平台的首选,它具有 32 位扩展,可以让您访问更多内存,以及 VESA 扩展,可以为您提供 SuperVGA 图形。随着 DirectX 的引入,Windows 开始接管游戏领域。

我产生了一个疯狂的想法,开始一项终生追求,构建理想的 SDK,它可以让您编写一个可以在所有这些平台上运行的游戏,而无需为每个平台编写特定的代码。今天,跨平台开发的优势显而易见,并且有许多工具包可用,但在 20 年前,它们很少而且受到限制。

我深信“一次编写,到处运行”将成为未来编写代码的方式,所以我卷起袖子,开始同时为三个不同的游戏平台编写代码。我采用了我的 3D 图形引擎(在 DOS 中运行)和 RTS 游戏克隆代码库的两个版本(一个在 DOS 下使用 SuperVGA 运行,另一个在 Windows 下通过 DirectX 运行),并将所有这些代码库在一个漂亮的抽象层后面重新组织,同时还添加了对 Linux 的支持。Ecere SDK 由此诞生。

Ecere games

opensource.com

2D 和 3D 图形

由于该工具包的目标是游戏开发,因此最初的重点是 2D 和 3D 图形。随着图形处理单元 (GPU) 开始出现,我们开始支持硬件加速图形,最初是通过 Glide API,最终通过 OpenGLDirect3D

Ecere SDK 的显示驱动程序系统允许用户选择使用哪个 API 来渲染图形,同时保持相同的应用程序代码。当前的 2D 图形引擎很简单,支持所有基本需求,例如选择分辨率、切换全屏模式、加载和保存图像、位图操作、生成线条和框以及国际文本输出。它还允许用户在应用程序运行时更改模式或驱动程序,从而更轻松地管理必须以不同方式重新加载的资源(例如图像和字体)。我们目前正在为未来的版本开发更高级的矢量图形功能。

Ecere rendering

opensource.com

3D 图形引擎可以导入和渲染来自 3DS 模型的大多数功能,并且还支持其动画格式。我们目前正在开发对协同设计活动 (COLLADA) 和 GL 传输格式 (glTF) 的支持。

该引擎提供了一个 API,用于组装自定义网格、创建分层对象、应用具有丰富属性的纹理和着色材质以及使用动画相机。OpenGL 后端支持传统的 OpenGL 以及现代基于着色器的 OpenGL,提供了一个 API 以轻松插入自定义着色器,并且应用程序也可以使用 OpenGL ES 部署在移动平台上,或使用 WebGL 部署在 Web 上。我们正在对 3D 引擎进行重大升级,这将带来性能改进和新功能。

图形用户界面

Ecere 的图形用户界面 (GUI) 系统,最初是为了提供游戏内 GUI(例如,在暂停的游戏上提供半透明菜单)而发明的,现已发展成为一种非常丰富且高效的方式来组合从简单到复杂的用户界面。它提供了一个通用控件库,包括:编辑框(在其多行风格中是一个功能齐全的文本编辑器);列表框(可以选择充当树状或网格视图);下拉/组合框;通用数据框(根据指定的数据类型自动解析并弹出该类型关联的编辑器);弹出菜单和菜单栏;滚动条和滑块;图像框;状态栏;选项卡控件;工具栏;等等。更复杂的控件和对话框允许用户从日历控件中选择日期、文件、文件夹或颜色;查找或替换文本;或弹出消息。

GUI 系统还允许自定义现有组件的外观和感觉,或基于非常灵活的系统构建自定义控件,该系统利用组合和继承的面向对象概念,所有这些都以 Window 基类为中心。在窗口中渲染图形就像向 2D/3D 图形引擎发出绘图调用一样简单,使用窗口的 OnRedraw 回调接收的表面参数。我们现在正在开发一种自动布局和样式引擎,该引擎更擅长处理不同的像素密度。

GUI system

opensource.com

集成开发环境

在我开发编辑框的文本编辑功能时,我开始将其用作代码编辑器。由于其图形驱动程序,文本模式可以在终端或图形环境中使用。

代码编辑器已从基本项目文件格式发展成为丰富的开发环境。它现在具有基于上下文的语法突出显示、自动完成和参数工具提示;表单设计器;对象属性和方法表;API 文档浏览器;与 GNU Project Debugger (GDB) 接口的集成调试器;Valgrind 集成;甚至集成了 橡皮鸭调试法 来解决最棘手的错误。IDE 的跨平台构建系统是其真正的优势,因为它可以生成 GNU makefile(无需“配置”),这些 makefile 可以毫不费力地在 Unix 系统和带有或不带有 MSYS 的 Windows 系统上构建。

Rubber duck debugging

opensource.com

项目可以使用平台/配置/文件的组合矩阵定义一组复杂的编译器选项。可以设置多个编译器(例如,不同版本的 GCCClang)交叉构建到其他目标,例如从 Linux 构建 Windows,Android 或 Tizen 用于移动或可穿戴平台,或 Emscripten/Binaryen (WebAssembly) 用于 Web。项目资源还提供了一种将数据文件嵌入应用程序的可执行文件或库中的方法,可以通过简单的文件路径从 API 轻松访问。我们希望扩展和改进 IDE 中对其他编程语言的支持。

eC 编程语言

Ecere 运行时库最初完全用 C 语言编写。从编写更复杂和更有组织的 C 程序中看到了面向对象的价值,我尝试为该库组装面向对象的包装器,首先是 C++,然后是 Python。对 API 和实现不满意,在 2004 年,我跨越了一个巨大的鸿沟(也许比我意识到的还要宽),开始设计一种新的编程语言。

理由是 C 是一种很棒的语言:可移植、原生且已编译,所有关键库都可供使用。我推断,它所缺少的只是

  • 一点面向对象(深受 C++ 的影响);
  • 属性(作为定义场景图 API 和支持 IDE 属性表的不错方式,该属性表可以立即在表单设计器中产生视觉更新);
  • 反射(受 Python 启发,对于 IDE 动态查询库的属性和方法以及支持自定义对象设计器也至关重要);
  • 模块(因为头文件很痛苦,Python 启发了使它们动态可加载/可弹出);以及
  • 既然如此,为什么不消除对前向声明的需求呢?

因此,eC 被定义为 C 语言的超集(严格来说不是,但大部分是正确的)——准确地说是 C89 标准,尽管后来添加了对某些 C99 功能的支持。“e”代表 C 语言的一些小添加,也代表“Ecere”,或增强、优雅或高效,或您喜欢的任何好的限定词。

eC 语言的基石是其实例化对象的语法

MessageBox msgBox { contents = “Hello, world!!” };

它受到 C 的“struct”初始化器语法的启发,它可能看起来像这样(假设 contents 是第一个成员)

MessageBox msgBox = { “Hello, world!!” };

成员名称可以省略并根据其顺序解析,并且实例也可以是匿名的(在这种情况下,它是一个表达式而不是声明);例如

Vector3D { 2, 4, 5 }

其数据类型也可以根据目标的预期类型推断;例如

{ contents = "Hello, world!!" }

如果需要 MessageBox。

ECON:eC 对象表示法

当我第一次接触 JSON 时,我注意到了两件事。首先,与 XML 相比,将数据序列化为文本似乎是一种更明智的方法。其次,我认为它看起来与 eC 实例化语法非常相似,只是成员(键)被引用,等号 (=) 符号被冒号 (:) 替换。

我决定最好使用与 eC 实例化语法完全匹配的对象表示法。为了兼容性,我使 eC 对象表示法 (ECON) 成为 JSON 的超集,因此有效的 JSON 就是有效的 ECON。JSON 可写为 ECON 的唯一要求是成员是有效的 C/eC 标识符(以字母开头且仅包含字母和数字)。完全支持 eC 实例化语法为 JSON 带来了一些额外的改进,例如十六进制数字支持、非引用枚举值(true/false 除外)、多行字符串、隐式成员名称以及指定类型的能力。能够直接将对象从代码复制到序列化数据文件以及反之亦然也非常方便。与我们之前的 JSON 解析器/编写器一样,所有 eC 数据类型都可以自动从/向 ECON 或 JSON 文件(反)序列化。

我们也希望提供库来方便从其他编程语言编写和解析 ECON。

语言绑定:eC 作为网关

尽管 eC 是我们所有库的主要开发语言,但我们认识到要求其他人和其他组织使用它会抑制使用基于它构建的技术。

幸运的是,eC 是少数几种既编译又具有内置反射功能的编译语言之一,因此适用于从丰富的 API 生成自动语言绑定。该实现可以提供本机性能,同时避免额外层的开销。无需额外的努力,以 eC 编写的任何库的 API 都可以转换为适用于我们的绑定生成器工具支持的任何目标语言的适当的面向对象 API,该工具力求在跨语言的统一 API 的优势与坚持语言的范例、精神和最佳实践之间取得平衡。目前,C 和 Python 语言的绑定可用,C++ 绑定正在开发中,随后将支持其他语言。

GNOSIS:基于 Ecere 的地理信息系统

在过去的三年中,我们将开发重点转向了 GNOSIS 地理空间可视化产品。Ecere SDK 是免费和开源软件,GNOSIS 利用 eC 编程语言和我们的开源库,是我们主要的商业产品。

GNOSIS 的目标是开发具有高性能可视化系统的地理信息应用程序,该系统能够进行制图和 3D 投影。该系统大量使用多分辨率切片来处理栅格和矢量数据,以最大限度地减少数据加载并最大限度地提高渲染性能。它具有一个 SDK,用于将地图和叠加的地理空间定位对象集成到自定义应用程序中;一个地图服务器,实现了标准开放地理空间联盟 (OGC) 网络地图协议和高效扩展,以最大限度地减少带宽使用;以及一个 GIS 工具,用于可视化、样式化和发布地图。GNOSIS 也是 Ecere SDK 持续开发和改进的主要驱动力。

GNOSIS rendering

opensource.com

GNOSIS rendering

opensource.com

开始使用 Ecere

Ecere SDK 是根据 3-Clause BSD 许可证 许可的免费和开源软件。最新版本可在 Ecere SDK 安装页面 上找到。在 Debian 和 Ubuntu 系统上,SDK 可从官方存储库以 ecere-sdk 获得,代码发布在我们的 GitHub 存储库中。

要快速了解该语言的功能,请参阅 eC 概述,或要详细介绍该语言,请参阅(正在进行中)程序员指南 《eC 编程之道》。您还可以查阅 语法(扩展巴科斯-诺尔范式,或 EBNF),其中包括铁路图。还有一系列 课程作业(测验和实验室练习)和 井字棋游戏教程,以帮助您了解更多信息。要快速了解典型的简短 eC 应用程序的外观,请查看此示例:https://gist.github.com/jerstlouis/02181fdff3b1b3f5cb8fdc7b8bb37551
 

寻求帮助的最佳场所是在 论坛 或我们的 Freenode (irc.freenode.net) IRC 频道 #ecere 上(最好保持在线并等待回复)。

我们欢迎新用户和潜在贡献者。如果您发现错误,请提交它。如果您想了解我们正在寻找哪种类型的贡献,请查看我们的建议页面

标签
User profile image.
Jérôme Jacovella-St-Louis 于 1997 年创立了 Ecere 跨平台 SDK 项目。他于 2004 年设计了 eC 语言。Jerome 于 2005 年创立了 Ecere Corporation,目前担任公司 CTO,领导研发工作。Ecere 最新的重点是开发 GNOSIS 地理空间可视化工具。

4 条评论

这看起来还不错。希望它是基于当前的语言构建的,但它不难上手和学习。

打算开始试用一下,但看起来很有前景。

谢谢 Paul。否则您更喜欢使用哪种语言?我们正在努力开发绑定生成器,以便人们可以使用他们喜欢的语言从 SDK 中调用。

此致,

-Jerome

回复 作者 Paul Nichols (未验证)

嗯,Python 绑定的基本原理正在实现...自从 8 月下旬在费城举行的 FOSSCON / Hive 76 hack-a-thon 以来。

Ecere SDK 是用于 GUI 和图形的工具包。这是一个全球通用的跨平台工具包。试试看,您会很高兴使用它。
http://gamingtoolkit.net/

知识共享署名-相同方式共享 4.0 国际许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.