我有一个小问题.
我承认在.Net 4.5之前我没有多次使用多线程,但是有了新的async/await功能,我决定尝试一下.我开始尝试它,一切似乎都很好,但我无法在网络上的任何地方找到解决我的"问题"的方法.
所以每个人都解释了如何await使用.Net平台的新转换方法(例如WriteAsync(),ReadAsync()等等),但是如果我想将它用于我自己的方法呢?例如,假设我正在执行一项极其昂贵的计算,并且希望我的所有4个内核都在使用它.我会有类似的东西:
async Task DoLotsOfWork<T>(T[] data, int start, int end)
{
//Do very expensive work
}
Run Code Online (Sandbox Code Playgroud)
但由于我没有await关键字,因此该方法仅被视为同步方法.我想从外面调用它4次,以便它可以在我的所有核心上运行,同时我向用户显示一些合理的东西(例如"请等待......").我能够弄清楚的唯一解决方案是await Task.Yield();在方法的开头添加一个.像这样的东西:
async Task DoLotsOfWork<T>(T[] data, int start, int end)
{
await Task.Yield();
//Do very expensive work
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该方法将按照我的预期行事.但是有更好的解决方案吗?我觉得应该比编写那行代码更容易/更明智.我知道我可以创建一个Task/Thread对象并调用该Start()方法,但这需要更多的工作.我只是认为使用新的异步/等待功能这种事情会更容易.
我正在用 openGL 编写一个 2D 游戏,在渲染覆盖整个窗口的几个纹理时遇到了一些性能问题。
我所做的实际上是创建一个具有屏幕大小的纹理,使用 FBO 将我的场景渲染到该纹理上,然后使用不同的偏移量渲染纹理几次以获得一种“阴影”效果。但是当我这样做时,在使用我的集成显卡时性能会大幅下降。
所以总而言之,我在整个屏幕上渲染了 7 个四边形(背景图像,5 个带有黑色“色调”的“阴影图像”和具有真实颜色的相同纹理)。我正在使用大小为 1024x1024 的 RGBA 纹理并将它们放在 900x700 的窗口中。当我不渲染纹理时,我得到 200 FPS,而当我这样做时,我得到 34 FPS(在这两种情况下,我实际上创建了纹理并将场景渲染到它上面)。我觉得这很奇怪,因为我基本上只渲染了 7 个四边形。一个奇怪的事情是,当我运行 CPU 分析器时,它并不表明这是瓶颈(我知道 opengl 使用管道架构,这件事可能会发生,但大多数时候不会)。
当我使用外置显卡进行上述测试时,我获得了一致的 200 FPS。但是当我禁用场景渲染到纹理并禁用纹理渲染到屏幕上时,我得到了大约 1000 FPS。这仅发生在我的外部视频卡上 - 当我使用集成的禁用 FBO 时,我得到相同的 200 FPS。这真的让我很困惑。
谁能解释一下发生了什么,以及上面的数字是否正确?
集成显卡 - Intel HD Graphics 4000
外置显卡 - NVIDIA GeForce GTX 660M
PS 我正在用 C# 编写我的游戏 - 所以如果有任何帮助,我会使用 OpenTK。
编辑:
首先感谢所有的回复——他们在某种程度上都非常有帮助,但不幸的是,我认为它不仅仅是“简化/优化你的代码”。让我分享一些我的渲染代码:
//fields defined when the program is initialized
Rectangle viewport;
//Texture with the size of the viewport
Texture fboTexture;
FBO …Run Code Online (Sandbox Code Playgroud)