제 목 11강에서 질문이 있습니다.
작성자 이관영 등록날짜 2020-12-12 22:03:40 / 조회수 : 615
강좌명 [단과] DirectX 11 2D Part 1
첨부파일
  • update 함수에서

    cpu_buffer를 gpu_buffer에 갱신을 시켜줄때

    memcpy(mapped_subresource.pData, &cpu_buffer, sizeof(TRANSFORM_DATA));

    이렇게 우선 데이터를 복사해서 Map함수에서 넣어주는걸로 나오는데여.

    그럼 보통

    memcpy 함수는

    graphics->GetDeviceContext()->Map(gpu_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0,&mapped_subresource);

    이전에 작성해줘야하는거 아닌건가여?

     

    ///////////////////// 추가로 오류가 있어서 추가질문도 드립니다..ㅠ

    Excute.cpp파일에서 graphics->GetDeviceContext()->Map() 부분에

    예외 발생(0x73AB4F0D(d3d11.dll), 2D211Game.exe): 0xC0000005: 0x00000059 위치를 읽는 동안 액세스 위반이 발생했습니다..
    발생하는데 원인을 잘 모르겠습니다..

    항상 답변 감사합니다..

     

  • 작성자 : 온라인게임아카데미 / 등록날짜 : 2020-12-14 11:17:54
  • 안녕하세요 온라인게임아카데미 입니다.

    문의하신 프로그래밍 관련 내용에 대하여 담당 강사님에게 전달하였습니다.
    다음날 오후 6시 이전까지는 답변드릴 수 있도록 하겠습니다.

    꿈을 이루시는 그날까지 함께 하겠습니다.
    SGA온라인게임아카데미

     

    ------------------------------------------------------------------------------------------------------------------------

    안녕하세요 온라인 게임 아카데미 프로그래밍 강사 하민우 입니다.

    map 함수에 대해서 잘 못 이해하고 계신 것 같습니다.

    맵 함수는 메모리를 잠구는 함수 입니다. 여기서 잠군다는 것은 다른 프로세스가 해당 메모리에 접근을 하지 못 하게 막는 것을 의미 합니다.

    현재의 운영체제는 멀티프로세스로 작동을 하기 때문에 같은 메모리 영역의 내용을 여러개의 프로세스 들이 동시에 사용을 하게 됩니다. 단순히 정보를 읽어가기 위한 동시 접근은 일반적으로 문제가 없으나 특정 프로세스가 기록을 하는 행위를 하게 되면 기록이 끝날 때까지는 데이터가 계속해서 변경이 되고 있는 상태이기 때문에 기록이 끝나지 않은 메모리로 부터 데이터를 읽어가는 것은 불안정한 데이터를 가져가는 결과로 연결 됩니다. 그래서 메모리 데이터를 변경하기 전에 락 (Map) 을 걸어서 타 프로세스의 접근을 제한하고 쓰기 작업이 다 끝나고 나면 다시 락을 풀게 ( Unmap ) 됩니다. 그래서 맵 함수 호출 뒤에는 꼭 언맵을 하여 잠굼 상태를 풀어줘야 합니다. 

    좀 더 디테일한 내용을 이해하고 싶으시다면 운영체제 분야에서 메모리 관련 분야를 공부하셔야 하며 운영체제에서 관리하는 메모리의 경우 보통은 lock, unlock 이라고 표현 합니다. 다이렉트x에서는 gpu 메모리에 대한 락, 언락을 맵, 언맵으로 구현을 한 것이구요.

    잠군다 Map

    메모리 작업 (쓰기, 변경, 지우기 등) memcpy 등

    풀어준다 Unmap

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    맵 함수 오류가 발생하는 원인은 접근하려는 메모리 공간에 접근이 제한되어 있기 때문에 그렇습니다.

    작성하신 코드를 보면 map 함수를 사용해서 gpu_buffer 를 잠궜으나 해제를 시킬 때 cpu_buffer로 작성하였기 때문에 gpu 버퍼가 언맵 되지 않았고 그 때문에 다시 접근할 때는 제한이 걸려 접근이 되지 않는 것 입니다.

     

    추가로 첨부파일을 올릴 때는 프로젝트 폴더 안에 .vs Debug x64 폴더들을 삭제하고 올려주시면 됩니다. 해당 폴더에 있는 내용들은 프로젝트를 열 때 그리고 실행할 때 비쥬얼 스튜디오에서 다시 생성해주는 파일들 입니다. (용량이 매우 큽니다.)

     

    지금 처럼 계속 열심히 공부하시기 바랍니다~

    감사합니다.

댓글 3개
  • 이관영 [ 2020-12-14 21:33:10 ]
  • 지금 코드 확인해보면 Unmap 상태에서도 gpu_buffer가 매개변수로 들어가있는데요 혹시 다른부분이 문제가 있는건 아닌걸까요..
  • 온라인게임 아카데미 [ 2020-12-15 10:50:13 ]
  • 렌더 함수에서 실수 하셨네요.
    VSGetConstantBuffers 가 아니라 VSSetConstantBuffers 입니다.
  • 이관영 [ 2020-12-15 15:23:00 ]
  • 아! 감사합니다. ~!