1. 问题
-
CreateDXGIFactory1 太慢!
-
CreateDXGIFactory2 太慢!
2. 验证
1 | int main() { |
测试结果:
1 | // CPU: Intel(R) N100 |
居然平均 10ms 以上,确实太慢!
3. 解决
既然创建类工厂慢,就不要频繁创建,创建后把它缓存起来。
新问题:缓存失效怎么办?
There are only two hard things in Computer Science: cache invalidation and naming things.
– Phil KarltonPhil Karlton:计算机科学领域有两个难题:一个是缓存失效,另一个就是命名。
以下是 MSDN 说的:
Informs an application of the possible need to re-create the factory and re-enumerate adapters.
FALSE, if a new adapter is becoming available or the current adapter is going away. TRUE, no adapter changes.
IsCurrent returns FALSE to inform the calling application to re-enumerate adapters.
这就很含糊了,IsCurrent 返回 FALSE 时,究竟该 re-enumerate adapters,还是 re-create the factory?
假设稣需要反复调用 EnumAdapterByLuid,如果只 re-enumerate adapters,那么稣每次直接用 EnumAdapterByLuid 即可,根本不需要理会 IsCurrent。所以这显然是错的,真正需要的是 re-create the factory,再 re-enumerate adapters。
这点可以在类工厂创建后,禁用和启用显示适配器来验证。根据稣的测试,类工厂创建后,禁用显示适配器,此时 IsCurrent 返回 FALSE,依然可以枚举出被禁用的显示适配器。只有重建类工厂,才能得到当前正确工作的显示适配器。