# HG changeset patch # User riono # Date 1620194248 -32400 # Node ID c65256380a809a2fec735f1257991e4845c60a98 # Parent 2dd23f9603b31bc1b7702c8926567de968517ab1 update diff -r 2dd23f9603b3 -r c65256380a80 Paper/riono-sigos.pdf Binary file Paper/riono-sigos.pdf has changed diff -r 2dd23f9603b3 -r c65256380a80 Paper/riono-sigos.tex --- a/Paper/riono-sigos.tex Tue May 04 23:41:09 2021 +0900 +++ b/Paper/riono-sigos.tex Wed May 05 14:57:28 2021 +0900 @@ -148,10 +148,6 @@ Code \ref{code:javaHWC} の2回の実行後、Code \ref{code:javaHWC} のローカル変数hello とworld が全て揃ったことによりCode \ref{code:javaHWC} が実行されプログラムは終了する。 -\section{Unity} - - - \section{C\# でのChristie} Code \ref{code:javaSHW} 、Code \ref{code:javaHWC} 、Code \ref{code:javaFHW} がC\#ではこうなります @@ -159,6 +155,8 @@ \lstinputlisting[caption=C\# StartHelloWorld, label=code:csSHW]{src/StartHelloWorld.cs} +\section{Unity} + \section{Unityでの動作} @@ -169,18 +167,18 @@ java 版ではDataGear を取得する際に、annotation という java の機能を用いて行った。C\#には annotation はなく、代わりにattribute を利用して DataGear の取得を行っている。 以下のCode \ref{code:javaTake}、Code \ref{code:csTake}はjava とC\# におけるTakeの実装である。 -\lstinputlisting[caption=java における Take annotation, label=code:javaTake]{src/Take.java} +\lstinputlisting[caption=java における Take annotation の実装, label=code:javaTake]{src/Take.java} -\lstinputlisting[caption=C\# における Take attribute, label=code:csTake]{src/Take.cs} +\lstinputlisting[caption=C\# における Take attribute の実装, label=code:csTake]{src/Take.cs} java でannotation を自作する際には、 @interfacs で宣言する。また、Code \ref{code:javaTake} の8行目ではannotation情報をどの段階まで保持するかを指定しており、Take の場合 JVMによって保存され、ランタイム環境で使用できる。9行目ではannotationの適用可能箇所を指定しており、フィールド変数に対して適応可能となっている。 C\# でattribute を作成する際には、 System.Attributeを継承する必要がある。attribute の適用可能箇所については、Code \ref{code:csTake} の4行目でフィールド変数を指定している。 \section{MessagePackの相違点} -Christie ではデータを送信する際に、MessagePack を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:mspackEx} はMessagePack の使用方法を示したものである。 +Christie ではデータを送信する際に、MessagePack を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:javamspackEx} はMessagePack の使用方法を示したものである。 -\lstinputlisting[caption=java 版におけるMessagePack の使用方法, label=code:javamspackEx]{src/MessagePackEx.java} +\lstinputlisting[caption=java におけるMessagePack の使用方法, label=code:javamspackEx]{src/MessagePackEx.java} MessagePack を使用するには圧縮するクラスに対して @Message annotationをつける必要がある。これにより、クラス内で定義したpublic変数が圧縮される。 Code \ref{code:javamspackEx} の17 - 21行目は圧縮解凍の例であり、MessagePackのインスタンスを作成後、msgpack.write(data) を行うことでbyte[] 型にdataを圧縮できる。 @@ -189,29 +187,16 @@ C\# のMessagePack は複数存在しており、java と同様な書き方をするMessagePack-CSharp を選択した。 -\lstinputlisting[caption=C\# 版におけるMessagePack の使用方法, label=code:csmspackEx]{src/MessagePackEx.cs} +\lstinputlisting[caption=C\# におけるMessagePack の使用方法, label=code:csmspackEx]{src/MessagePackEx.cs} MessagePack-CSharp ではjava 版と同様にクラスに対して圧縮を行うためCode \ref{code:csmspackEx} の1行目で MessagePackObject attribute を追加している。また、圧縮する変数に対してkey を設定することができ、int やstring を指定することができる。 -データの圧縮にはMessagePackSerializer.Serialize (data) を使用し、byte[] 型に圧縮される。解凍にはMessagePackSerializer.Deserialize$$(data) を使用する。Deserializeはジェネリスク関数であるため、$<>$内に解凍するデータのクラスを指定する。 +データの圧縮にはMessagePackSerializer.Serialize (data) を使用し、byte[] 型に圧縮される。解凍にはMessagePackSerializer.Deserialize$<$T$>$(data) を使用する。Deserializeはジェネリスク関数であるため、$<>$内に解凍するデータのクラスを指定する。 Code \ref{code:csmspackEx} の21行目では、変数それぞれにkey を設定していることでjson に展開することが可能である。 \section{CodeGear 実行時のThreadPool からTask への変更} -java では別Thread を - - - -\section{チート対策について} - -\section{実装の現状} +java 版ではCodeGearの実行にThreadPool を使用していた。C\# では書き換えの際にThreadPool よりも高機能なTask で書き換えを行った。 - -\nocite{*} -\bibliographystyle{ipsjunsrt} -\bibliography{riono-sigos} - - - -\end{document} +\lstinputlisting[caption=java におけるCodeGear を処理するThreadPool の実装の一部, label=code:javaExecutor]{src/ThreadPoolExecutor.java} diff -r 2dd23f9603b3 -r c65256380a80 Paper/src/ThreadPoolExecuter.cs --- a/Paper/src/ThreadPoolExecuter.cs Tue May 04 23:41:09 2021 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -public class ThreadPoolExecutors { - - public ThreadPoolExecutors() { - int nWorkerThreads; - int nIOThreads; - ThreadPool.GetMinThreads(out nWorkerThreads, out nIOThreads); - ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads); - } - - public ThreadPoolExecutors(int nWorkerThreads, int nIOThreads) { - ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads); - } - - public void Execute(CodeGearExecutor command) { - Task.Factory.StartNew(() => command.Run()); - } -} \ No newline at end of file diff -r 2dd23f9603b3 -r c65256380a80 Paper/src/ThreadPoolExecutor.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/ThreadPoolExecutor.cs Wed May 05 14:57:28 2021 +0900 @@ -0,0 +1,17 @@ +public class ThreadPoolExecutors { + + public ThreadPoolExecutors() { + int nWorkerThreads; + int nIOThreads; + ThreadPool.GetMinThreads(out nWorkerThreads, out nIOThreads); + ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads); + } + + public ThreadPoolExecutors(int nWorkerThreads, int nIOThreads) { + ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads); + } + + public void Execute(CodeGearExecutor command) { + Task.Factory.StartNew(() => command.Run()); + } +} \ No newline at end of file diff -r 2dd23f9603b3 -r c65256380a80 Paper/src/ThreadPoolExecutor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/ThreadPoolExecutor.java Wed May 05 14:57:28 2021 +0900 @@ -0,0 +1,35 @@ +public class PriorityThreadPoolExecutors { + + public static ThreadPoolExecutor createThreadPool(int nThreads, int keepAliveTime) { + return new PriorityThreadPoolExecutor(nThreads, nThreads, keepAliveTime, TimeUnit.MILLISECONDS); + } + private static class PriorityThreadPoolExecutor extends ThreadPoolExecutor { + private static final int DEFAULT_PRIORITY = 0; + private static AtomicLong instanceCounter = new AtomicLong(); + + public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, + int keepAliveTime, TimeUnit unit) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, (BlockingQueue) new PriorityBlockingQueue(10, + ComparableTask.comparatorByPriorityAndSequentialOrder())); + } + + @Override + public void execute(Runnable command) { + // If this is ugly then delegator pattern needed + if (command instanceof ComparableTask) //Already wrapped + super.execute(command); + else { + super.execute(newComparableRunnableFor(command)); + } + } + + private Runnable newComparableRunnableFor(Runnable runnable) { + return new ComparableRunnable((CodeGearExecutor) runnable); + } + + @Override + protected RunnableFuture newTaskFor(Runnable runnable, T value) { + return new ComparableFutureTask<>((CodeGearExecutor)runnable, value); + } + } +}