raii C++로 Vulkan 쓰기

7000 단어 C++Vulkantech
볼칸은 어쨌든 쓰기가 번거롭다. 다행히도 Vulkan-HPP에는 RAI 래퍼vulkan_raii.hpp가 있다.
https://github.com/KhronosGroup/Vulkan-Hpp
C++ 자물쇠vk::UniqueHandle에서도 분석기를 지원하지만 그것보다 사용하기 쉽다.

비교


예: 장치 생성


설비 제작의 경우 다음과 같은 3가지 문법으로 비교한다.
  • Pure C
  • C++ 래치vk::
  • RAII 레지스터vk::raii::
  • Pure C
    // VkPhysicalDevice physicalDevice = ...;
    // VkDeviceCreateInfo createInfo = ...;
    VkDevice device;
    if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) {
        throw std::runtime_error("failed to create logical device!");
    }
    
    // ...
    
    vkDestroyDevice(device, nullptr);
    
    C++ 래치
    // vk::PhysicalDevice physicalDevice = ...;
    // vk::DeviceCreateInfo createInfo = ...;
    vk::UniqueDevice device = physicalDevice.createDeviceUnique(createInfo);
    
    RAII호
    // vk::raii::PhysicalDevice physicalDevice = ...;
    // vk::DeviceCreateInfo createInfo = ...;
    vk::raii::Device device(physicalDevice, createInfo);
    
    destroy라고 부르지 않아도 되고, 구조기로 초기화할 수 있다.

    예: 버퍼 바인딩


    구조기보다 더 기쁜 것은 vk::Device의 구성원 함수가 처리 대상류의 구성원 함수라는 것이다.
    C++ 래치
    device.bindBufferMemory( buffer, memory, memoryOffset );
    
    RAII호
    buffer.bindMemory( *memory, memoryOffset );
    
    이전의 방법은 모든 곳을 방문해야 했지만, 이것에 따라 device 어느 정도 해방될 수 있다.

    Context


    RAI 래퍼는 컨텍스트 카테고리device도 추가했다.
    vk::raii::Context context;
    vk::raii::Instance instance(context, instanceCreateInfo);
    
    이 분류에 관해서는 아직 완전한 문서가 없는 것 같다Issue #926에는 다음과 같다.
    The vk::raii::Context is a helper class needed for the classes in the vk::raii namespace. Essentially, it dynamically loads a minimal set of function pointers to do the very first steps in an application (enumerate extensions, layers, and the version). And it's passed into the vk::raii::Instance constructor, to allow the instance-related initializations.

    공식 프로그래밍 안내서


    공식 가이드 여기 있습니다.
    https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/vk_raii_ProgrammingGuide.md

    추기: 사용 후의 소감

    vk::raii::Context 자체는 쓰기 좋으나 vk::raiivk::의 사용은 번거롭고 두 개의 혼용 코드가 미묘하다.
    또 새로운 기능이 있어서 그런지 통일감이 없는 부분도 있다.예를 들어, 교환 의자의 이미지를 가져오면 Pure C의 객체가 반환됩니다.
    vk::raii::SwapchainKHR swapChain( device, swapChainCreateInfo );
    std::vector<VkImage> swapChainImages = swapChain.getImages();
    // vk::Image で返して欲しくない...?
    
    현황은 개인이 C++ 호각이면 된다고 생각하는 결론을 내렸다.앞으로의 발전을 기대해...!

    좋은 웹페이지 즐겨찾기