• Windows 构建 Acid Game Engine 的坑


    下载 OpenAL 的话,配置环境变量到 OpenAL 1.1 SDK 就好了

    我的 cmake 的 FindOpenAL 里面会添加 OpenAL 的库,所以我不知道为什么原仓库会把那个判断是否已经存在 OpenAL 库的语句注释掉……我就加回来了

    Sources\CMakeLists.txt

    # OpenAL must be installed on the system, env "OPENALDIR" must be set
    find_package(OpenALSoft)
    find_package(OpenAL)
    if(OPENALSOFT_FOUND)
    	#if(OPENALSOFT_FOUND AND NOT TARGET OpenAL::OpenAL)
    		add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
    		set_target_properties(OpenAL::OpenAL PROPERTIES
    				IMPORTED_LOCATION "${OPENALSOFT_LIBRARY}"
    				INTERFACE_INCLUDE_DIRECTORIES "${OPENALSOFT_INCLUDE_DIR}"
    				)
    	#endif()
    elseif(OPENAL_FOUND)
    	if(NOT TARGET OpenAL::OpenAL)
    		add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
    	endif()
    	set_target_properties(OpenAL::OpenAL PROPERTIES
    	IMPORTED_LOCATION "${OPENAL_LIBRARY}"
    	INTERFACE_INCLUDE_DIRECTORIES "${OPENAL_INCLUDE_DIR}"
    	)
    else()
    	message(FATAL_ERROR "Could not find OpenAL or OpenAL-Soft")
    endif()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    配置了环境变量之后,记得要重新打开 VS Code 才能更新到最新的环境变量

    然后是配置 pkg config

    https://stackoverflow.com/questions/1710922/how-to-install-pkg-config-in-windows

    然后是安装 bzip2

    我已经用 vcpkg 安装了 bzip2,我也确定安装的是 x64 的,设置了环境变量 VCPKG_DEFAULT_TRIPLET=x64-windows

    然后是在 Acid\build\Tests\Editor 中找不到 EditorTest.dll

    但是我在 bin 文件夹中是可以找到的,于是我就手动复制过去了

    然后就是没有 glfw window 的错误

    这个创建 glfw window 的时机也是有讲究的,需要在创建了 Windows module 之后,在那些连接到 onAddWindow 信号的 module 的创建之后,在那些需要 glfw window 的 module 之前

    一个 hack 的方法是记住需要 glfw window 的 module 的序号,在那个序号的位置之前调用 AddWindow()

    Sources\Engine\Engine.cpp

    void Engine::CreateModule(Module::TRegistryMap::const_iterator it, const ModuleFilter &filter) {
    	if (modules.find(it->first) != modules.end())
    		return;
    	
    	if (!filter.Check(it->first))
    		return;
    
    	// hack
    	if (modules.size() == 10)
    		Windows::Get()->AddWindow();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是这样肯定是跟原仓库的设计者的设计思路是相违背的

    还有一种方法是在获取 glfw window 的时候,判断如果自己没有 glfw window,那么就创建一个

    虽然照样不太优雅,但是比把 Window 逻辑写到引擎初始化的底层更好

    Sources\Devices\Windows.cpp

    Window *Windows::GetWindow(WindowId id) {
    	// hack
    	if (windows.size() == 0 && id == 0)
    		AddWindow();
    
    	if (id >= windows.size())
    		return nullptr;
    	return windows.at(id).get();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    bclinux aarch64 ceph 14.2.10 彻底删除ceph集群及数据
    【C++】泛型编程 ② ( 函数模板与普通函数区别 )
    概论_第4章__协方差与协方差的性质
    【SA8295P 源码分析】121 - MAX9295A 加串器芯片手册分析 及初始化参数分析
    【PowerQuery】Excel 一分钟以内刷新PowerQuery数据
    JUC并发工具-CAS机制
    K8S二进制安装与部署
    浅析Spring事务实现原理
    Mybatis-注解开发
    实现strStr题解补充
  • 原文地址:https://blog.csdn.net/hijackedbycsdn/article/details/132617622