전체 글
- 블로그 옮깁니다. 2022.10.29
- 구조적 바인딩 2022.08.20
- if 문의 이니셜라이저 2022.08.20
- 언리얼 엔진 소켓 프로그래밍 (2) Send, Recv / 쓰레드 생성 2022.08.12
- 언리얼 엔진 소켓 프로그래밍 (1) FSocket, Winsock 연결 2022.06.02 1
- 언리얼 엔진 소켓 프로그래밍 (0) 2022.06.02 1
- 계획 등등 끄적끄적... 2022.05.21
- MSI B660M 박격포 WIFI DDR4 모델 조립기 및 성능 테스트 2022.05.10
- 공랭 쿨러 리뷰 : AK620 화이트 2022.04.28
블로그 옮깁니다.
구조적 바인딩
전문가를 위한 C++
C++ 17에서 추가된 기능으로 구조적 바인딩이란 개념이 추가됐다고 한다.
이것을 이용하면 여러개의 변수를 선언 할 때 배열, 구조체, 페어 혹은 튜플의 값으로 초기화 할 수 있다고 한다.
적용 방법은 auto 키워드와 [ ] 대괄호 사이에 변수명을 적고 오른쪽에 값을 넣어주면 된다.
array<int, 3> value = {1, 2, 3};
auto [x, y, z] = value;
다만 유의할 점은 무조건 auto 키워드를 사용해야 한다는 것과 왼쪽에 선언한 변수의 개수와 오른쪽에 표현식의 값 개수가 일치해야 한다는 것이다.
구조적 바인딩은 배열 뿐 아니라 모든 멤버가 non-static 이면서 public으로 선언된 데이터 구조라면 어떤 것도 적용 할 수 있다고 한다. (예를 들면 struct, pair, tuple)
struct에 구조적 바인딩을 사용한 예시
struct Point {
double a, b;
int c;
};
int main() {
Point p = {1, 2, 3};
auto [x, y, z] = p;
}
pair과 tuple은 내가 더 공부해보고 추후 더 자세히 적어보는 것으로 하겠다.
'개발 > C++' 카테고리의 다른 글
if 문의 이니셜라이저 (0) | 2022.08.20 |
---|
if 문의 이니셜라이저
전문가를 위한 C++
C++ 17에서 추가된 기능으로 if 문 안에서 이니셜라이저 (초기자)를 넣는 기능이 추가됐다고 한다.
간단하게 설명하면 if 문안에서 변수를 정의하고 그것을 바로 조건문에서 사용할 수 있는 것인데 이곳저곳에 쓸 일이 많을 거 같아 적었다.
if ( <이니셜라이저>; <조건문>) { <본문> }
문법은 위와 같고 이니셜라이저에서 정의한 변수는 <조건문>과 <본문> 안에서만 사용할 수 있다.
+ switch 문에서도 이니셜라이저를 지원한다. 문법은 아래와 같고 if 문에서와 마찬가지로 <조건문>과 <본문> 안에서만 사용할 수 있다.
switch (<이니셜라이저>; <표현식>) { <본문> }
예시)
int main()
{
int i = 10;
// if 문 이니셜라이저
if (int test = i; test > 0)
cout << "Wha!";
// switch 문 이니셜라이저
switch (int test = i + 20; test)
{
case 10:
cout << "i 인가?";
break;
case 30:
cout << "test 인가?";
break;
default:
break;
}
}
언리얼 엔진 소켓 프로그래밍 (2) Send, Recv / 쓰레드 생성
지난 시간에는 FSocket과 Winsock을 사용하여 서버와 연결을 해보았다.
이제 패킷을 전송해보고 받는 것을 알아보자. 또한 동기식 소켓으로 구현을 하여 데이터를 받으면 Recv 가 대기를 하기 때문에 게임 루프에 영향을 준다. 스레드를 생성하여 게임 루프에 영향이 가지 않도록 하는 방법도 알아보자.
1) Send, Recv
사실 이것들은 별 특별한게 없다.
Send부터 알아보자.
// send 함수 사용 예시
int nSendLen = send(Socket, buff, buff[0], 0);
순서대로 지난시간에 만들었던 SOCKET 변수, 보낼 데이터, 보낼 데이터의 길이, 마지막은 flags 값인데 보통 0을 넣으면 된다. (참고 MSDN 설명)
반환값으로는 보낸 패킷의 길이를 받아올 수 있다.
Recv 도 간단하다.
// Recv 함수 사용 예시
char RecvBuff[BUFSIZE] // 패킷을 저장할 변수
int RecvLen = recv(Socket, RecvBuff, BUFSIZE, 0);
순서대로 SOCKET 변수, 패킷을 저장할 변수의 시작 위치와 저장할 수 있는 최대의 크기, 마지막은 flags 값이다. 이것도 보통 0을 넣으면 된다. (참고 MSDN 설명)
Send와 Recv 모두 주의해야 할 것은 두 번째 파라미터로 변수의 시작 위치를 넘겨준다는 것이다.
그리고 Send와 Recv의 세번째 파라미터에 보내주는 길이가 의미하는 것도 잘 생각하고 제대로 넣어주자.
2) FRunnableThread
우리는 동기 소켓으로 생성하여 연결을 하였다.
동기 소켓의 특징으로는 데이터를 받을 때까지 대기를 하며 이 때문에 클라이언트가 더 이상 진행을 하지 못하고 멈춘다.
위에 적인 코드를 사용하여 액터의 Tick 함수에 Recv를 넣고 하고 게임을 실행하면 아마 작동이 멈출 것이다.
언리얼 엔진에서 Tick 함수는 MainThread 가 액터 하나씩 돌아다니면서 순차적으로 호출을 하는데, 동기 소켓의 Recv 함수에서 데이터를 받을 때까지 대기를 하니 게임도 덩달아 같이 정지가 되어버린다.
이를 해결하기 위해 Recv 함수를 스레드를 생성하여 게임 루프와는 별개로 작동시키게 할 것이다.
일단 해보자.
언리얼 엔진에서는 FRunnable 이라는 class를 이용하여 스레드를 생성할 수 있다.(참고 언리얼 C++ 레퍼런스)
// HOUSE_OF_TREE_API 는 예제로 사용한 프로젝트의 이름이다.
class HOUSE_OF_TREE_API ClientSocket : public FRunnable
{
public:
// 생성자와 소멸자
ClientSocket();
~ClientSocket() override;
// 상속받은 세개의 함수
bool Init() override;
uint32 Run() override;
void Exit() override;
// 소켓 변수
SOCKET Socket;
private:
// 쓰레드
FRunnableThread* Thread;
};
먼저 비어있는 C++ 클래스를 생성하고 FRunnable 를 상속받자.
그리고 스레드를 시작하고 (Init), 작동시키고 (Run), 종료할 수 있는 (Exit) 함수 세 개를 오버 라이딩하자.
그다음 소켓통신에 사용할 소켓 변수와 스레드 변수를 선언했다.
코드를 찬찬히 보면 FRunnableThread 은 뭘까 싶을 수 있다.
간단히 설명하면 FRunnableThread는 스레드 '객체' 이고 FRunnable 은 이 쓰레드 객체가 실행할 '대상'이다.
잘 이해가 안 되신다면 스레드를 생성하는 다음 코드를 봐보자.
ClientSocket::ClientSocket()
{
Thread = FRunnableThread::Create(this, TEXT("Network Thread"));
}
ClientSocket::~ClientSocket()
{
if (Thread)
{
// 스레드 종료
Thread->WaitForCompletion();
Thread->Kill();
delete Thread;
}
}
#pragma endregion
bool ClientSocket::Init()
{
UE_LOG(LogNet, Warning, TEXT("Thread has been initialized"));
// Socket 연결을 하는 코드를 넣으면 된다. (너무 길어서 뺐다)
}
uint32 ClientSocket::Run()
{
while (true)
{
// Recv 작업을 여기서 진행 하면된다.
}
return 0;
}
void ClientSocket::Exit()
{
if (Socket)
{
// Socket 연결을 끊고 Winsock 사용을 종료
closesocket(Socket);
WSACleanup();
}
}
생성자에서 FRunnableThread::Create(this, TEXT("Network Thread")); 이 코드를 통해서 쓰레드를 생성하고 작동할 '대상'을 지정했다.
이 FRunnable class에서 작동할 것이니 this를 넣어줬다.
뒤에 문자열은 Thread의 이름이다. 알기 쉽게 지어주자. (참고 언리얼 C++ 레퍼런스 FRunnableThread)
소멸자에는 Thread가 작동 중이면 종료하고 객체를 삭제하도록 해놨다.
스레드가 생성이 되면 Init 함수가 실행이 되고 그다음에 Run 함수를 실행한다.
Recv 작업을 계속할 것이므로 무한 루프를 하고 그 안에서 recv 함수를 호출하면 된다.
스레드를 종료시키면 Exit 함수가 호출되고 종료된다.
Init 함수에서는 소켓을 연결하고, Exit 함수에서는 소켓 연결을 끊도록 작성했다.
이제 실행을 해보면 게임 루프 대기 없이 recv 작업을 수행할 수 있게 되었다!
사실 여기서 다른 문제가 하나 더 있는데, 네트워크를 통해 정보를 받아 게임상의 액터를 조작할 경우 MaingameThread가 아니라며 엔진에서 작업을 막아버린다.
결국 새로운 스레드를 생성해 정보를 받아왔지만 이것을 게임에 반영하려면 다시 메인 게임 루프로 정보를 가져와야 한다는 것이다...
나는 메시지 큐를 사용하여 정보를 저장해놓고 그것을 메인 게임 루프에서 처리하는 방식으로 작업을 진행하였는데 이것은 다음에 다시 작성해보겠다.
다른 좋은 방법이 있으면 공유해주시길 바란다.
링크는 실제 내가 사용한 코드다. 참고용으로 올린다. (참고 ClientSocket.h / ClientSocket.cpp)
어쩌다 보니 글이 매우 장황해졌는데 전달이 잘 되었는지는 모르겠다.
제작을 하면서 제일 고생을 한 부분이었고, 다른 사람들은 나보다 덜 고생하길 바라는 마음으로 작성하다 보니 그렇게 되었다.
그럼 이만...
'개발 > Unreal Engine' 카테고리의 다른 글
언리얼 엔진 소켓 프로그래밍 (1) FSocket, Winsock 연결 (1) | 2022.06.02 |
---|---|
언리얼 엔진 소켓 프로그래밍 (0) (1) | 2022.06.02 |
언리얼 엔진 소켓 프로그래밍 (1) FSocket, Winsock 연결
IOCP 서버와 연결하기 위해 네트워크 통신을 구현하였다. 여기서는 두 가지 API를 소개하지만 나는 그중에서 Winsock을 사용할 것이다.
1) FSocket
언리얼 엔진에서는 이미 소켓통신을 위한 API를 구비해 두었다. (언리얼 엔진 Socket API)
물론 이 글 이후에 진행되는 모든 것 들은 다 Winsock을 이용할 것이지만 혹시 쓰실 분이 있으실까 해서 남겨놓는다.
(별 다른 이유는 없고 문제가 생기면 찾기 더 쉽고 무엇보다 서버 플머가 만들어준 걸 쓰기 편하기에...)
방법은 Winsock과 크게 다르지 않다.
#include "ClientSocket.h"
#include "SocketSubsystem.h"
#include "Interfaces/IPv4/IPv4Address.h"
FSocket* Socket; // 소켓 담을 변수를 생성
// 소켓을 생성
Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(TEXT("Stream"), TEXT("Client Socket"));
// IP를 FString으로 입력받아 저장
FString address = TEXT("127.0.0.1");
FIPv4Address ip;
FIPv4Address::Parse(address, ip);
int32 port = 6000; // 포트는 6000번
// 포트와 소켓을 담는 클래스
TSharedRef<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
addr->SetIp(ip.Value);
addr->SetPort(port);
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Trying to connect.")));
// 연결시도, 결과를 받아옴
bool isConnetcted = Socket->Connect(*addr);
코드 상세 설명
CreateSocket 함수를 사용해서 FSocket 을 생성한다.
TEXT("Stream")을 주면 TCP 프로토콜을 사용하겠다는 뜻이다. (UDP는 TEXT("DGram")을 인자로 주면 된다.)
두 번째 인자 TEXT("Client Socket") 은 디버그 이름이다. 알기 쉬운 이름으로 지정해주자.
CreateSocket(TEXT("Stream"), TEXT("Client Socket"));
FIPv4Address 구조체에 IP 주소를 저장한다.
IP주소는 FString으로부터 Parse함수를 사용하여 저장한다.
FString address = TEXT("127.0.0.1");
FIPv4Address ip;
FIPv4Address::Parse(address, ip);
FInternetAddr 클래스에 네트워크 정보를 저장한다. 이 클래스에서 네트워크 바이트로 정렬해준다.
TSharedRef<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
addr->SetIp(ip.Value);
addr->SetPort(port);
이제 Connect 함수에 방금 만든 FInternetAddr 클래스의 주소를 보내 연결을 한다.
bool isConnetcted = Socket->Connect(*addr);
반환 값을 사용해 접속에 성공했는지 확인해볼 수 있다.
2) Winsock
Winsock을 사용한 방법이다. 자세한 설명은 찾아보면 많이 나오니 간단하게 설명하고 넘어가겠다.
// window 기본 타입 Hide
#include "Windows/AllowWindowsPlatformTypes.h"
#include "Windows/prewindowsapi.h"
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include "Windows/PostWindowsApi.h"
#include "Windows/HideWindowsPlatformTypes.h"
SOCKET Socket;
WSADATA wsaData;
int nRet = WSAStartup(MAKEWORD(2, 2), &wsaData); // Winsock 초기화
if (nRet != 0) return false;
// 소켓 생성
Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if (Socket == INVALID_SOCKET) return false;
// IP, Port 정보 입력
SOCKADDR_IN stServerAddr;
stServerAddr.sin_family = AF_INET;
stServerAddr.sin_port = htons(6000);
stServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 접속
nRet = connect(Socket, (sockaddr*)&stServerAddr, sizeof(sockaddr));
if (nRet == SOCKET_ERROR) return false;
코드 상세 설명
Winsock 라이브러리와 헤더를 추가해주었는데 여기서 아래와 같은 에러가 뜬다.
Warning C4005 'TEXT': macro redefinition
error C4003: not enough arguments for function-like macro invocation 'min'
Windows.h 헤더를 포함하여 생기는 에러이다.
그래서 에러가 생긴 헤더를 'Windows/AllowWindowsPlatformTypes.h' 로 감싸서 해결해 주었다. (참고)
#include "Windows/AllowWindowsPlatformTypes.h"
#include "Windows/prewindowsapi.h"
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include "Windows/PostWindowsApi.h"
#include "Windows/HideWindowsPlatformTypes.h"
사용할 Winsock 버전을 선택하고 초기화 하는 과정이다. 반환값을 사용하여 제대로 초기화가 진행 되었는지 확인 할 수 있다.
WSADATA wsaData;
int nRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
소켓을 생성한다. AF_INET은 IPv4 주소 체계를, SOCK_STREAM은 TCP 프로토콜을 나타낸다.
이 역시 반환 값을 비교하여 제대로 생성이 되었는 지를 확인 할 수 있다.
Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if (Socket == INVALID_SOCKET) return false;
IP주소와 포트번호를 SOCKADDR_IN 구조체에 넣어준다.
SOCKADDR_IN stServerAddr;
stServerAddr.sin_family = AF_INET;
stServerAddr.sin_port = htons(6000);
stServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect 함수에 SOCKADDR_IN 구조체의 포인터와 크기를 인자로 주면 연결을 시도한다.
nRet = connect(Socket, (sockaddr*)&stServerAddr, sizeof(sockaddr));
if (nRet == SOCKET_ERROR) return false;
이렇게 두 가지 방법으로 연결하는 것을 적어보았다.
다음 글에서는 패킷 전송과 수신, 그리고 스레드를 생성하는 것을 적어보겠다.
'개발 > Unreal Engine' 카테고리의 다른 글
언리얼 엔진 소켓 프로그래밍 (2) Send, Recv / 쓰레드 생성 (0) | 2022.08.12 |
---|---|
언리얼 엔진 소켓 프로그래밍 (0) (1) | 2022.06.02 |
언리얼 엔진 소켓 프로그래밍 (0)
1) 시작
언리얼 엔진에서 기본으로 제공하는 서버는 보통 소규모 MO 게임을 위한 서버들이다.
(서버 관련 내용은 아래에 잘 정리되어 있으니 한번 찾아보시길)
어느 분이 정리해주신 데디와 리슨서버의 차이점 https://mingyu0403.tistory.com/271
[Unreal] 멀티 플레이 정리 (데디케이트 서버, 리슨 서버)
데디케이트 서버 개념 호스트를 담당하는 서버 + 여러 명의 클라이언트 설명 계속 24시간 하루종일 돌아가야하는 게임일 경우, 데디케이트 서버를 사용한다. 참고 언리얼에서 데디케이트 서버를
mingyu0403.tistory.com
엔진에서의 클라이언트-서버 모델 https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Server/
클라이언트-서버 모델
멀티플레이어에서 서버의 역할에 대한 개요입니다.
docs.unrealengine.com
데디 서버의 한계에 관한 Rookiss 님의 답변 https://www.inflearn.com/questions/416507
언리얼 클라와 실습 IOCP 서버를 연동하는 법을 알고 싶습니다. - 인프런 | 질문 & 답변
안녕하세요 선생님, 자체 제작한 IOCP서버와 언리얼 엔진으로 만든 클라의 연결법을 배우고 싶어 이번 강의을 구매하게 되었습니다. 제가 전에 구현 해봤던 SFML을 이용한 간단한 2D게임은 기존
www.inflearn.com
하지만 우리들은 IOCP를 사용한 서버를 만들기로 기획하였기에 나는 서버와 통신하는 방법을 이곳저곳 찾아보았다. (아마 이글을 보시는 분들도 대부분 같은 고민을 가지고 찾아오셨을꺼라 생각한다.)
결론은 직접 네트워크 통신을 구현해야 한다는 것인데 소켓 프로그래밍은 3학년 2학기 때 수업에서 배우고 또 직접 개발을 해본 경험이 있기에 괜찮지만 문제는 이걸 엔진과 연동해서 사용해본 적이 없다는 것이다.
많은 시행착오를 거쳐 결국 서버와 연결에 성공했지만 진짜 그 과정에서 참고할 자료가 너무너무너무 없어서 정말 힘들었다.
그래서 조금이나마 도움이 되길 바라며 IOCP 서버와 언리얼 엔진사이의 소켓통신을 구현하는 과정을 공유해 보려고 한다.
'개발 > Unreal Engine' 카테고리의 다른 글
언리얼 엔진 소켓 프로그래밍 (2) Send, Recv / 쓰레드 생성 (0) | 2022.08.12 |
---|---|
언리얼 엔진 소켓 프로그래밍 (1) FSocket, Winsock 연결 (1) | 2022.06.02 |
계획 등등 끄적끄적...
앞으로 쓸 것들을 정리할 겸 그냥 잡담을 끄적이기 위해 적으러 왔다.
지금 어떤 상황인지 간략하게 적어보자면 졸업 작품 시즌에 1학기 기말고사 직전, 4학년 졸업반 취업 시즌이다.
계속 취업 준비는 하고 있고, 기말고사는 슬슬 준비해야 할 때다.
머 이것들은 상관 없고 지금 졸업 작품 시기라는 게 중요한 거다.
왜냐? 지금 언리얼 엔진을 사용해서 PC VR 플랫폼으로 개발을 진행하고 있다. 고래서 앞으로의 계획을 적으로 온 거다.
내가 안 까먹도록...
일주일에 한 개 이상씩은 언리얼 관련해서 개발했던 내역이나 방법 위주로 올리려고 한다.
이걸 기록하는 용도도 있겠지만 사실 다른 사람들에게 알려주고픈 이유가 더 크다.
내가 언리얼을 C++로 개발을 시작한 지 이제 3달쯤 된 거 같은데 초반 한 달이 진짜 정말 힘들었다.
유니티 같은 경우는 정말 자료가 많다. 진짜다!
근데 언리얼은? 아쉽게도 C++ 자료가 너무 적은 거 같다... 블루프린트 때문인가?
그래서 앞으로 언리얼은 내가 처음 C++로 개발하면서 들이박았던 일대기들 위주로 적으면서 고생했던 것들 혹은 팁들 같은 거 위주로 올릴 것이다.
아마 첫 내용은 언리얼 C++ 구조나, 변수 등 간략하게 설명을 하는 시간이 될 거 같다.
그리고 차차 VR 폰 제작, IOCP 서버를 연결하기 위한 소켓 네트워크 등등 고생했던 일대기들을 해처 나가는 과정들을 적을 것이다.
부족할 수 도 있고 틀릴 수도 있다. 혹시 잘못된 부분이 있다면 알려주시길...
그리고 틈틈이 공부하면서 C++ 관련 기술들이나 알고리즘 문제들을 엮어서 적을 예정이다.
특히 알고리즘에 집중하면서 적을 것 같다. 따로 공부를 안하고 있다가 최근에서야 부랴부랴 공부를 하고 있으니...
이것들은 복습 겸해서 간단하게 적을 예정이다.
꾸준히 적어가며 학술적인 면에서의 일기가 되어주기 바라며 이만 잡담을 마치려고 한다.
'일상' 카테고리의 다른 글
MSI B660M 박격포 WIFI DDR4 모델 조립기 및 성능 테스트 (0) | 2022.05.10 |
---|---|
공랭 쿨러 리뷰 : AK620 화이트 (0) | 2022.04.28 |
MSI B660M 박격포 WIFI DDR4 모델 조립기 및 성능 테스트

SSG 닷컴에서 로젠택배로 받아왔습니다.

조립이 완료된 사진입니다.
조립사진은 이정도면 됬고 바로 테스트를 해봐야겠죠?
테스트 사양입니다.
CPU i7 12700K
Cooler Deepcool AK620
MB MSI B660M 박격포 WIFI DDR4
Memory 크루셜 Ballistirx D4 3200 CL16 16GB (x2)
GPU Evga RTX 3080 ftw3 12GB
Power Superflower SF-1000F14MP LEADEX PLATINUM SE
OS Windows 10
*메모리만 XMP를 적용해준 것외에는 별다른 설정을 건드리지 않았습니다.
테스트로는 cpu-z 벤치, 3DMark, 그리고 Unreal Engine, Minecraft(RTX)로 확인해 보겠습니다.
먼저 cpu-z 결과입니다.


이전 세대 (11900K)와 전력소모량은 125W로 동일합니다.
12세대에 적용된 인텔 10나노 공정의 성능향상을 보여주고있습니다.
다음으로는 3DMark 입니다.


다음으로는 언리얼 엔진입니다.
테스트를 위해 에디터를 기본프로젝트로 띄워 플레이를 해보겠습니다.

기본프로젝트로 열어 프로그램 점유율이 많지만 조립후 약 3주간 사용해보며 에디터 2개를 디버그 모드로 열어 실행시키고 서버를 같이 열어 테스트하면서도 문제없이 돌아갔습니다.
마지막으로 마인크래프트 RTX 맵을 열어 게임을 진행해보겠습니다.

테스트와 몇 주간의 실행활에서 사용하며 성능상의 부족함이 전혀 느껴지지 않았습니다.
MSI의 치밀한 메인보드 전원부 설계를 통해 모든 시스템이 안정적으로 돌아가는 모습을 볼 수 있었던것 같습니다.
덤으로 무선 네트워크를 이용해 WIFI를 사용하거나 블루투스로 음악을 듣는 등 매우 좋은 환경을 제공해주는 MSI B660 WIFI DDR4 모델의 리뷰였습니다.
감사합니다.
'일상' 카테고리의 다른 글
계획 등등 끄적끄적... (0) | 2022.05.21 |
---|---|
공랭 쿨러 리뷰 : AK620 화이트 (0) | 2022.04.28 |
공랭 쿨러 리뷰 : AK620 화이트
컴퓨터를 새로 조립했다. CPU가 I7 K 버전이기에 쿨러도 새로 사야 했기에 샀다!
이름하야 DEEPCOOL AK620 화이트!
나머지 부품들에 대한건 나중에 다시 조립기를 올리도록 하겠다.
120mm라길래 조금 작을 줄 알았는데 맨날 초코파이 쿨러만 쓰다 싸제 쿨러, 그것도 대장급 쿨러를 보니 어마 무시하게 크다.
팬은 120mm 두개에 사이에 히트파이프가 있는 모습이다.
같이 온 구성품들이다. 팬이 두 개를 한 번에 사용할 수 있도록 해주는 Y자 케이블, 써멀구리스, CPU 브래킷이 왔다.
옆에 보면 ㄱ자로 드라이버도 주는데 이걸 이용해 쿨러를 조립하면 된다.
조립 과정은 스킵스킵...
나중에 다시 정확하게 측정을 해봐야겠지만 대충 딱 조립하고 켰을때 들었던 생각은 엄청 조용하다 였다.
근데 조용한 건 조용한 거고 풍량이 엄청 쌨다. 이거로 내 CPU도 잘 식혀 주겠지.
나중에 시간들 들여 게임과 언리얼 작업을 해보면서 소음은 어느 정도인지 온도는 어느 정도까지 잡아주는지 측정해봐야겠다.
그럼 이만!
'일상' 카테고리의 다른 글
계획 등등 끄적끄적... (0) | 2022.05.21 |
---|---|
MSI B660M 박격포 WIFI DDR4 모델 조립기 및 성능 테스트 (0) | 2022.05.10 |