要相信 GObject 是有用并且简单的!

去年,曾经用了 10 多天的时间学习了一番 GObject,当时疏于心得的总结,而现在已经忘记的差不多了。

最近因为观察到 GtkGLExt 项目没有跟进 gtk+-3.0 的意思,便想自己动手,丰衣足食,要么去改造现有的 gtkglext 代码,要么另起炉灶。也许在自由/开源的世界中,期待是可耻的,只有动手才会幸福。但是,这与 GObject 有什么关系?

在 GTK+ 的众多底层库中,GObject 与 GLib 是两块基石,在它们之上矗立着 Cairo、Pango、Clutter、GDK、ATK 等支柱,还有 GtkGLExt 这棵对我而言非常重要的小支柱,没有它我便不知道该如何在 GTK+ 中直接绘制 OpenGL 三维图形。事实上,除了 GtkGLExt 之外,还有 Cogl 可供选择,后者是对 OpenGL 进行抽象封装,主要是为了方便 Clutter 在其上层创造场景图结构。既然是封装,那么就需要容器,Cogl 所使用的容器便是 GObject。

也许你对 GTK+ 支持 OpenGL 的事情并不感兴趣,那么我们便将话题转回至 GObject,并提出这样一个问题:既然 GObject 如此重要,那么它究竟是做什么的?

简单的说,GObject 是一个程序库,它可以帮助我们使用 C 语言编写面向对象程序。

很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如 C++、Java、C# 等等,而 C 语言是用来编写结构化程序的。事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。GObject 告诉我们,使用 C 语言编写程序时,可以运用面向对象这种编程思想。

从宏观层面上来论证 GObject 与 C++、Java 之类的面向对象编程语言相比具备何种优越性,这是没有意义的。最优化理论中有一个“没有免费的午餐”定理,大意是说没有一种方法可以适合于全部问题,应当选择合适的方法,并将它放在合适的地方使用。这个定理对于编程语言的选择与使用也有效,因为选择某种最合适的语言,本身就是一个最优化问题。

假如我们选择了 GObject,它最适合处理那些问题?

首先,与操作系统层面相距较近的程序设计,即系统程序设计,例如上文所列举的 GTK+ 及其支柱,使用 GObject 模拟的面向对象机制可以简化程序逻辑结构,同时还能保证程序的性能以及系统接口直接调用。最主要的是,系统程序员大都熟悉 C 语言,沟通较为方便。

其次,有时为了兼顾程序性能与开发效率,会对程序结构进行分层设计,底层模块采用 C 程序库实现,上层则使用动态语言或函数式语言实现,此时使用 GObject 除了可以简化底层模块的逻辑结构,还可以通过 GObject 与上层模块进行胶合。现在,GNOME 3 项目提供了 GObject Introspection 技术,专门用于处理 C + GObject 所实现的程序与上层动态语言或函数式语言的胶合问题[1]。另外,GNOME 3 项目还实现了两种新的语言 Vala 和 Genie,前者语法类似 C#,后者语法类似 Python,使用它们所编写的程序源码,利用相应的编译器便可以生成 C + GObject 代码,进而可以编译为 C 程序[2,3]

那么 GObject 容易掌握么?我认为它应该很容易学习和使用,就像网络上许多人很轻易的诟病它非常繁琐难用一样容易。在打算掌握任何一种技术之前,如果不相信它是简单的,内心深处便会滋生一种逃避的意识。我们也可以例证,如果 GObject 真的很难理解和应用,怎么会存在那么多基于 GObject 实现的程序,难道那些程序的作者皆为天才抑或疯子?这种概率实在太小了。

事实上,GObject 是被人为的复杂化了。因为很多学习 GObject 的人,一上来就奔着要全面洞悉 GObject 的实现原理与细节,但是又缺乏足够的耐心和基础知识。如果换一个角度来考虑这个问题,作为初学者,在学习 C++、Java 之类的面向对象编程语言之时,我们有打算直接潜心理解这些语言的内部实现吗?我们大都是要从 Hello world 之类的示例起步的。对于 GObject 的学习也应当如此。

http://garfileo.is-programmer.com
Gstreamer基础之Gobject 文章目录Gobject简介 GStreamer是依附于GLib 2.0对象模型的,采用了信号与对象属性的机制,所有的GStreamer对象都采用GObject继承的方法进行扩展,是所有GStreamer对象的基类,因此有必要学习一下Gobject是怎么回事。 Gobject简介 ... 阅读详情

相关推荐

GTK+helloword详解

麻雀虽小五脏俱全,一个简单的helloword也包含的很多细节,通过分析这个简单的程序源码,可以了解到GTK+图形程序的基本结构以及诸多背景知识。

xxNull的专栏 1114

6. Gobject 学习总结

简单的来说,GObject是一个程序库,它可以帮助我们使用C语言编写面向对象的程序。   很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、JavaC# 等等,而 C 语言是用来编写结构化程序的。事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。GObject 告诉我们,使用 C 语言编写程序时,可以

吾皇的博客 4771

GObject

GObjectGLib Object System,也叫GObject,是一个免费的库(由LGPL授权)。它提供了一个可移植的对象系统,清晰的跨语言互用性。GObject被设计成既可以直接在C语言中使用,也可以通过绑定,用于其它语言。历史GObject只依赖于GLib和libc,它是GNOME的基石,被广泛应用于GTK+,Pango,Accessibility Toolkit及大多数高层次GNOME库和应用程序。在GTK+2.0 之前,GObject代码是GTK+代码的一部分。(名字“GObject ” 当

m_user2012的专栏 1491

GObject官方详细文档

目录 背景 数据类型和编程 导出C API GLib动态类型系统 复制功能 约定 不可实例化的基本类型 (如gchar) 可实例化的类型:对象 初始化和销毁 不可实例化的类型:接口 接口初始化 接口销毁 GObject基类 对象实例化 对象内存管理 引用计数 弱引用 引用计数和周期 对象属性 一次访问多个属性 GObject消息传递系统 关闭 C闭包 ...

Ysu_LiuYang的博客 7084

函数指针、回调函数与 GObject 闭包 GObject 子类对象的析构过程 GObject 的信号机制——概览

原文地址:http://garfileo.is-programmer.com/2011/3/21/gobject-signal.25477.html Garfileo posted @ 2011年3月21日 20:16 in GObject 笔记 with tags glib GObject gsignal , 3894 阅读 手册所述,GObject 信号(Gigna

yazhouren的专栏 1526

GObject学习教程---第一章:GObject有用并且简单

索引:https://blog.csdn.net/knowledgebao/article/details/84633798 本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站: 楼主见解: 主要告诉你GObject多么的牛逼,多么的简单。这一部分没有什么可说的。 源博客网址:http://garfileo.is-programmer.com/...

knowledgebao的博客 1万+

GObject基类

GObject基类 前一章讨论了GLib动态类型系统的细节。GObject库还包含一个名为GObject的基本类型的实现。 GObject是一个基本的类实例化类型。 它实现: (1)内存管理引用计数 (2)实例的构造/析构 (3)具有set/get函数对的通用每个对象属性 (4)轻松使用信号 所有使用GLib类型系统的GNOME库(如GTK +和GStreamer)都继承自GObje

lp525110627的博客 4431

linux - gobject使用

gobject简介sample*.h*.c 简介 Gobject 系统提供了一个灵活的、可扩展的、并且容易映射到其他语言的面向对象的 C 语言框架. (1)是Glib库的动态类型系统实现,它实现了:   [1] 基于引用计数的内存管理   [2] 实例的构造和析构   [3] 通用的set/get的属性获取方法   [4] 简单易用的信号机制 GObject 的动态类型系统允许程序在运行时进行类型注册,主要目的有两个: (1)使用面向对象的设计方法来编程,GObject 仅依赖于 GLib 和 li

qq_25439881的博客 1624

GObject 简明教程(一)

最近,我一直在深入学习 GStreamer(相关教程可以从我主页中看到)。在探索其复杂的设计逻辑时,我意识到需要深入研究 GStreamer 的源码。而因为 GStreamer 是基于 GObject 开发的,掌握 GObject 的基本概念就显得尤为重要。本文整理自,简化了细节,保留了一些关键内容,以便更好地理解。提示:以下是本篇文章正文内容,下面案例可供参考。

记录学习的过程 2272

快速上手Gobject

What is G-object? —很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、JavaC#等等,而C语言是用来编写结构化程序的。 —事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。 —Gobject,亦称Glib对象系统,是一个程序库,它可以帮助我们使用C语言编写面向对象程序;它提供了一

铁匠Smith先生的专栏 2万+

Gobject专栏索引

索引首页:https://blog.csdn.net/knowledgebao/article/details/84776046 官网API:https://developer.gnome.org/gobject/stable/ gobject相关概念:https://blog.csdn.net/knowledgebao/article/details/82498187 第一章:GObjec...

knowledgebao的博客 7516

GObject Tutorial

GObject Tutorial Ryan McDougall(2004) 目的 — 这篇文档可用于两个目的:一是作为一篇学习Glib的GObject类型系统的教程,二是用作一篇按步骤的使用GObject类型系统的入门文章。文章从如何用C语言来设计一个面向对象的类型系统开

我们这里还有鱼······ 1499

GObject 简明教程(二)

最近,我一直在深入学习 GStreamer(相关教程可以从我主页中看到)。在探索其复杂的设计逻辑时,我意识到需要深入研究 GStreamer 的源码。而因为 GStreamer 是基于 GObject 开发的,掌握 GObject 的基本概念就显得尤为重要。本文整理自,简化了细节,保留了一些关键内容,以便更好地理解。上一章GObject 简明教程(一)我们介绍了的前面五章。今天我们继续,将后面几章也进行总结和更新。

记录学习的过程 950

GObject 与 GStreamer 中文手册

GObject对象系统 简单的说,GObject对象系统是一个建立在GLIB基础上的, 用C语言完成的,具有跨平台特色的、灵活的、可扩展的、非常容易映射到其它语言的面向对象的框架。 如果你是一个C语言的执着的追随者,你没有理由不研究一下它。 NOTE: glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。 glib是Gtk +库和Gnome的基础。 glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为许多标准的、常用的C语言结构提供了相应的替代物.

书山有路勤为径 2392

[pyvips] GLib | GObject | GValue

我准备了一个盒子`GValue value = G_VALUE_INIT`,放了个整数 42`set_int(&value, 42)`,然后交给别人处理。

No Game No Life 1124

Gobject tutorial 八

如果这是最后一个对对象B的引用,那么A释放对B的引用,会导致unref 函数执行对象B的dispose, 进而导致B对象释放对对象A的引用,如果这也是对对象A的最后一个引用,对象B对对象A的引用的释放会导致第二次执行A的dispose。既然在注册属性过程中,GparamSpec是必须的,那么,就有必要对生成GParamSpec的函数进行说明,我们以上例中的g_param_spec_float为例,看看Glib的说明。对于不同的对象实例,属性值是不同的,因此,属性值是存储在对象的实例中的。

编程是一门艺术 964
上一篇: 无法挂载sd卡(android),不能安装APK(1)
下一篇: GObject 学习笔记汇总
iteye_17686
博客等级 码龄8年 321粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值