-
SFML 튜토리얼(시간, 스레드)활동 기록 😵💫/SFML 테트리스 2023. 1. 23. 02:52
튜토리얼을 공부하고 프로젝트를 시작해야겠다.
SFML의 시간
sf::Time 시간값 조작하는 모든 SFML클래스 및 함수 이 클래스 사용
(변환시간)
sf::Time t1 = sf::microseconds(10000); sf::Time t2 = sf::milliseconds(10); sf::Time t3 = sf::seconds(0.01f); 세번 모두 동일 sf::Time time = ...; sf::Int64 usec = time.asMicroseconds(); sf::Int32 msec = time.asMilliseconds(); float sec = time.asSeconds();(시간값으로 재생)
더하기 빼기 비교등과 같은 산술연산 지원. 시간은 음수일수도 있음 sf::Time t1 = ...; sf::Time t2 = t1 * 2; sf::Time t3 = t1 + t2; sf::Time t4 = -t3; bool b1 = (t1 == t2); bool b2 = (t3 > t4);(측정시간)
sf::Clock 시간측정 위한 간단한 클래스 1. getElapsedTime 시계가 시작된 이후 경과된 시간을 검색하는 기능 2. 시계 restart를 다시시작하는 기능 sf::Clock clock; // starts the clock ... sf::Time elapsed1 = clock.getElapsedTime(); std::cout << elapsed1.asSeconds() << std::endl; clock.restart(); ... sf::Time elapsed2 = clock.getElapsedTime(); std::cout << elapsed2.asSeconds() << std::endl;게임루프의 각 반복에서 경과된 시간 사용하는 예 sf::Clock clock; while (window.isOpen()) { sf::Time elapsed = clock.restart(); updateGame(elapsed); ... }스레드
#include <Thread.hpp>
다른 스레드와 병렬로 실행되는 일련의 명령 . 모든 프로그램 적어도 하나의 스레드로 구성
main() 함수를 실행하는 기본 스레드 (단일) 하나이상 추가 (다중)
-> 동시에 여러작업 수행하는 방법
스레드 생성하는 클래스 sf::Thread #include <SFML/System.hpp> #include <iostream> void func() { // 이 함수는 thread.launch가 호출되면 시작된다 for (int i = 0; i < 10; ++i) std::cout << "minastory" << std::endl; } int main() { // 스레드와 함수의 시작점 만들기 sf::Thread thread(&func); // run it thread.launch(); // the main thread continues to run... for (int i = 0; i < 10; ++i) std::cout << "cherrycode" << std::endl; return 0; }결과

두 함수의 텍스트가 콘솔에 혼합되어 출력
(인수가 하나인 비멤버 함수)
void func(int x) { } sf::Thread thread(&func, 5);(Functor ,함수객체)
-> 많은 유형의 함수와 호환되어서 가장 강력한 예제
struct MyFunctor { void operator()() { } }; sf::Thread thread(MyFunctor());// with lambdas sf::Thread thread([](){ std::cout << "I am in thread!" << std::endl; });// with std::bind void func(std::string, int, double) { } sf::Thread thread(std::bind(&func, "hello", 24, 0.5));클래스 내에서 sf::Thread를 사용하려면 기본생성자가 없다는 것을 잊으면 안된다.
생성자의 초기화 목록에서 직접 초기화 해야한다.
class ClassWithThread { public: ClassWithThread() : m_thread(&ClassWithThread::f, this) //직접초기화 { } private: void f() { ... } sf::Thread m_thread; };스레드 시작
sf::thread 객체를 만들면, launch() 함수를 실행해야함
sf::Thread thread(&func); thread.launch();스레드 중지
진입점 함수가 반환되면 스레드 자동 중지된다. 스레드가 다른 스레드에서 완료될 때까지 기다리려면 해당 wait 함수를
호출 할 수 있다.
sf::Thread thread(&func) //start the thread thread.launch(); //스레드가 끝날때까지 블록 실행 thread.wait();(일시중지)
현재 스레드만 일시중지 할 수 있음
void func() { sf::sleep(sf::milliseconds(10)); }이 함수로 모든 스레드 잠자기 상태로 만들 수 있음. 일시중지 하는 가장 효율적인 방법이다.
(공유 데이터 보호 - 뮤텍스)
#include <SFML/System.hpp> #include <iostream> sf::Mutex mutex; void func() { mutex.lock(); for (int i = 0; i < 10; ++i) std::cout << "cherrycode" << std::endl; mutex.unlock(); } int main() { sf::Thread thread(&func); thread.launch(); mutex.lock(); for (int i = 0; i < 10; ++i) std::cout << "minastory" << std::endl; mutex.unlock(); return 0; }결과

콘솔에 혼합 되지 않고 출력된다

스레드 함수를 따로 생성하는 게 아니라는 뜻..?
이렇게 하면 호출되는 동시에 즉시 소멸이라고 함
그러니까 main 함수에 생성해야..되는것 같다 ?
'활동 기록 😵💫 > SFML 테트리스' 카테고리의 다른 글
SFML / 윈도우 관리, 이벤트 튜토리얼 (3) 2023.02.05 SFML / 기본윈도우 (1) 2023.02.04 SFML/ 사용자 데이터 스트림 (5) 2023.02.04 SFML / 텍스트그리기(폰트) (4) 2023.01.19 C++에 SFML 적용하기 (2) 2023.01.18