标签: <span>c++</span>

C++ 异步编程框架

之前公司项目中一直没有方便好用的异步编程框架,在开发过程中会遇到一些问题。比如多线程编码时开发需要自己管理线程,并在两侧同步数据。一些操作也会被直接放在主线程中,就算单个操作的耗时并不明显,长此以往也会积少成多,最终拖慢了 UI 的速度。

但好在公司的代码库已经支持 C++11,我们基于 C++11 开发了一个仅使用标准库的框架。这样既能简化业务开发时的代码工作量,也可以提高代码的可读性,而且使用 std 组件实现也方便支持所有平台。更进一步的话还可以给框架加入其他支持,如:

  • task 优先级
  • task 延迟调用、重复调用,并可自定义调用间隔等属性
  • 指定多个 task 在同一个线程中运行

C++ 程序的逆向分析以及 RTTI 信息检索

分析 C++ 程序时,要是能从一个二进制文件中识别出 C++ 程序的结构,并且能标识出一些主要的类和它们的关系是非常有帮助的。而其中为了实现运行时类型识别而生成的运行时类型信息(Runtime type information,RTTI)也能在程序分析上提供方便。

注意,文中讨论的 C++ 可执行文件仅限于使用 MSVC 编译器编译出的 C++ 可执行文件。

●识别类及其构造函数


菱形继承的内存布局

菱形继承来自于多重继承,是为了解决具有歧义的组合而产生的一个结果。通过引入虚继承,使得多个由虚基类直接或间接派生的类拥有一个共同的基类实例。实现上相当于派生类绕过了父类直接继承了祖父类(虚基类)。
下面我们通过 MSC 14 编译器(VS2015)来看一下菱形继承的实现细节。


DirectWrite 文字描边

直接用 rendertarget 的 DrawText 方法显示文字的话无法为文字增加描边,用路径对象配合字体字形进行显示,并在内部用画刷填充的话可以达到描边的效果。


水面效果的2D实现

游戏里需要一个背景,直接贴 2d 图片的话显得有些单调了,打算做个动态的背景。用水面的话视野比较广阔,感觉比较合适。因为游戏是直接用 dx 写的,所以水面的实现也自然是写 shader 来完成了。