05/18/2020
05/23/2020 SDK 和 API 分别是什么?
游戏框架和跨平台编程
Game Framework and Cross-Platform Programming
框架(Framework)
HolleyWood Principle: “Don’t call us, we will call us”
什么是框架
看一下接受或者释放按键的例子:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN: //按键按下
//your code
break;
case WM_KEYUP: //按键释放
//your code
break;
}
}
上面WndProc这个函数关于接受或释放按键,当一个键按下,自己需要填写你自己需要的代码。当实现完这个函数,你并不需要调用这个函数,这个函数是由windows操作系统来调用的,你只需要负责完成部分实现。这就是框架,类似于填空。
框架与库(framework vs lib)
框架类似于填空,程序员自己来实现缺失函数,函数的调用由框架决定。库是使用别人写好的第三方库加入到自己的代码中,来实现某些功能,并自己调用它们。
为什么使用框架
- 简化用户代码
- 在重构之后与版本更新之后,保持用户行为一致性。例如函数的参数
- 强制某些行为,一些函数的调用顺序由框架决定,你无法改变
组件式编程
class Object
{
protected:
virtual void PostLoad();
private:
void LoadData()
{
//...
//...
//other code
PostData();
//...
}
};
class MyEntity:public Object
{
protected:
Array<Component*> mComponents;
virtual void PostLoad() override
{
for(auto comp:mComponents)
{
printf("%d",comp.getName());
}
}
};
上述例子,当你继承Object,并重写父类的PostLoad方法之后,你并不需要自己调用这个函数,游戏引擎会自动调用它们。
跨平台编程
针对每一个平台写出不同的代码,还是只写一份代码针对所有平台。大多数百分之90来说针对所有平台只写一份代码,剩下的少部分可以针对每一种不同的平台写出它们自己的代码。
软件开发工具包(SDK)
辅助开发软件的相关文档,范例,和工具的集合叫做SDK。要想理解SDK,首先需要理解API,操作系统留给应用程序的调用接口叫做API,这些接口有可能需要配上文档说明,如何使用这些接口的范例,和需要给定工具进行编译,调试等,这些辅助功能叫做SDK
API是一些预定好的函数,是软件系统不同组成部分衔接的约定,在设计原则中提到过,针对接口编程,而不是针对接口实现编程。
- API分为两种:
- 系统级API
- 非系统级的自定义API
- 更加复杂化的接口
- SDK限制版本在用户与平台之间
- SDK提供向后兼容
集成开发环境(IDE)
- 文本编译
- 与编译器和平台无关
编译器
- 预编译平台
- 集合到IDE中
- 大多数由SDK提供
C Runtime (比较重要)
- 实现C的基础特性,such as memcpy,你并不知道在哪儿实现,但是你可以调用它们,其实由操作系统实现
- 头文件由SDK提供
- 所有的App依赖于C Runtime
标准模板库(STL)
- 头文件与实现由SDK或者编译器提供
- 每一个平台的每一个SDK版本的实现是分开的
例子:
C++有自己的容器,比如vector,游戏引擎也有自己的容器,由于C++自带的容器功能太多,大多数功能并不需要或者不理想,所以游戏引擎会有自己的容器。
太多if-else并不好
由于所有平台只写一份代码,如何针对不同的平台调用自己的函数?
写一个错误样本:
class File
{
void Open(const char*)
{
#if define(PS4)
//...
#elif defined(Windows)
//...
#endif
}
};
如果有过多的平台,将会产生过多的if-else,同时会让人难以阅读或者理解。所以如何拆分它们,用什么设计模式或者原则需要仔细考量。