去年,KlayGE就已经有了Windows Store的版本和Windows Phone的版本。随着Win10的推出,UWP成了统一两者的平台。CMake 3.4加入了UWP的支持之后,KlayGE也很顺利地增加了UWP的支持。
UWP的用法
在CMake 3.4中用UWP非常简单,和原先用Windows Store的完全一样,只是系统版本号改成10,仅此而已(-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0)。所以代码其实都没改,只需要增加一个UWP的manifest。为了方便起见,在代码和CMake里定义了KLAYGE_PLATFORM_WINDOWS_UWP,用来表明是UWP的build。
另一个细节需要注意,在UWP应用里,小图标的大小是44x44,而不是30x30。
ARM的桌面
UWP讲究一份代码各种架构。但在编译ARM ...
自从Win8引入WinRT以来,主流开发者的说法一直是,C++/CX可以方便地把现有C++代码移植到WinRT。一般来说确实如此,绝大部分原有C++代码可以的保留,只需要写UI的部分就可以了。但因为C++/CX的引入,还是会带来一些副作用,不完全都是好处。本篇将以KlayGE为例,讲解如何在不用C++/CX的情况下完成WinRT应用(包括UWP)。
C++/CX的功与过
C++/CX使用起来挺方便,语法和原先的C++/CLR极其相似,但是native的,没有虚拟机执行开销。任何懂C++的人都可以很快上手,把程序移植到WinRT。同时,WinRT背后一大套COM机制都被隐藏掉了,可以直接用普通的类一样使用COM对象。
但是,仔细观察就能发现,在C++项目中加入C++/CX有几个缺点。
C++/CX ...
Metro是Win8的一个重要组成部分。对用户来说,Metro给移动和桌面(尤其是触摸设备)带来了全新的体验;对开发者来说,可以把Metro当作一个基于WinRT的新平台。传统程序在Win8上只能以desktop方式执行,可以访问所有传统Win32 API;Metro程序则只能访问一部分通过WinRT暴露出来的API。从开发体验来看,Metro更类似于移动平台的方法,程序需要经过deploy、签名、打包,才能分发。
API的差异
有很多Win32 API在新的WinRT中已经消失了,需要绕开或者用WinRT的函数重写。和当年移植到Android的过程一样,首先需要解决Boost的移植问题。这里借用的是Ogre的Metro补丁,它原先是针对boost 1.50的,需要手动一个个修改才能应用于boost 1.51。大部分 ...