在尝试将我的游戏引擎移植到 mac 时,我偶然发现了一个基本(但很大)的问题。在 Windows 上,我的主要代码如下所示(非常简化):
PeekMessage(...) // check for windows messages
switch (msg.message)
{
case WM_QUIT: ...;
case WM_LBUTTONDOWN: ...;
...
}
TranslateMessage(&msg);
DispatchMessage (&msg);
for (std::vector<CMyBackgroundThread*>::iterator it = mythreads.begin(); it != mythreads.end(); ++it)
{
(*it)->processEvents();
}
... do other useful stuff like look if the window has resized and other stuff...
drawFrame(); // draw a frame using opengl
SwapBuffers(hDC); // swap backbuffer/frontbuffer
if (g_sleep > 0) Sleep(g_sleep);
我已经读到这不是 mac 方式。mac 方式是检查某种事件,例如屏幕的垂直同步以渲染新帧。但正如你所看到的,我想做的不仅仅是渲染,我还希望其他线程也能工作。某些线程的调用速度需要超过每 1/60 秒。(顺便说一句,我的线程基础结构是:线程将事件放入同步队列中,主线程调用 processEvents 处理主线程中同步队列中的项目。这用于网络内容、图像加载/处理内容、柏林噪声代等...等...)
我希望能够以类似的方式做到这一点,但是关于这方面的信息很少。我不介意将渲染放在垂直同步事件上(我也会在 Windows 上实现),但我希望对其余代码有更多的响应能力。
以这种方式看待它:无论如何,我都希望能够在 GPU 做事情的同时处理其余的事情,我不想等待垂直同步然后开始做应该已经被处理的事情然后才开始将东西发送到 GPU。你明白我的意思吗?
如果我需要从完全不同的角度来看待这个问题,请告诉我。
如果我需要为此阅读书籍/指南/教程/任何东西,请告诉我要读什么!
我不是可可开发人员,我不是 object-c 程序员,我的游戏引擎完全使用 C++,但我对 xcode 的了解足以让一个窗口出现并显示我在该窗口中绘制的内容。它只是不像我的 Windows 版本那样更新,因为我不知道如何正确处理它。
更新:我什至相信我需要某种循环,即使我想在垂直回溯上同步。MacOSX 文档上的 OpenGL 编程表明这是通过设置 SwapInterval 来完成的。因此,如果我理解正确,在 Mac 上实时渲染时,我总是需要某种循环,使用 swapInterval 设置来降低功耗。这是真的?