python - SetDIBitsToDevice() 太慢?
问题描述
我有一个 Hamamatsu Photonics 的硅上液晶空间光调制器(LCOS SLM),它基本上是一个 1280 x 1024 像素的屏幕,通过 DVI 连接到我的显卡。它可以显示8bit灰度图像,即像素值从0到255。
我正在使用 WINAPI 函数SetDIBitsToDevice()在 SLM 上绘制预先计算的 1280 x 1024 8 位设备无关位图 (DIB)(带有正确的标头和所有内容)。我在 python 中使用 ctypes 的实现是这样的:
def draw(data: numpy.array): # data has dtype=numpy.uint8 and lies in memory like a standard C-array in 8bit format, row-major order
data_p = data.ctypes.data_as(ctypes.c_void_p) # pointer to data of C-type void*
SetDIBitsToDevice(SLM_HDC, # display context of screen
0, 0, 1280, 1024, # fill whole screen
0, 0, 0, 1024, # draw whole data-array
data_p, pbmi, 0) # pbmi is a ctypes.POINTER(BITMAPINFO), i.e. of C-type BITMAPINFO*
如果您有兴趣,可以在我对这个问题的回答中找到更多实现细节。例如,您可以在具有 2 个屏幕的任何计算机上运行,从我的dropbox下载,在显示测试文件中调整屏幕分辨率并运行它。关键是它可以在办公室的普通液晶显示器和 SLM 上工作。
但是:在 SLM 上,我在屏幕开始更新之前测量了 > 70 毫秒的延迟。由于 60Hz DVI 频率和 120Hz SLM 频率,预期的最大延迟为 1/(60Hz) + 1/(120Hz) = 25 毫秒。我在 python 中所做的只是上述函数中的两行代码;其他一切都是预先计算好的和静态的。你能看到任何会导致超过 40 毫秒延迟的编程原因吗?我希望我犯了一些愚蠢的错误,有人可以指出。
PS 我很难联系到滨松的技术支持,所以我没能请教专家。
解决方案
推荐阅读
- jmeter - 如何将相对时间发送到 JMeter JTL 中的每个采样器
- c# - 在 Unity 中设置 Sprite 的位置
- c# - C#:使用 Microsoft Azure 文本到语音 API 的中文拼音 SSML 语法
- javascript - React Native TextInput 保存到 const
- php - 错误:未定义的属性:Account::$Account_model
- google-chrome-extension - Webstore 扩展的 manifest.json 中语法“no_option_page”和“PlatfomType”的作用是什么
- react-native - TabView 在 ImageBackground 中不起作用
- ruby-on-rails - 如何在 Simple_Form collection_radio_buttons 上使用集合的其他方法?
- c# - RichTextBox doesnt show scrollbars and text goes off limit
- javascript - 迭代对象数组以合并新对象