【发布时间】:2021-07-26 23:09:54
【问题描述】:
我正在使用 windows.h "TextOutW" 函数将文本打印到位图。打印常规 ascii 确实很快,但 unicode 范围内的打印似乎会导致速度大大减慢。这是我打印 unicode 方块并测试持续时间的代码:
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() << "ms\n";
打印 'H' 1000 次大约需要 5 毫秒 打印 0x25A0 1000 次大约需要 50 毫秒
【问题讨论】:
-
您没有将有效字符串传递给
wcslen或TextOutW。 -
不,你不会。您正在使用 Unicode API 和显式宽字符。这些都不取决于构建配置。如果您切换到
TCHARs,情况就会发生变化,正如我所指出的,没有人再使用它了。这是 Microsoft 有 2 种不同的操作系统系列时的遗留物,一种不支持 Unicode,另一种支持。今天,只有一个操作系统。无论如何,我们仍然看不到您是如何确定减速的。 -
@i486 Windows 本身在内部使用宽字符,因此如果您使用 ANSI 模式函数,它无论如何都必须进行转换。您之前的示例不能用作 ANSI 字符串,因为 0x25a0 不适合单个字节,即使可以,也不是有效字符。
-
@i48 通用文本映射(如
TCHAR)的唯一目的是能够编译单个源代码库以在 Windows NT 和 Windows 9x 上运行. MSLU 甚至缓解了这种需求。 MSLU 已在 两年 年前发货。因此,即使您是少数仍然需要针对已失去支持超过 15 年的操作系统的开发人员之一,您甚至不需要TCHARs。虽然,你是对的,当然。我应该说:“没有人会推荐使用TCHARs”。 -
@i48
LPCWSTR的用途与TCHAR完全不同。它将语言级别的类型映射到 ABI 类型。与TCHAR不同,LPCWSTR是明确的。如果您在代码中看到它,毫无疑问它映射到什么。与TCHAR不同,它需要您的代码阅读者查看您的构建配置以了解它是什么,并提出更改该代码是否需要与 ANSI 和 Unicode 兼容的问题。使用TCHAR会使代码更难阅读和理解,完全没有任何好处。