8,303
社区成员
发帖
与我相关
我的任务
分享
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == FALSE)
{
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
}
Sleep(0);
}
volatile LONG g_Mutex = FALSE;
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == FALSE)
{
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
}
Sleep(0);
}
#include <stdio.h>
#include <windows.h>
// 假设是这样一种结构:
// 1:帧开始
// 2:计算AI和物理
// 3:处理图形逻辑
// 4:进行渲染
// 5:在渲染的过程中,计算下一帧的AI和物理
// 6:渲染完毕,重复3
enum
{
FRAME_STATE_AI = 0x00000001, // 包括物理计算
FRAME_STATE_LOGIC = 0x00000002, // 图形逻辑处理
FRAME_STATE_RENDER = 0x00000004, // 渲染状态
};
volatile LONG g_Mutex = FALSE;
UINT g_FrameState = FRAME_STATE_AI;
// 渲染线程
void MainThread_Render()
{
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == FALSE)
{
// 处于渲染状态
if (g_FrameState & FRAME_STATE_RENDER)
{
// 渲染部分
{
printf("渲染开始...\n");
getchar();
}
g_FrameState &= ~FRAME_STATE_RENDER; // 清除渲染状态
printf("渲染完毕...\n");
getchar();
}
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
}
Sleep(0);
}
}
// AI逻辑处理(包括物理)
DWORD WINAPI SubThread_AILogic(LPVOID lpParam)
{
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == FALSE)
{
// 处于AI计算状态
if (g_FrameState & FRAME_STATE_AI)
{
// 执行AI计算
{
printf("AI计算开始...\n");
getchar();
}
g_FrameState &= ~FRAME_STATE_AI; // 清除AI计算状态
g_FrameState |= FRAME_STATE_LOGIC; // 设置图形逻辑状态
printf("AI计算完毕...\n");
getchar();
}
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
}
Sleep(0);
}
}
// 图形逻辑线程
DWORD WINAPI SubThread_GraphicsLogic(LPVOID lpParam)
{
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == FALSE)
{
// 当前处于图形逻辑处理状态下,且不在渲染状态下
if ((g_FrameState & FRAME_STATE_LOGIC) && !(g_FrameState & FRAME_STATE_RENDER))
{
// 执行图形逻辑
{
printf("图形逻辑处理开始...\n");
getchar();
}
g_FrameState &= ~FRAME_STATE_LOGIC; // 清除图形逻辑状态
g_FrameState |= FRAME_STATE_RENDER; // 设置渲染状态
g_FrameState |= FRAME_STATE_AI; // 设置AI计算状态(下一帧)
printf("图形逻辑处理完毕...\n");
getchar();
}
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
}
Sleep(0);
}
}
int main()
{
::CreateThread(NULL, 0, SubThread_AILogic, NULL, 0, NULL);
::CreateThread(NULL, 0, SubThread_GraphicsLogic, NULL, 0, NULL);
while (true)
{
MainThread_Render();
}
return 0;
}
#include <stdio.h>
#include <windows.h>
// 假设是这样一种结构:
// 1:帧开始
// 2:计算AI和物理
// 3:处理图形逻辑
// 4:进行渲染
// 5:在渲染的过程中,计算下一帧的AI和物理
// 6:渲染完毕,重复3
enum
{
FRAME_STATE_AI = 0x00000001, // 包括物理计算
FRAME_STATE_LOGIC = 0x00000002, // 图形逻辑处理
FRAME_STATE_RENDER = 0x00000004, // 渲染状态
};
volatile LONG g_Mutex = FALSE;
UINT g_FrameState = FRAME_STATE_AI;
// 渲染线程
void MainThread_Render()
{
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == TRUE)
continue;
// 处于渲染状态
if (g_FrameState & FRAME_STATE_RENDER)
{
// 渲染部分
{
printf("渲染开始...\n");
getchar();
}
g_FrameState &= ~FRAME_STATE_RENDER; // 清除渲染状态
printf("渲染完毕...\n");
getchar();
}
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
Sleep(0);
}
}
// AI逻辑处理(包括物理)
DWORD WINAPI SubThread_AILogic(LPVOID lpParam)
{
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == TRUE)
continue;
// 处于AI计算状态
if (g_FrameState & FRAME_STATE_AI)
{
// 执行AI计算
{
printf("AI计算开始...\n");
getchar();
}
g_FrameState &= ~FRAME_STATE_AI; // 清除AI计算状态
g_FrameState |= FRAME_STATE_LOGIC; // 设置图形逻辑状态
printf("AI计算完毕...\n");
getchar();
}
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
Sleep(0);
}
}
// 图形逻辑线程
DWORD WINAPI SubThread_GraphicsLogic(LPVOID lpParam)
{
while (true)
{
// 加锁
if (InterlockedExchange(&g_Mutex, TRUE) == TRUE)
continue;
// 当前处于图形逻辑处理状态下,且不在渲染状态下
if ((g_FrameState & FRAME_STATE_LOGIC) && !(g_FrameState & FRAME_STATE_RENDER))
{
// 执行图形逻辑
{
printf("图形逻辑处理开始...\n");
getchar();
}
g_FrameState &= ~FRAME_STATE_LOGIC; // 清除图形逻辑状态
g_FrameState |= FRAME_STATE_RENDER; // 设置渲染状态
g_FrameState |= FRAME_STATE_AI; // 设置AI计算状态(下一帧)
printf("图形逻辑处理完毕...\n");
getchar();
}
// 解锁
InterlockedExchange(&g_Mutex, FALSE);
Sleep(0);
}
}
int main()
{
::CreateThread(NULL, 0, SubThread_AILogic, NULL, 0, NULL);
::CreateThread(NULL, 0, SubThread_GraphicsLogic, NULL, 0, NULL);
while (true)
{
MainThread_Render();
}
return 0;
}