维尔福

游戏开发者
随笔 - 26, 文章 - 0, 评论 - 10, 引用 - 0
数据加载中……

2012年3月9日

D3D资源管理

摘要

受管贴图(Managed textures,也就是我们通常所谓的“自动管理贴图”),在DX6中首次被引入,经过一系列的改进和增强,在DX9中自动管理的资源类型增加到贴图,顶点缓冲,顶点索引缓冲,所有这些资源使用统一的公共接口。通过使用D3D资源管理器,应用程序可以轻松的处理设备丢失、处理稍微过量的显存使用。

有时开发者在使用受管资源会遇到一些困难,这部分归咎与系统的抽象特性。在大多数情况下使用受管对象是不错的选择,但有时出于性能考虑也会使用非托管资源。这篇文章将讨论一般情况下如何处理资源,受管与非受管资源的行为差别。

 

内容

l         显示内存

l         受管资源

l         驱动管制资源

l         默认资源

l         系统内存资源

l         一般性的建议

 

显示内存

为了使得资源可以利用显存,GPU需要通过内存访问定位他。GPU访问(Local video memory)显存是非常高效的,并且某些资源(例如RenderTarget,深度、模板缓冲)必须在本地显存(Local video memory)定位。由于AGP的出现,GPU可以直接访问部分系统内存,而这部分系统内存区域就是所谓的非本地显存(non-local video memory),当然这部分内存(显存)也是不能挪做它用的。非本地显存仅能被GPU访问,与访问本地显存相比,其效率低一些。需要明确的是,所有AGP内存在设备丢失时都会失效,都需要在恢复他们。

一些集成显卡使用统一内存结构(Unified Memory Architecture),这样主内存可以被系统任何一个设备寻址。D3D支持UMA而不需要修改任何代码,这样我们把系统内存配置为本地显存,硬件确保资源的定位就像传统的结构一样进行工作。

受管资源

大部分资源应该使用POOL_MANAGED方式创建,即受管资源。所有受管资源将被创建在系统内存,在需要的时候复制到显存。当发生设备丢失时会自动copy系统内存到显存。既然不是所有受管资源都需要一次送入显存,这样你可以提交超过渲染每帧所必须使用的最小内存容量,但是这样会使得大量显存内容因为分页操作而写到磁盘上,这是非常耗时的。这也是为什么恢复设备如此耗时,因为需要将大量磁盘数据复制到显存。

DX会为每份资源在最后一次使用时加上时间戳,这样当显存分配失败时,它会释放那些最近最少使用的资源(LRU算法)。使用SetPriority函数可以标记资源的重要程度,重要的资源优于时间戳的判断,所以那些比较常用的资源应该设置高优先级,而不用担心因为时间戳过期而导致资源被释放。在DX9中,驱动程序提供的显存管理信息是非常有限的,运行时可能不得不清除大量资源用于分配足够的内存。设置适合的优先级是非常有用的,这样D3D不会清除那些马上又需要使用的资源。应用程序可以强制调用EvictManagedResources清除所有受管资源,但是如果下一帧又需要重新加载这些资源,这将是非常耗时的,不过这个函数在那些场景明显需要改变(比如进入下一个关卡)的情况下,还是非常有用的。

如果“当前帧”内需要非常多资源用于渲染,这将是件麻烦的事情,用前面的LRU方式调度资源效率就不太理想了,这个时候使用MRU资源调度方式取代,即优先清理那些比较活跃的资源。注意,这里“当前帧”的概念是指BeginSceneEndScene之间的需要渲染的帧。

开发人员如果想得到关于受管资源的更多信息,可以通过IDirect3DQuery9接口查询,但是这个接口仅能用于调试模式(debug runtimes),在发布版本中,应用程序不能依靠改接口的信息做任何假定。

了解资源管理如何工作可以帮助我们调试、调整程序,重要的是应用程序不要太过依赖当前的运行库(或者驱动程序)的资源管理方式,驱动更新有可能导致其行为发生变化,将来的D3D将会有套久经考验的资源管理方式。

驱动程序管理的资源

D3D驱动可以自由的实现“由驱动管理贴图”的特性,通过D3DCAPS2_CANMANAGERESOURCE段可以查询硬件驱动是否支持这个特性,这样驱动将代替D3D运行库管理资源。对于级少数的硬件是支持这个特性的,对于大多数硬件则不尽相同,你可以咨询你的产品提供商获得这方面信息。一般情况下,你可是使用D3DCREATE_DISABLE_DRIVER_MANAGEMENT方式创建设备,这样将由D3D运行库来管理资源。

缺省资源管理(非受管资源)

虽然受管资源非常简单,容易使用,高效,但是有时我们希望直接往显存里写东西,这种情况下我们需要使用POOL_DEFAULT方式创建资源。使用这种方式会增加程序的复杂性,代码需要应付所有设备丢失的情况,并需要谨慎考虑何时复制数据到显存。错误的指定USAGE_WRITEONLY标记或者锁定渲染目标(Render Target)将严重影响性能。

锁定POOL_DEFAULT类型的资源很可能导致GPU停止运转,这与POOL_MANAGED类型的资源是不同的,除非使用一些特性的指示标记。根据资源当前的位置不同,锁定后得到的指针也不相同,可能是一块临时的系统内存,也可能直接指向AGP内存。如果是临时的系统内存,Unlock后将把这段数据送入显存,这是因为如果显卡资源不是只写的(write-only),Lock的时候数据将不得不被送入一段临时的内存;如果指向的AGP内存区域,临时的拷贝是可以避免的,但是cache的行为将会降低性能。

为了避免在写入一整行数据(a full cache line of data)进入AGP内存区导致write-combing性能下降(一般是由于发生了一次读写周期),顺序的访问AGP内存是推荐的做法,如果你的程序需要随机的访问AGP内存,而你又不希望使用受管资源,那么你可以使用系统内存作为替代方案,这样当你生成了数据之后,可以lock后拷贝,这样不会带来太大的性能损失,这里的性能损失一般是由缓冲的“写搜索”操作引起。(注,这里关于词汇cache write-combing译者也不知道对应的中文含义,只能按照字面意思翻译,见谅)

对于某些类型的资源,使用LOCK_NOOVERWRITE标记会使添加数据比较有效率,但是多次的LockUnlock同一资源还是需要尽量避免的,适当的利用多种不同的锁定标记对于效率优化使非常重要的,就像填充锁定内存区域最好使用cache友好的(cache-friendly)数据访问方式一样。

受管资源和缺省资源混合使用

受管资源与非受管资源的混合分配使用可能导致显存碎块,并且扰乱受管资源使用的内存区域。最好在使用受管资源前使用非受管资源,或者使用受管资源后使用EvictManagedResources函数清除那些受管资源再使用非受管资源。记住,所有非受管资源都会常驻显存,这样其他内存需求就不能使用了。

注意,与以往的DX版本不同,在显存缺乏时,如果分配非受管资源失败,DX9会自动清除受管资源,这有可能导致潜在的显存碎块,甚至把资源放入不适当的地方(比如非本地内存的静态贴图区)。所以,最好在使用受管资源之前分配全部的非受管资源。

动态缺省资源

如果数据需要很高频率更新,那最好使用非受管资源,并使用USAGE_DYNAMIC标记,这样驱动会决定最适合的地方放置这些需要经常更新的数据。这通常意味着放置在非本地显存中,这样对于GPU来说,访问速度可能相对要慢一些。而对于UMA架构,驱动将会选择CPU访问效率较高的特殊地方放置这些数据。

这种用法(动态缺省资源类型)一般用于软蒙皮和基于CPU计算的粒子系统的顶点/顶点索引的Buffer填充,LOCK_DISCARD标记可以保证资源仍被使用的时候,锁定操作不会导致系统停止暂停工作。在这种情况下,使用受管资源会更新系统内存,然后拷贝到显存。对于系统的非本地内存,多余拷贝是不需要的。

标准的贴图是不允许锁定的,仅仅可以通过UpdateSurfaceUpdateTexture函数更新。一些系统支持动态贴图,它可以通过配合使用LOCK_DISCARD标记进行锁定,但这需要检查D3DCAPS2_DYNAMICTEXTURES硬件能力。对于高动态贴图(如视频、程序生成贴图),最好使用非受管资源和系统内存资源,并且通过UpdateTexture函数更新贴图。对于高频度的粒子更新,UpdateTexture函数可能是最好的选择。

在有限的总线-内存带宽下,静态贴图资源应该使用POOL_MANAGED方式,这样可以确保它最好的利用本地显存,并有较好的效率。对于“半静态”资源,使用动态类型资源有时会获得更好的效率。

系统内存资源

资源可以使用POOL_SYSTEMMEM方式创建。但他们不能用于图形管线,他们仅能做为源数据用于更新POOL_DEFAULT类型的资源,这是通过UpdateSurfaceUpdateTexture函数完成的。他们的锁定操作也非常简单,尽管他们同样可能因为前面提到的原因导致系统停止运转。

虽然是在系统内存中创建资源,但POOL_SYSTEMMEM所支持的资源格式和能力(比如最大尺寸)是受硬件、驱动限制的。同样是在系统内存中创建资源的POOL_SCRATCH则没有这方面限制,它支持所有格式和能力,但设备却不能直接访问它。SCRATCH类型资源一般用于内容创建工具。

一般性的建议

了解资源管理的技术实现细节对达成你的程序的性能目标是有非常大的帮助的,规划你的资源如何交给D3D并设计好的结构以便能及时加载必要的数据是一件非常复杂的工作,为此我们给出一些好的实践经验做为一般性的原则:

l         预处理你的资源。不要将耗时的加载资源、资源转换、资源优化丢给用户去做,虽然这样便于开发,但确让用户无法忍受。预处理这些资源可以加快加载,更快使用,你的用户也会发现你的程序跑的更快了。

l         避免在每帧创建过多的资源。对于过多的资源加载,可以把他们分到多帧里完成或者不要急于释放那些暂时不用的资源。

l         确保在一帧结束时已经断开了所有资源通道。(比如,顶点流,texture stages,顶点索引)。

l         对于贴图,建议使用压缩贴图(DXTn)格式,建议使用mip-map或者将小贴图拼接为大贴图使用。

l         建议使用顶点索引,这将减少数据传输量。

l         对于过渡的优化资源管理是需要谨慎的。如果你的程序过分依赖驱动、硬件和操作系统的某些特征,那么这些程序、硬件的修改将会导致潜在的性能问题。
http://www.cppblog.com/richardhe/articles/69204.html

posted @ 2012-03-09 15:33 weierfu 阅读(211) | 评论 (0)编辑 收藏

2010年11月7日

ubuntu 安装smb共享文件夹

    #sudo apt-get install samba
    #sudo apt-get install smbfs

    安装完毕,从菜单进入 系统 -> 系统管理 -> 共享的文件夹,打开如下图所示的界面:

   

ubuntu 安装smb共享文件夹 - 仙人掌 - 聆听宁静的声音

    添加准备共享的文件夹。

    1. XP匿名访问Ubuntu共享文件
    使用samba不进行任何设置时,winXP机器可以连接到Ubuntu机器但提示输入用户名密码,此时不论输入什么都不能访问,要实现匿名访问需要做如下设置:

    1) 修改配置文件smb.conf:
       sudo vim /etc/samba/smb.conf
       将security=user那一行前的注释符";"去掉,然后把user改为share。
    2) 重启samba:
       #sudo /etc/init.d/samba restart

    2. WinXP下用用户名和密码访问Ubuntu共享文件
    下面我们来共享群组可读写文件夹,假设你要共享的文件夹为: /home/ray/share首先创建这个文件夹
    代码:
       #mkdir /home/ray/share
       #chmod 777 /home/ray/share

    备份并编辑smb.conf允许网络用户访问
    代码:
    sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
    sudo gedit /etc/samba/smb.conf

    搜寻这一行文字
    代码:
    ; security = user

    用下面这几行取代
    代码:
    security = user
    username map = /etc/samba/smbusers

    将下列几行代码添加到文件的最后面,假设允许访问的用户为:newsfan。而文件夹的共享名为 Share
    代码:
    [Share]
    comment = Shared Folder with username and password
    path = /home/ray/share
    public = yes
    writable = yes
    valid users = newsfan
    create mask = 0700
    directory mask = 0700
    force user = nobody
    force group = nogroup
    available = yes
    browseable = yes

    然后顺便把这里改一下,找到[global]把 workgroup = MSHOME 改成
    代码:
    workgroup = WORKGROUP
    display charset = UTF-8
    unix charset = UTF-8
    dos charset = cp936

    后面的三行是为了防止出现中文目录乱码的情况。其中根据你的local,UTF-8 有可能需要改成 cp936。自己看着办吧。现在要添加newsfan这个网络访问帐户。如果系统中当前没有这个帐户,那么
    代码:
    sudo useradd newsfan

    要注意,上面只是增加了newsfan这个用户,却没有给用户赋予本机登录密码。所以这个用户将只能从远程访问,不能从本机登录。而且samba的登录密码可以和本机登录密码不一样。现在要新增网络使用者的帐号:
    代码:
    #sudo smbpasswd -a newsfan
    #sudo gedit /etc/samba/smbusers

    在新建立的文件内加入下面这一行并保存
    代码:
    newsfan = “network username”

    如果将来需要更改newsfan的网络访问密码,也用这个命令更改
    代码:
    #sudo smbpasswd -a newsfan

    删除网络使用者的帐号的命令把上面的 -a 改成 -x
    代码:
    #sudo testparm
    #sudo /etc/init.d/samba restart

posted @ 2010-11-07 23:46 weierfu 阅读(1004) | 评论 (0)编辑 收藏

Ubuntu 下配置 C/C++ 开发环境

1、配置GCC

  其实刚装好的系统中已经有GCC了,但是这个GCC什么文件都不能编译,因为没有一些必须的头文件,所以要安装build-essential这个软件包,安装了这个包会自动安装上g++,libc6-dev,linux-libc-dev,libstdc++6-4.1-dev等一些必须的软件和头文件的库。

输入命令

Ubuntu命令
  1. sudo apt-get install build-essential  

安装完成后写一个 C 语言程序 hello.c 测试一下

C 代码
  1. #include<stdio.h>   
  2. int main()   
  3. {   
  4.    printf("Hello Ubuntu!\n");   
  5.    return 0;   
  6. }  

在终端输入

Ubuntu命令
  1. $ gcc hello.c -o hello   
  2. $ ./hello  

显示 
Hello Ubuntu!
这样,C 语言编译器就安装成功了!

2、安装 GTK 环境

Ubuntu命令
  1. sudo apt-get install gnome-core-devel   
  2. sudo apt-get install libglib2.0-doc libgtk2.0-doc   
  3. sudo apt-get install devhelp   
  4. sudo apt-get install glade-gnome glade-common glade-doc  

这样,就可以在 Ubuntu 下进行 C/C++ 程序的图形界面设计了。

http://www.baiba.net/blog/?action=show&id=56


安装完成后我们也同样做个测试程序
代码:
#include<gtk/gtk.h>
void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello Ubuntu!\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello Ubuntu!");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);   /*显示一个窗口*/
gtk_main();   /*进入主循环*/
return(0);
}


用下面命令编译运行
代码:
$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest

会显示一个带有一个按钮的窗口,点击按钮以后窗口关闭,命令行显示Hello Ubuntu!


附件:
文件注释: GTK测试
s2.png
s2.png [ 4.79 KiB | 被浏览 34134 次 ] 
文件注释: C语言测试
s1.png

posted @ 2010-11-07 23:26 weierfu 阅读(287) | 评论 (0)编辑 收藏

Ubuntu安装OpenSSH

Ubuntu缺省没有安装SSH Server,使用以下命令安装: 

sudo apt-get install openssh-server openssh-client 

不过Ubuntu缺省已经安装了ssh client。 

可以通过编辑 /etc/ssh/sshd_config 文件来配置 OpenSSH 
udo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original 
sudo chmod a-w /etc/ssh/sshd_config.original 

配置完成后重起: 
sudo /etc/init.d/ssh restart

posted @ 2010-11-07 23:19 weierfu 阅读(406) | 评论 (0)编辑 收藏

2010年10月7日

【图】Ogre渲染系统


posted @ 2010-10-07 02:11 weierfu 阅读(169) | 评论 (0)编辑 收藏

2010年5月3日

人际交往的3大定律

人际交往的3大定律

http://www.sina.com.cn  2010年04月30日 11:52  蓝心心理网
人际交往的3大定律
人际交往的3大定律

  人之不同, 一如其面。各种不同的人都有适合自己的交往方式和自己的交往原则,不论其本人是否能够意识得到。所以,如果想找出一种放之四海而皆准的、和任何脾气任何性格的人交往都适用的程序,就像剧本一样,先说哪句话,后说哪句话,什么话应该配什么动作,什么心情配什么表情,这肯定是不现实的。

  但是,人与人之间的交往,可以有一种规则,让自己和他人沟通得更加顺畅,更加自如。根据多年咨询的经验,总结出一种心理调适的新思路,姑且称作人际交往的3大定律。

  定律一:“每一个人都比你累”

  它的核心是这样两点,一是在于你能否体谅到,别人的劳动是一种辛苦;二是你能否理解别人对你的态度。

  比如夫妻之间,同样是下班之后,丈夫往往宁可倒在沙发里看电视,也不愿意把家里的东西收拾整齐,妻子却看不惯屋子里乱七八糟的样子,就要自己收拾。但是呢,妻子就难免会心里埋怨:我忙了一天,回到家里还要在这里收拾,你居然在沙发上赖着看电视,怎么就不说来帮一把手呢?可是丈夫也在想了,一天上班我累死累活的,到了家我就没有一点劲儿了,哪像你上班那么轻闲。要不然,怎么还有精力收拾屋子。要是两人都这么想,看着吧,过不了多大会儿,肯定吵起来。

  可是,如果两人都能换一种思路,又会是什么情况呢?

  妻子会觉得,他都辛苦一天了,每天上班这么累,还是让他好好休息一会儿吧。家嘛,家不就是让他休息放松的地方嘛。丈夫会想到,她上了一天班,下班回家还要收拾屋子,真是辛苦。这么着吧,反正我收拾过的屋子她也看不上,干脆,我去厨房把饭热了吧。

  在做家务的不经意中,夫妻间就产生了一种默契和温馨。

  到父母家聚会,如果想起这一条,你会主动干许多事儿,而且不至于和自己的亲人心生芥蒂;和朋友一齐出游,如果心里常想着这句话,你就会兴高采烈满心轻松地成为一个受朋友们欢迎的人。

  明白了第一定律的含义,自然会容易理解下面两个推论:

  推论一:如果有人能体谅你的累,这个人必定爱护你,心疼你;如果有人愿意替你累,替你辛苦,说明这个人爱你。

  推论二:如果你能体会到其他人的累,体会到其他人的辛苦和不容易,说明你是个善良的人;如果你愿意去替别人累,去替别人承担辛苦,说明你爱这个人。

  定律二:每一个人都比你干得活儿多挣得钱少

  定律二适用在你的日常工作之中,或者说,它或许应该是你在通过自己努力获得相应的物质或精神报酬时的一条准则。

  相信你在工作中肯定会有对别人羡慕的时候:“还是张主任的工作轻松,每天看他不是请客吃饭,就是打球锻炼,上班的时候还可以一个人关在办公室里想干什么就干什么,钱也不少拿,多好啊!”可是,你想过没有,你羡慕的对象会不会也在心里面羡慕你呢?

  说不定哪一天,你就会听到张主任亲切地和你唠唠家常:“小刘啊,还是你们舒服啊,我每天都要陪别人吃饭,连和家里人一起吃晚饭的时间都没有;上班吧,一个人在办公室,也没有人说说话,不像你们还可以说说笑笑的。哎,工作压力太大了。真羡慕你们啊,要是跟你的工作换一换,我就知足了。”你会不会觉得这是领导在猫哭耗子假慈悲呢?其实不然,这绝对是对方的真实感受。

  心理学研究发现,人们都有一种把自己的工作和付出以及别人的获得和收入看得比实际情况要多,把自己的获得和收入以及别人的工作和付出看得比实际情况要少的心理趋势。

  每个人都是一样,会觉得自己的付出太多,自己的获得太少,于是由此而生出许多的不满或是抱怨。其实,想想看,假如每个人都这么想的时候,你的想法与别人不同,你觉得自己的付出相对少,别人的付出比较多,那么,你自然就会不断地自勉,还会真诚地对待别人。

  第二定律也有两条推论:

  推论一:理解别人干得活多,或者理解别人收入少,都能使别人感动,而且惠而不费。

  推论二:不要再抱怨自己的收入。因为,当你抱怨的时候,你肯定没有在工作。

  定律三:每一个人都没有义务帮助你

  这句话听起来十分冷酷,难道我们身边的每个人都是这样冷漠吗?在我们需要别人援手的时候,我们竟然那么孤立无援?

  事实上并不是这个样子,这个世界上永远不缺乏好心人和热心人,但是有些时候,可能你所遇到的困难没有被有能力帮助你的好心人看到而已。

  前些年,某个城市发生了这样一件事儿:一个小姑娘上学途中被人撞倒,伤得很严重,围观的人群中走出一个小伙子,说愿意把姑娘送到医院,但要求小姑娘先出一些辛苦费。小姑娘拿出身上所有的零钱还是不够,答应对方只要通知了自己的父母,肯定会把钱给他。赶到医院的父母在把孩子送进手术室后转身要付钱,小伙子不仅不要,还把零花钱还给了孩子的父母。原来他只是用这种方法证明自己不是肇事者而已。这个小伙子的担心也正反映了一般人的看法:要不是你撞了孩子,你干吗要把孩子送到医院来呢?你没有这个义务啊?

  与不相识的人交往,人们都会有一种戒备心理,一般地,礼下于人则必有所求,素昧平生那就应该无功不受禄。对于没来由地热心帮助自己的人,有时候难免心里会问个为什么。这也就造成了每个人都充满热心但却担心被拒绝而表现的冷漠。如果你能理解大多数人的这种心理,你就会理解别人为什么没有对你伸出援助之手;如果你相信这个世界早晚会了解你的为人,那么你在出手助人的时候自然落落大方。

  第三定律的推论是:

  推论一:如果有人在没有义务的情况下帮助你,那么,这个家伙,可以做,朋友。

  推论二:如果你帮助了别人,心里的快乐就是最大的酬谢,不要计较对方是否会知道,会记住,或者会回报。

  其实,第一定律说的是家庭和朋友之间的相处之道,第二定律说的是在单位的工作态度和处事方法,第三定律则是讲与陌生人之间的应对。

  很可能,热情的你会觉得这三条定律看上去太冷,太没有人情味儿,可是,做人,固然要热血酬知己,也应该冷眼观世情。(蓝心网)

posted @ 2010-05-03 00:27 weierfu 阅读(290) | 评论 (0)编辑 收藏

2009年11月26日

DX的渲染管道图


http://p.blog.csdn.net/images/p_blog_csdn_net/yanonsoftware/288542/o_pipeline-9.0.png

posted @ 2009-11-26 12:21 weierfu 阅读(187) | 评论 (0)编辑 收藏

2009年9月12日

模型编辑器1

posted @ 2009-09-12 12:47 weierfu 阅读(136) | 评论 (0)编辑 收藏

2009年1月5日

【原创】贴几张最近的工作文档








未完。。。

posted @ 2009-01-05 16:53 weierfu 阅读(1025) | 评论 (3)编辑 收藏

2008年12月28日

【原创】【OGRE人门教程】OGRE源码成功编译记081227

 

OGRE源码成功编译记081227

Made by welflau

1 下载最新的OGRE源码包1.6.0

 

 2 直接解压到D盘根目录下


 

3 打开sln 我装是的VS2005

 

打开后

4 编译生成OgreMain


   

5 会出错,还没下Dependencies

因为链接器中显示了有附加库



 

6 下载ogre-dependencies 注意要下载最新版

下载地址:

http://sourceforge.net/project/showfiles.php?group_id=2997




下一个页面选择


 

7 解压到D:\ogre-l.6.0\ogre




 

解压完后,再重新编译生成

OgreMain编译得要一段时间

而且编译后Obj文件有1.6G左右的大小,所以编译之前要保证你的硬盘有足够的空间

【注意】还有一个Samples文件夹也要覆盖到Ogre目录下



 

里面是执行时所需的dll文件

终于编译完后,不过还是有错,少文件

 

我去 Dependencies\include\zzip 目录下看的确没这个文件

我又下了Dependencies其他版本OgreDependencies_VC8SP1_Eihort_20070323

发现有该文件



8
可能是版本不对再到OGRE官方网站
http://www.ogre3d.org/index.php?option=com_content&task=view&id=412&Itemid=132


 

下载红框所示那个包:OgreDependencies_VC8SP1_Eihort_20071227.zip

解压到OGRE目录D:\ogre-l.6.0\ogre下到重新覆盖一遍

再编译生成

终于成功生成



生成的libdll如下图



 

其中OgreMain生成的目标文件有1.53G


 

【游戏开发】【原创教程连载】WelfGame【第7讲】(08120803按钮颜色可控)

【游戏开发】【原创教程连载】WelfGame【第6讲】(08120702加入皮肤对话框)

【游戏开发】【原创教程连载】WelfGame【第5讲】(WelfGame(08120302三维操作)

【游戏开发】【原创教程连载】WelfGame【第4讲】(08120301导入三维数据文件 .x)

【游戏开发】WelfGame【第3讲】(08120203图像透明及颜色)

【游戏开发】WelfGame【第2讲】(08120202绘制文字和图像)

【游戏开发】原创:我的游戏开发学习过程(连载中...)(第一讲)

posted @ 2008-12-28 17:54 weierfu 阅读(4549) | 评论 (7)编辑 收藏