2012-11-17 7 views
3

나는 2 명의 플레이어 비디오 게임을 만들고 있는데, 지속적으로 듣고있는 소켓이 있기 때문에 스레드에서 oponent의 위치가 업데이트됩니다. 내가 공유하고 싶은 것은 직책과 교체입니다.java - 스레드 간 데이터 공유 - 원자 참조 또는 동기화

비디오 게임이므로 메인 스레드가 차단되지 않도록 (또는 가능한 최소 시간 만) 성능에 영향을 미치기를 원하지 않습니다. 그래서에서 나는이 정보를

class sharedinfo 
{ 
    public synchronized read(); 
    public synchronized write(); 
} 

같은 것 할 수있는 일상적인 일을 공유하는 본 적이 있지만,이 세 가지 값까지 (비디오 게임을 그립니다 동일) 메인 스레드에서 읽기를 차단하는 것이 무엇 (또는 앞으로 더 많은 정보가 쓰여짐)이 쓰여지고 또한 동기화 된 게임이 매우 비싸다는 것을 읽었습니다 (또한이 게임이 안드로이드 용이기 때문에 성능이 매우 중요합니다).

하지만 아마도 sharedInfo가 AtomicReference 안에 있고 동기화를 제거하면 참조 자체가 업데이트 될 때만 멈추기 때문에 동기화가 필요하지 않을 것이라고 생각했습니다. 쓰기는 존재하지 않을 것이고 새 객체를 만들고 원자 참조에 넣었다.) 또한 원자 *는 하드웨어 연산을 사용하고 동기화보다 더 효율적이라고 말한다.

당신은 어떻게 생각하십니까?

답변

1

이 대기열을 사용하는 것을 고려하면 Java에는 좋은 동시 대기열 구현이 있습니다. java.util.concurrent에서 BlockingQueue 인터페이스를 찾아보고 구현하는 사람. 기회조차도 당신이 생각조차하지 못했던 전략을 찾아서 채우고 있습니다. 당신이 그것을 알기도 전에 당신의 스레드 사이에 배치보다

, 당신은 더 많은 의사 소통을 할 것이며, 큐와 함께 당신의 등, 아마 다른 우선 순위에서, 거기에

을 객체의 다른 종류의 경우 스틱 수 있습니다 (Queue 또는 BlockingQueue와 같은) 인터페이스를 가능한 한 많이 (즉, 특정 인스턴스가 구축 된 곳이라면 어디서든) 사용하면, 다른 기능이 필요한 경우 사용중인 정확한 큐 유형을 쉽게 교체 할 수 있습니다. 아니면 그냥 놀고 싶어.

+0

대기열 사용에 대해 생각해 보았습니다. "게임을 마쳤습니다.", "나는이/그 능력을 사용했습니다."와 같은 "이벤트"를 보내는 것이 좋다고 생각합니다.하지만 위치에 대해서는 걱정할 필요가 없습니다. 마지막으로 샌드위치 위치를 차지했기 때문에, 한 플레이어가 다른 플레이어보다 처리 능력이 높으면 다른 플레이어가 넘칠 수 있다고 생각했습니다. 당신이 oponent를 범람하지 않더라도 돌보지 않더라도 로직을 업데이트하고 6 개 또는 8 개의 위치/각도 요소를 추출해야하며 마지막 하나만 사용하는 리소스를 낭비 할 수 있다고 생각했습니다. 내 논리가 맞습니까? – dyeray

+0

나는 당신이 매우 중요한 관심사를 제기하고 있다고 생각합니다. 대부분의 경우, 당신이 신경 쓰는 오래된 업데이트의 양을 제한된 큐처럼 처리하거나 플러딩을 처리하기 위해 블로킹 또는 블로킹을하지 않는 것과 같은 유형의 큐가 있습니다. 여러 스레드를 시작하고 서로 물건을 던지는 단 몇 개의 단위 테스트. 그런 다음 다양한 옵션으로 재생하고 어떻게 작동하는지 확인할 수 있습니다. Java에서 동시 프로그래밍에 관심이 있다면 Brian Goetz가 "Java Concurrency in Practice"라는 책을 읽으십시오. 네가해야만한다면 훔치 라, 좋아. –