最开始我打算汉化某些GM8做的游戏, 然后感觉GM8的存储结构难以批量操作或用Git版本管理, 于是我用了GM8.1的社区魔改版GM8.2, 但现成的文本绘制库FoxWriting无法使用(因为GMAPI不支持GM8.1), 所以我就写了一个新绘制库GaseousMarble.
绘制原理是先用外部脚本读取字体文件生成对应的精灵和字形信息, 然后部分绘制该精灵实现. 这样做的好处是复杂的字体操作可以用脚本完成, 但缺点是不知道会用到哪些字符, 如果不写脚本扫描所有会被绘制的字符的话就得把字体中的字符全部导出.
我参考过FoxWriting的源码, 发现他的文本其实并不是用DX绘制的, 而是用GDI提取位图, 调DX的D3DXFillTexture逐像素填充到纹理中. 这样做性能有限, 如果可能的话我希望完全使用DX来绘制文本.
思路是有的, 调GM函数新建一个精灵, 然后在精灵的纹理上用DX绘制文本, 最后调GM函数显示. 然后我就遇到了第一个坎, GM纹理不是渲染目标, 没法在其上使用DX绘制函数. 没关系, 我可以新建一个渲染目标, 再上面画完后再CopyRects到GM纹理上嘛. 但还是不行, 因为绘制事件中是BeginScene状态, 意味着GM正在操控DX设备绘制, 我如果绘制的话最后渲染结果会乱掉. 那能不能新建一个DX设备我画我的, 他画他的呢? 也许行但我没试, 因为跨设备传输数据要过一遍系统内存, 这么一通搞下来怕不是性能还不如FoxWriting的方案了. 虽然目前GaseousMarble的绘制速度比FoxWriting快50%, 但这是因为GaseousMarble压根没处理字体光绘图了.
折腾这么久其实我也累了, GM8.1社区的人太少, 很难找到人交流这些底层技术问题. 我也不懂DX8, 这古代框架除了自带手册也没别的资料了. 即使是汉化, 因为我不是专业人士, 文学素养为零, 所以我的翻译总是充斥着一股西式中文味, 我也不知道要怎么改. 我一直都希望能找个志同道合的人, 但以我的人脉也找不到, 就这样了.
绘制原理是先用外部脚本读取字体文件生成对应的精灵和字形信息, 然后部分绘制该精灵实现. 这样做的好处是复杂的字体操作可以用脚本完成, 但缺点是不知道会用到哪些字符, 如果不写脚本扫描所有会被绘制的字符的话就得把字体中的字符全部导出.
我参考过FoxWriting的源码, 发现他的文本其实并不是用DX绘制的, 而是用GDI提取位图, 调DX的D3DXFillTexture逐像素填充到纹理中. 这样做性能有限, 如果可能的话我希望完全使用DX来绘制文本.
思路是有的, 调GM函数新建一个精灵, 然后在精灵的纹理上用DX绘制文本, 最后调GM函数显示. 然后我就遇到了第一个坎, GM纹理不是渲染目标, 没法在其上使用DX绘制函数. 没关系, 我可以新建一个渲染目标, 再上面画完后再CopyRects到GM纹理上嘛. 但还是不行, 因为绘制事件中是BeginScene状态, 意味着GM正在操控DX设备绘制, 我如果绘制的话最后渲染结果会乱掉. 那能不能新建一个DX设备我画我的, 他画他的呢? 也许行但我没试, 因为跨设备传输数据要过一遍系统内存, 这么一通搞下来怕不是性能还不如FoxWriting的方案了. 虽然目前GaseousMarble的绘制速度比FoxWriting快50%, 但这是因为GaseousMarble压根没处理字体光绘图了.
折腾这么久其实我也累了, GM8.1社区的人太少, 很难找到人交流这些底层技术问题. 我也不懂DX8, 这古代框架除了自带手册也没别的资料了. 即使是汉化, 因为我不是专业人士, 文学素养为零, 所以我的翻译总是充斥着一股西式中文味, 我也不知道要怎么改. 我一直都希望能找个志同道合的人, 但以我的人脉也找不到, 就这样了.