// TODO: 此函数的'try to remove unused items from rc2ProcDict'部分尚需检测。
/// <summary>
/// 设置Debug模式的回调函数。
/// <para>此函数的'try to remove unused items from rc2ProcDict'部分尚需检测。</para>
/// </summary>
/// <param name="callback"></param>
/// <param name="userParam">建议使用<see cref="UnmanagedArray.Header"/></param>
public static void DebugMessageCallback(DebugProc callback, IntPtr userParam)
{
if (innerCallbackProc == null)
{
innerCallbackProc = new DEBUGPROC(innerCallback);
}
IntPtr renderContext = Win32.wglGetCurrentContext();
IntPtr deviceContext = Win32.wglGetCurrentDC();
if (rc2ProcDict.ContainsKey(renderContext))
{
rc2ProcDict[renderContext] = callback;
rc2dcDict[renderContext] = deviceContext;
}
else
{
rc2ProcDict.Add(renderContext, callback);
rc2dcDict.Add(renderContext, deviceContext);
debugProcDictCount++;
// try to remove unused items from rc2ProcDict
if (debugProcDictCount > maxDebugProcDictCount)
{
List <IntPtr> unusedRCList = new List <IntPtr>();
foreach (var item in rc2dcDict)
{
if (!Win32.wglMakeCurrent(item.Value, item.Key))// 这种检测方式可行吗?
{
unusedRCList.Add(item.Key);
}
}
foreach (var item in unusedRCList)
{
rc2ProcDict.Remove(item);
rc2dcDict.Remove(item);
}
debugProcDictCount -= unusedRCList.Count;
maxDebugProcDictCount = debugProcDictCount + 100;
Win32.wglMakeCurrent(renderContext, deviceContext);
}
}
GetDelegateFor <glDebugMessageCallback>()(innerCallbackProc, userParam);
}