n2的基本架构是这样的(从上至下):
具体的应用程序,一般是我们编制的程序.
nebula class 层(主要提供具体任务的一些编程结构,粒子,纹理,以及动画等)
server层(由各种各样的服务器组成,他们一般都是完成一些常见的任务,比如渲染,输入控制以及运行脚本等)
Kernel 层(创建nebula 对象,并且负责kernel层次的工作,比如内存管理,线程,定时器,文件系统,产生和释放对象等这样的事情)
os(渲染API,封装了D3D以及OPENGL)
一些补充: 1 应用程序在运行的时候,Kernel层将最先被创建.
2 server层拥有许多服务器,是按照模块化的思想进行设计的,这样使得各个服务器变得更加好管理和维护.
如何编译N2?
之前我在编译的时候经常出错,后来就一度放弃了.
现在采用了appwiard,来生成一个工程,按照wizard上面的提示进行一些操作,在进行第一个界面的时候,这个时候要选择一个路径,最好要创建一个文件夹什么的.那么这个appwizard生成的文件都将保存在这个文件里面.这个文件夹主要保存的是,bldfiles,inc,以及 src.这个bldfiles里面主要的包含一个bld文件,这个bld文件主要是配置这个工程的信息.
beginmodule asclass
setdir msubdir
setfiles {
asclass_main
asclass_cmds
}
setheaders { asclass }
endmodule
#-----------------------------------------------------------------------------
beginmodule acname
setdir msubdir
setfiles {
acname_main
acname_cmds
}
setheaders { acname }
endmodule
#-----------------------------------------------------------------------------
beginmodule aname
setdir msubdir
setfiles { aname }
endmodule
#-----------------------------------------------------------------------------
begintarget tname
annotate "Insert a brief annotation of the target"
settype exe
setmodules {
asclass
acname
aname
}
settargetdeps {
nkernel
nnebula
microtcl
ndinput8
ndirect3d9
ndshow
ndsound
ngui
nnetwork
napplication
npythonserver
}
endtarget
#-----------------------------------------------------------------------------
beginworkspace tname
settargets {
tname
nkernel
nnebula
microtcl
ndinput8
ndirect3d9
ndshow
ndsound
ngui
nnetwork
napplication
npythonserver
}
endworkspace
这里是个很好的比照,asclass对应beginmodule asclass,里面规定 头文件以及对应的源文件呢.
acname对应beginmodule acname,里面同样规定了对应的 头文件和对应的源文件.
tname对应begintarget tname,里面就对应整个tname工程文件了.
beginworkspace tname,这里面就是要对应的整个工程的.
在这里有点值得说明的是:在编译的时候,选择了pythonserer,所以要在编译这个工程之前先编译npythonserver工程.在编译以后,可能会遇到这样的情况,
编译的时候会说,npythonrun.obj的什么连接错误,(没有记下来,不好意思)
以及npythonserver.obj的连接错误.那么的话,就要做一件事情:
以及
在npythonserver的lib里面要使用这两个全局函数,但是这个两个函数在那个lib里面是没有写真正实现的,要你在其它地方写. (我当时的问题是:)
Linking...
npythonrun.obj : error LNK2019: unresolved external symbol "void __cdecl nPythonInitializeEnvironment(void)" (?nPythonInitializeEnvironment@@YAXXZ) referenced in function "public: virtual bool __thiscall nPythonServer::RunScript(char const *,class nString &)" (?RunScript@nPythonServer@@UAE_NPBDAAVnString@@@Z)
npythonserver.obj : error LNK2019: unresolved external symbol "char const * __cdecl nPythonModuleName(void)" (?nPythonModuleName@@YAPBDXZ) referenced in function "public: __thiscall nPythonServer::nPythonServer(void)" (??0nPythonServer@@QAE@XZ)
../../bin/win32d/tname.exe : fatal error LNK1120: 2 unresolved externals
Build log was saved at "file://f:/precious nehula2 device/nebula device/trunk/nebula2/build/vstudio8/inter/win32d/tname/BuildLog.htm"
tname - 3 error(s), 0 warning(s)
npythonrun是存在的,所以没有不存在的问题.
说明了nPythonInitializeEnvironment和nPythonServer这两个函数,没有定义之类的,但是在npythonhooks里面又存在两个这样的函数,于是要写个自己的实体,"那个函数你要在你自己的工程里面写上实体"感谢gddsky.:)
这样话,就可以确保他顺利编译成功了.
你看npythonhooks.cc文件,你可以将它复制过来,放到你自己建立的工程去. 再次感谢gddsky.
在编译npythonserver成功以后,就要将添加对应的lib到工程里面去.
然后值得补充的一条是:
在编译的时候,要注意添加相应的库文件.
比如:
以及
这里说明的是:1 第一个是将用npythonserver里面编译出来的lib放到additional dependecies上面,具体的位置是tname所对应project property,->configuration->Linker->Input,在additional denpency上面添加就可以了,当然也要添加对应的头文件落,一般在tools->options->vc++directory上面,
2 第二个是对应的library文件,tools->options->vc++directory->library files里面,一般包括了nebula2的依赖lib文件和mangalore的依赖lib文件.当然还有对应的build以后的文件,一般放在buid/vstudio8/inter/win32d里面,这里,所有编译好的lib文件都在这里.当然不能错过了,所有这些都谢谢gddsky,他帮了我很大的忙.
另外因为vc2005已经自带了dx,并且据称他的版本比市面上的DX版本还新,(我不敢肯定,但是一定有这样的事情,所以我一般都用VC2005自带的DX版本).
n2究竟是什么东西,如果将她按照客户端和服务器端划分的话,那么应该归于哪一类呢?
主要是做为client的呢,但是因为有了nnetwork的插件,也可以做成server了,nnetwork有sessionsServer与netServer,看起来应该是支持两种模式,一种P2P一种是CS. --gddsky.