文中若有代码、术语等错误,欢迎指正
代码维护
BUG修复
-
说明Bug
当窗口最小化,imgui的viewportsize会是负值传入给帧缓冲重新设置大小
但是帧缓冲的大小参数是无符号,所以会转换为一个很大的无符号整数
帧缓冲的大小就会过大,导致重新最大化窗口时,摄像机投影会变形(摄像机的宽高比与帧缓冲的大小不匹配)
-
摄像机变形
最小化后,再打开
-
尝试修复此Bug
判断如果小于0就不要重置帧缓冲大小,并且在帧缓冲大小写如果过大就不重置,双层保险
// EditorLayer.cpp if (m_ViewportSize != *((glm::vec2*)&viewportPanelSize) && viewportPanelSize.x > 0 && viewportPanelSize.y > 0) { // 改变了窗口大小 // 调整帧缓冲区大小 m_Framebuffer->Resize((uint32_t)viewportPanelSize.x, (uint32_t)viewportPanelSize.y); m_ViewportSize = { viewportPanelSize.x, viewportPanelSize.y }; // 调整摄像机投影 m_CameraController.OnResize(viewportPanelSize.x, viewportPanelSize.y); } // OpenGLFramebuffer.cpp void OpenGLFramebuffer::Resize(uint32_t width, uint32_t height) { if (width == 0 || height == 0 || width > s_MaxFramebufferSize || height > s_MaxFramebufferSize) { HZ_CORE_WARN("试图将frambuffer的大小设为{0} {1}", width, height); return; } m_Specification.Width = width; m_Specification.Height = height; Invalidate();// 重新生成 }
但是结果是:暂时解决不了摄像机投影会变形问题(窗口最小化事件与窗口重新调整大小不是同一个事件)
讨论宏
-
在Core.h中有根据宏来判断选择哪一个平台
-
这样项目就需在设置-属性 的预编译选项 添加宏
-
这样每个cpp文件都有这个宏并且在最上面(所以cpp文件能直接使用第2步添加的宏)
-
虽然程序不会奔溃,但是不太好,宏太多了
这是看视频自动翻译的解释,不知道有没有理解错。。。
下一步去哪
-
教人做引擎很困难
就像教人研发一台汽车,不得不砍掉一些功能
而开发一些熟悉和感兴趣的功能(渲染、事件)
其它功能可能会采取第三方库的方法(实体组件、物理等)
-
引擎是一种一直要开发和维护的东西,除非人们不在继续开发游戏。
-
下一步会先做实体组件系统,有了实体,可以为其添加组件,然后用脚本控制。