如何加快打印Unicode



我使用的是windows.h"TextOutW";函数将文本打印为位图。打印常规ascii确实很快,但在unicode范围内的打印似乎会导致巨大的速度减慢。这是我打印unicode square的代码;测试持续时间:

wchar_t b = 0x25A0;
LPCWSTR s = &b;
TextOutW(hMyDC, x, y, s, wcslen(s));

有什么方法可以加快速度吗?

编辑:我用计时器运行循环以测试速度:

using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;
using std::chrono::duration;
using std::chrono::milliseconds;

auto t1 = high_resolution_clock::now();
for(int i = 0; i<1000; i++){
TextOutW(hMyDC, 25, 25, s, 1);
}

auto t2 = high_resolution_clock::now();
//  auto ms_int = duration_cast<milliseconds>(t2 - t1);
duration<double, std::milli> ms_double = t2 - t1;
cout << ms_double.count() << "msn";

打印"H"a 1000次大约需要5毫秒打印0x25A0 1000次需要大约50ms的

问题是您指向的是单个字符,而不是字符串。wcslen表现出未定义的行为,并且可能返回非常大的数字。用1替换它,事情应该会大大加快。

您正在点击Uniscribe。ExtTextOutWTextOutW检查文本是否应该通过Uniscribe线程传递或直接传递到GDI。

为了避免Uniscribe开销(不推荐(,您可以将ETO_IGNORELANGUAGE传递给ExtTextOutW,但您会错过一些更高级的脚本(CJK,又名中文+日语+韩语,从右到左书写,字符根据放置位置而改变形状等(或根本没有文本。

对于0x25A0字符,我得到大约8×的减速

对于0x6F22,减速增加到17×

在我的系统上,当指定了ETO_IGNORELANGUAGE时,没有减速。0x25A0显示正确,0x6F22替换为默认框。

这不是一个答案。我只是想发布代码来确认这个问题的时间。

对于注释掉的字符,我得到7-8毫秒,对于0x25A0,我得到~50毫秒。

我使用Times New Roman是因为这个页面声称它有UNICODE符号。

#include <iostream>
#include <chrono>
#include <windows.h>
int main()
{
wchar_t b = 0x25A0;
//wchar_t b = 0x0416;
//wchar_t b = L'H';
LPCWSTR s = &b;
HDC hDC = ::GetWindowDC(::GetDesktopWindow());
HFONT hFont = CreateFontW(36, 20, 0, 0, FW_DONTCARE, FALSE, TRUE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, L"Times New Roman");
HGDIOBJ hOld = ::SelectObject(hDC, hFont);
auto t1 = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++) {
TextOutW(hDC, 25, 25, s, 1);
}
auto t2 = std::chrono::steady_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << " msec" << std::endl;
return 0;
}

最新更新