내가 질문을 이해 가정입니다 추천 무엇 singelton으로 이것을하게 고려 각 경기마다 for-loop를 사용하여 게임을 업데이트하십시오.
그건 끔찍한 생각입니다. 해당 라인을 따라 어디에서나 렌더링을 차단하면 모든 서버에 영향을 미칩니다. 첫 번째 일치하는 사람이 서버에 많은 양의 데이터를 보내면 스레드가 차단되고 FPS가 매 일치으로 느려집니다.
예, 타이머는 서버에서 무겁습니다. 단일 스레드가 높은로드를 처리 할 수없고 60FPS에서 실행하기 때문에 한 번에 너무 많은 활성 일치가있는 경우 모든 일치에 대해 하나의 타이머를 사용하면 스레드 차단이 발생합니다.
주어진 게임 서버를 설계하는 가장 좋은 방법은 스레드를 사용하는 것입니다.
지연을 생성하고 주어진 FPS를 유지하기 위해 Thread.sleep을 사용할 수 있으며 타이머 대신 스레드를 사용하면로드가 밝아집니다. IT는 여전히 무겁지 만 쓰레드를 사용하는 것이 타이머보다 가볍습니다.
public void run(){
long lastLoopTime = System.nanoTime();
final int TARGET_FPS = 60;//The FPS. Can be reduced or increased.
final long OPTIMAL_TIME = 1000000000/TARGET_FPS;//1 second = 10^9 nanoseconds
long lastFpsTime = 0;//Used to calculate delta
while(running){
long now = System.nanoTime();//Get the current time
long updateLength = now - lastLoopTime;//get the time it took to update
lastLoopTime = now;//set the last time the loop started to the current time
double delta = updateLength/((double)OPTIMAL_TIME);//Calculate delta
lastFpsTime += updateLength;
if(lastFpsTime >= 1000000000){
lastFpsTime = 0;
}
//Right here you place your code. Update the servers, push and read data, whatever you need
try{
long gt = (lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000;//calculate the time to sleep, and convert to milliseconds
Thread.sleep(gt);//And finally, sleep to maintain FPS
}catch(InterruptedException e){
}
}
}
클래스이 스레드 연장 running
불리는 부울을 가지고 실제 스레드로서
이 그것의 일부이다. boolean를 사용하면 (자), 예외를 슬로우 할 필요없이 Thread를 정지 할 수가 있습니다.
각 경기마다 하나의 스레드를 만드십시오 (중요한 점입니다. 각 플레이어에 대해 수행하고 리소스를 죽입니다.) 모든 경기에 대해 하나씩 수행하십시오. 슈퍼 컴퓨터가 없으면 60FPS를 유지할 수 없습니다 성냥의 양에)), 연결을 관리하고 스레드를 일치시키기위한 메인 스레드가있다
출처
2017-11-11 17:37:34
Zoe