常见问题解答

From KlayGE
Jump to: navigation, search

问:KlayGE是什么?

答:KlayGE是一个开放源代码、跨平台的游戏引擎。它是用C++开发的,并使用Python作脚本语言。KlayGEGPL协议下发行。

问:为什么说KlayGE是最先进的开源游戏引擎?

答:在KlayGE的研发过程中,参考了大量最新最前沿的技术,比如实时GI、虚拟纹理、任意放缩字体、基于物理的渲染等,通过很多努力使其实用化。在效果上和效率上远远超越其他流行的开源游戏引擎,甚至可以比肩绝大多数顶级封闭游戏引擎。同时仍然保持了轻量灵活的优点,也强于某些笨重臃肿的封闭引擎。

问:KlayGE是你一个人开发的吗?

答:是也不是。几乎所有的开发都是我一个人完成的。但在这个过程中使用了一些第三方的代码,比如7zip的解码部分。不少朋友也在开发的过程中给予了不可或缺的帮助。从3.12开始,很多功能是由开发团队的其他成员完成的。详见发展历程

问:哪里能找到KlayGE的文档?

答:目前KlayGE的文档仅限于本wiki上的内容。文档缺乏的原因主要是我没有足够的时间去写,另外我更希望用代码本身来自我诠释。

问:为什么选择了GPL?

答:在KlayGE 2.7之前使用的是LGPL协议,但后来为了保护它不被某些专有软件吞并,所以换成了GPL

问:为什么用Python而不是LUA?

答:KlayGE 2.0之前(当时还叫作Clay! Engine),LUA是首选的脚本语言。LUA的优点是速度快,缺点是在C++中的调用极其麻烦,而且语言本身能力较弱。Python速度不如LUA, 但是语言能力强大得多,也不必写成栈式的调用方式,简洁得多。在KlayGE中,脚本不是为了效率而存在的,所以Python成了不二之选。

问:为什么必须要有Shader Model 2.0及以上?

答:KlayGE是一款面向高端的引擎,所以在一定程度上要用较高的配置,以满足先进技术的需要。另一方面,Shader Model 2.0并不算一个很高的要求,市面上的新显卡几乎都是支持Shader Model 3.0的。对于游戏开发者来说,如果现在还在使用不支持Shader Model 2.0的硬件,那只能说实在落后得太多了。

问:KlayGE的网络部分如何?

答:KlayGE中的网络是弱项,甚至可以说几乎无法使用。所以需要重新开发,或者使用别的网络库。

问:编译例子的时候出现像这样的连接错误信息:“libcmtd.lib(dbgheap.obj) : error LNK2005: __CrtSetDbgFlag 已经在MSVCRTD.lib(MSVCR80D.dll) 中定义”,请问如何解决?

答:由于KlayGE在VC下使用的运行库是多线程的DLL,所以需要把所有连接到exe的lib的运行库改为 多线程DLL(Project- >Properties->Configuration Properties->C/C++->Code Generation->RuntimeLibrary,选择Multi-threaded Debug DLL/Multi-threaded DLL)。

问:Boost编译的时候应该用什么参数?

答:Boost 1.36的编译参数可以通过bjam的命令行参数来设置,可以写一个批处理文件,内容是:

SET BZIP2_SOURCE="D:/bzip2-1.0.5"
SET ZLIB_SOURCE="D:/zlib-1.2.3"
SET ICU_PATH="D:/icu4c-3_6"
bjam --toolset=msvc-9.0 --stagedir=./lib_vc9_x86 --builddir=./ address-model=32 link=shared runtime-link=shared threading=multi cxxflags=-wd4819 
 cxxflags=-wd4910 define=_CRT_SECURE_NO_DEPRECATE define=_SCL_SECURE_NO_DEPRECATE define=_SECURE_SCL=0 stage debug release
bjam --toolset=msvc-9.0 --stagedir=./lib_vc9_x64 --builddir=./ address-model=64 link=shared runtime-link=shared threading=multi cxxflags=-wd4819 
 cxxflags=-wd4910 define=_CRT_SECURE_NO_DEPRECATE define=_SCL_SECURE_NO_DEPRECATE define=_SECURE_SCL=0 stage debug release

直接在boost的目录下运行这个批处理就可以编译出dll版本的boost库。

问:为什么在Visual Studio里运行例子的时候ResLoader::Load出现assert failed?

答:需要在Visual Studio中把工程的Working Directory设置成$(OutDir)。此问题在KlayGE 3.10中不再出现。

问:在编译的时候提示”‘yasm’ is not recognized as an internal or external command, operable program or batch file.”,如何解决?

答:根据设置,Visual Studio的编译工具必须能调用yasm才能编译.asm的文件。解决方法之一是把下载下来的yasm-X.X.X-winYY.exe(X表示版本 号,YY表示32或64)改名成yasm.exe,并拷贝到VC的bin目录下,比如”C:\Program Files\Microsoft Visual Studio 9.0\VC\bin”。(注:这个问题实际上不该出现在本FAQ中,因为这其实是个命令行调用的问题,谁都该会的。可悲于国内“开发者”的素质,竟然有 不少人都问了我该问题,使得我不得不将它写在这里。)此问题将在KlayGE 3.11中避免。

问:为什么KlayGE要抛弃D3D9?

答:KlayGE从3.11开始删除了D3D9插件。实际上目前D3D9存在的唯一理由是Win XP用户。但其中大部分人都是有D3D10的GPU,而因为XP被限制在了D3D9上。其实XP下的OpenGL驱动也是与时俱进的,可以给XP带来原本属于D3D10/11的新GPU能力。相比D3D9,OpenGL在XP上有更多的功能和更高的性能。因此KlayGE坚决地去掉了D3D9,让OpenGL接手D3D9在XP上的任务。

问:为什么KlayGE要抛弃D3D10?

答:KlayGE从3.11开始删除了D3D10插件,由D3D11来取代它。D3D11并不一定要D3D11的GPU,在D3D10的GPU上,D3D11的功能相当于原有D3D10的,加上compute shader 4.0,以及可能有multi-threading。其性能取决于厂商驱动,目前来说性能可以做到和D3D10完全一致。D3D11在早期硬件上执行,只会带来好处,没有损失。D3D10已经完全没有存在的必要。