woshishui 发表于 2012-11-17 23:54:55

linux + android + osg

本帖最后由 woshishui 于 2013-8-23 23:13 编辑

想了半天也不知道怎么取标题。国内用linux进行osg开发的朋友较少,恐怕是因为前三脚难踢的缘故。我把自己的学习历程一点一点发上来,也算是一个记录,或许对别人有些帮助。顺便打个广告,对在Android上开发osg应用感兴趣的同学,可以联系我,一起学习。
我的开发环境已从64bit ubuntu12.10移至fedora17。。

1. 开发环境
工作开始前,要确认自己的显卡驱动是否正常工作。我的显卡是ATI显卡,执行 glxinfo即可查看,如果你看到的是BAD REQUEST之类的错误或无意义的字符,那很不幸,显卡驱动没正常安装。提醒各位同学,X11能工作并不意味着你的显卡驱动正常 工作了。

关于OSG的安装:我当然是强烈推荐你自己本地编译了。奇怪的是官网仍在用SVN作配置管理,至于什么时候会迁移到git,且等着看了。github 上有git仓库,从更新频度来看,是与官方svn仓库桥接的,自动更新。git克隆:git clone http://github.com/openscenegraph/osg.git
ubuntu
在ubuntu12.10上,我先按照 android 官方的建议 http://source.android.com/source/initializing.html 安装了开发 包。之后又安装 了如下开发包:
sudo apt-get install libzthread-2.3-2 libxml2-dev libcurl4-nss-dev libqt4-dev libopenal-dev libsdl1.2-dev libjpeg-dev libtiff5-dev libpoppler-glib-dev librsvg2-dev libgtk2.0-dev libgtkglextmm-x11-1.2-dev doxygen graphviz
fedora
在fedora17上
su
yum install git-core gnupg.x86_64 flex bison gperf curl zlib.x86_64 ncurses-devel.i686 readline-devel.i686 mesa-libGL-devel.x86_64dos2unix.x86_64 python-markdown.noarch libxml2.x86_64 libxslt.x86_64 perl-Switch libzip-devel.i686 libstdc++.i686             mingw32-* mingw32-gcc.x86_64 mingw32-gcc-c++.x86_64 注意这几个标红的库,它们是用来编译win SDK的,但要修改makefile,android默认使用ubuntu开发。总之很鸡肋。

yum groupinstall "Development Tools"
yum install lbzip2.x86_64 libxml2-devel.x86_64 libcurl-devel.x86_64 qt-devel.x86_64 openal-soft-devel.x86_64 SDL-devel.x86_64 libjpeg-turbo-devel.x86_64 libtiff-devel.x86_64 poppler-glib-devel.x86_64 librsvg2-devel.x86_64 gtk2-devel.x86_64 gtkglextmm-devel.x86_64 graphviz.x86_64 gnuplot.x86_64 wget
2. 安装osg
下载代码后,在代码目录下执行linux上开源软件的标准三步操作即可:1 ./configure 2 make 3 sudo make install.
我建议你执行完第一步configure操作后,仔细看一看输出信息,并逐个修复安装那些缺少的插件,但这个不必须,可以往后放一放。软件开发里实践是重中之重,当前最重要的是搞出第一个hello world。

3. hello world
附件算是我的第一个hello world,抄自《OpenSceneGraph Quick Start Guide 》。如果你用32bit系统,下载后可能需要修改Makefile中的-L/usr/local/lib64 为-L/usr/local/lib, 不过手头没有32bit系统,不太确定了:(

如果附件中的代码在你机器上编译通过了,在代码目录下运行./my-exec 应该能生成Simple.osg。



4.build doc
为什么要自己编译得到API文档? Good question! 做过Android开发的同学明白,尽管Android官方发布了SDK,但很多人仍在本地编译SDK,至于具体原因,一是塞了私货,二是尽早用到最新API。
编译OSG API的过程颇费周折。默认编译中不包括这一部分,当然,CMakeList中有这一部分配置内容,打开doc section对应的开关(-DBUILD_DOCUMENTATION:BOOL=ON)。从分析与验证结果来看,文件有以下关系:cmake 用命令行参数和 CMakeList.txt 生成了CMakeCache.txt,然后又依CMakeCache.txt和CMakeList.txt为依据,生成Makefile. 如BUILD_DOCUMENTATION这个开关,cmake怎么知道有这个开关存在呢,只能是扫描CMakeList.txt得知的,并且从中提取的默认设置的值,但如果在cmake命令行中改变默认设置值(这一步操作类似于在cmake-gui中更改设置),CMakeCache.txt的内容会相应更改。
执行 cmake . -DCMAKE_BUILD_TYPE=Release -DBUILD_DOCUMENTATION:BOOL=ON $@
执行make doc_openscenegraph命令,生成了html文档。

疑问:OpenSceneGraph_SOURCE_DIR这个变量作为root directory, cmake怎么知道它的属性是static,并且是工程的root dir,依据是什么?

5. 操作器实例
    这个实例是FreeSouth的《OSG程序设计教程》里的第14个例子。完成这一节,收获颇丰。一时对osg的事件驱动机制略有了解,二是通过设置默认坐标,对osg的坐标系也了解了一些。作为一个半路杀入的人,之前真没去了解osg 的坐标系统,导致在这个示例上也走了弯路。OSG的坐标系如下图,即当你面对显示器时,你的右手侧是X轴方向,Y轴方向射向你,Z轴向上,这是我实践出来的,欢迎理论指导。
                  /|\(z)
                   |
                   |
                   |
                   |
                   |
                   |
                   ------------------>(x)
                   /
                  /
               /
                /
               /
            /
             \/(y)
6. 教程
  http://www.openscenegraph.org/projects/osg/wiki/Support/Tutorials
  这些教程都很不错,作为一个开源项目,有这么多资料看,很难得。

7. barrier的实现
    在osg中,barrier被用来实现多线程的同步。其实现的方式是采用pthread_cond_wait函数,让该线程阻塞在条件变量上,当计数器达到阀值时,调用pthread_cond_broadcast函数,让阻塞在该条件变量上的所有线程解除阻塞。核心逻辑在 PThreadBarrier.cpp中的Barrier::block函数中实现。
    为尽可能的保持osg的原貌,示例中的代码只删除了极少无关的代码。测试逻辑是在主线程中每创建一个线程后,让主线程睡眠1秒,这样会给子进程运行机会。运行完示例后可删除thread_function函数中的barrier->block(),观察不做子线程同步时,主线程与子线程是交叉运行的。 示例代码


8. block的实现
    与Barrier的实现机制是一样,Block 也是用pthread_cond_wait和pthread_cond_broadcast实现了线程的阻塞,实际上也没有其他选择。在库中封装搞得关系有些复杂,我尽量剔除了无关的代码。测试代码中只测试了定时阻塞。


9. 学习过程
    利用业余时间在代码里折腾了几个月,扎了几个猛子后感觉呛了几口水,没摸清osg。就找了本书(OpenGL Shading Language Third Edition)看opengl,又没看懂,于是又下载了本书(3D Math Primer for Graphics and Game 2nd)看了一遍,没看懂。然后又买了本书(Android 3D 游戏开发技术宝典 --OpenGL ES 2.0),看完后,不懂。

10. osg for android问题
    在主观臆断的前提下,暂时列出以下问题:
    1 shader的编写 多数人只知道这个问题,以为解决完这个问题便万事大吉。
    2 最好用Native widget实现GUI,这是运行效率最高、体验最好的方案。牵扯出的问题是应用层的多线程机制如何与osg的多线程机制结合。
    3 功耗的控制 OpenGL ES已经为功耗做了很多,但这仍不够。功耗是手持装置的软肋。必须有机制在应用被置成连续渲染又转入后台时做出自动处理,必须明确禁止在CPU和GPU间传递大量数据。
    4 内存占用的控制 手持设备的RAM与PC相比差一个数量级,android对每个进程的堆空间有限制,想流畅运行一个“大”场景,需要更好的缓存机制。
    在PC机上,后两个问题不突出,但在手持设备上太突出,否则这件事没有任何意义。

array 发表于 2012-11-19 10:25:13

Linux上编译的方法并无太大的区别,安装了cmake之后用管理员权限运行cmake-gui,然后拖动CMakeLists.txt到其中即可,其它的配置过程都是一样的,结束后执行make和make install即可

woshishui 发表于 2012-11-29 22:35:44

更新了开发包列表,满足了configure过程中对开发包的依赖。

woshishui 发表于 2012-12-3 13:29:01

添加了make doc内容。

woshishui 发表于 2012-12-26 11:06:53

不得不说, <<OpenSceneGraph三维渲染引擎设计与实现>>是目前能找到的osg资料中最经典的, 试图把来龙去脉讲解清楚的一本书.

woshishui 发表于 2013-2-21 13:28:51

添加了fedora17上的依赖包、git克隆及官方的一些教程。

woshishui 发表于 2013-8-23 22:02:09

make it run, make it right, make it fast.
准备着手第一个问题,shader的编写。

hwyqw 发表于 2013-8-25 21:18:15

woshishui 发表于 2013-8-23 22:02 static/image/common/back.gif
make it run, make it right, make it fast.
准备着手第一个问题,shader的编写。

问一下,在Linux下开发OSG程序, 优点,缺点 有哪些? 相对于Windows来说。
你为什么选择在Linux平台下开发?

woshishui 发表于 2013-8-27 23:43:08

hwyqw 发表于 2013-8-25 21:18 static/image/common/back.gif
问一下,在Linux下开发OSG程序, 优点,缺点 有哪些? 相对于Windows来说。
你为什么选择在Linux平台下开 ...

我只是用linux的机会更多一些,不想费精力再搭建另一个平台上的开发环境而已,没有其他原因。

aspirationTT 发表于 2014-12-1 10:07:14

woshishui 发表于 2013-2-21 13:28
添加了fedora17上的依赖包、git克隆及官方的一些教程。

你好,请问linux每个版本都有自己的依赖包么,知道redhat的依赖包去哪里下?谢谢
页: [1]
查看完整版本: linux + android + osg