Reflection系统


最近在研究游戏引擎Core模块,其实这部份对AI来说并不是直接相关的,属于游戏最底层的接口,像数学库,内存管理,文件系统,以及对系统接口的封装等等。不过有个东西却引起了我极大的兴趣,并且在某种程度上和AI联系紧密,即Reflection系统,虽然这样的库很通用,一般都是找一个来直接用,没人会重头去做一个,但研究一下代码我觉得有两个好处,一是实现一个Reflection系统都会用到一些C++的高级特性和技巧,可以借以提高一下,二是我觉得在引擎里集成Reflection已经是一个趋势,熟悉一下总没有坏处。

Reflection是中文翻过来的说,叫反射系统,按照wikipedia上定义,“在计算机科学中,反射是指一种特定类型的计算机程序能够在运行时以一种依赖于它的代码的抽象特性和它的运行时行为的方式被更改的特性。用比喻来说,那种程式能够"观察"并且修改自己的行为。”,是不是看着超级晕,没事,一会儿我举个例子。Reflection并不被C++语言本身所支持,不过一些高级脚本语言,如Java,Python,Ruby,C#,Lua等都支持了Reflection的概念,就以Java来举个例子:

//常规方法,没有Reflection的类实例的创建,和类方法的调用
Foo foo = new Foo();
foo.hello();

//用Relection来创建类的实例和类方法的调用
Class cls = Class.forName(“Foo”); //通过名字得到类的类型
Object foo = cls.newInstance();   //创建类实例
Method method = cls.getMethod(“hello”, null);
//通过名字得到类方法
method.invoke(foo, null); //调用类方法

其他语言的代码和调用方式基本一致,给人第一感觉是用Reflection反而需要写更多的代码,好像并不方便,但我们可以看到,用Reflection,我们可以在运行时来得到类类型,动态的创建不同的类对象,调用方法,并且可以用统一的调用接口。相当Cool~。在我们引擎里用C++来做了一套Reflection系统,作为和Lua和C#的接口,实现了C++内的函数和变量的输出。我所说的和AI的关系密切就是体现在此了。
今天还在看代码,看了一部份,还没有吃透,做个引子,以后再写。

————————————————————————
作者:Finney
Blog:AI分享站(
http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————



(已被阅读847次)

2 评论

发表评论

电子邮件地址不会被公开。

Copyright © 2011-2017 AI分享站    登录