游戏框架和跨平台编程

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,同时会让人难以阅读或者理解。所以如何拆分它们,用什么设计模式或者原则需要仔细考量。

猜你喜欢

转载自blog.csdn.net/weixin_44200074/article/details/106193040