ক্লোজুরে একটি স্পেস ফ্লাইট সিমুলেটর বিকাশ করা · জান ওয়েডেকাইন্ড

ক্লোজুরে একটি স্পেস ফ্লাইট সিমুলেটর বিকাশ করা · জান ওয়েডেকাইন্ড

https://www.youtube.com/watch?v=38fgt7swvh0

2017 সালে আমি নিখরচায় আবিষ্কার করেছি অরবিটার 2016 স্পেস ফ্লাইট সিমুলেটর যা সেই সময়ে মালিকানাধীন ছিল এবং এটি আমাকে নিজেই একটি স্পেস ফ্লাইট সিমুলেটর বিকাশ করতে অনুপ্রাণিত করেছিল। আমি সি এবং পরে কিছু অনমনীয় বডি ফিজিক্স প্রোটোটাইপ করেছি জিএনইউ গিল এবং ওয়েভফ্রন্ট ওবিজে ফাইলগুলির লোডিং এবং রেন্ডারিং প্রোটোটাইপড। আমি জিএনইউ গিল (একটি স্কিম বাস্তবায়ন) ব্যবহার করেছি কারণ এটির একটি ভাল নেটিভ ইন্টারফেস রয়েছে এবং অবশ্যই এটিতে স্বাস্থ্যকর ম্যাক্রো রয়েছে। অবশেষে আমি ক্লোজুরে আগ্রহী হয়ে উঠলাম কারণ জিএনইউ গিলির বিপরীতে এটিতে মাল্টি-পদ্ধতি রয়েছে পাশাপাশি দ্রুত হ্যাশ মানচিত্র এবং ভেক্টর রয়েছে। আমি অবশেষে ক্লোজুরে রিয়ালের জন্য গেমটি বিকাশের সিদ্ধান্ত নিয়েছি। আমি প্রায় 5 বছর ধরে ক্লোজারে একটি স্পেস ফ্লাইট সিমুলেটর বিকাশ করছি। ক্লোজুর ব্যবহার করার সময় আমি পরমাণু, এজেন্ট এবং রেফ ব্যবহার করে অপরিবর্তনীয় মান এবং নিরাপদ সমান্তরালতার প্রশংসা করতে এসেছি।

শুরুতে আমি প্রথমে হার্ড পার্টসগুলিতে কাজ করার সিদ্ধান্ত নিয়েছিলাম, যা আমার জন্য একটি গ্রহ, একটি পরিবেশ, ছায়া এবং ভলিউম্যাট্রিক মেঘের 3 ডি রেন্ডারিং ছিল। আমি পড়েছি ওপেনজিএল দুর্দান্ত ওপেনজিএল কী কার্যকারিতা সরবরাহ করে তা বোঝার জন্য। যখন অরবিটারটি শেষ পর্যন্ত খোলা ছিল এবং আনটার এমআইটি লাইসেন্স প্রকাশিত হয়েছিল এখানেআমি উত্স কোডটি পরিদর্শন করেছি এবং আবিষ্কার করেছি যে কোডের প্রায় 90% গ্রাফিক্স সম্পর্কিত। সুতরাং গ্রাফিক্স সমস্যাগুলি দিয়ে শুরু করা কোনও খারাপ সিদ্ধান্ত ছিল না।

সফ্টওয়্যার নির্ভরতা

নিম্নলিখিত সফ্টওয়্যারটি উন্নয়নের জন্য ব্যবহৃত হয়। সফ্টওয়্যার লাইব্রেরিগুলি জিএনইউ/লিনাক্স এবং মাইক্রোসফ্ট উভয় উইন্ডোজে চালিত হয়।

  • ক্লোজুরে প্রোগ্রামিং ভাষা
  • ক্ষয় বিভিন্ন লাইব্রেরির জন্য জাভা মোড়ক সরবরাহ করে
    • 3 ডি গ্রাফিক্সের জন্য lwjgl- ওপেনগল
    • উইন্ডোজিং এবং ইনপুট ডিভাইসের জন্য lwjgl-glfw
    • গ্রাফিকাল ইউজার ইন্টারফেসের জন্য lwjgl-nuklear
    • চিত্র I/O এর জন্য lwjgl-Stb এবং ট্রুয়েটাইপ ফন্টগুলি ব্যবহার করে
    • অ্যানিমেশন ডেটা সহ জিএলটিএফ 3 ডি মডেল লোড করতে lwjgl-assmp
  • জোল্ট পদার্থবিজ্ঞান চাকাযুক্ত যানবাহন এবং মেসের সাথে সংঘর্ষের অনুকরণ করতে
  • ফাস্টম্যাথ দ্রুত ম্যাট্রিক্স এবং ভেক্টর গণিতের পাশাপাশি স্প্লাইন ইন্টারপোলেশন
  • ঝুঁটি শেডার কোড টেম্প্লেটিংয়ের জন্য
  • এন্ট্রি -লেভেল নাসা প্ল্যানেটারি কনস্ট্যান্ট কার্নেল (পিসিকে) ফাইলগুলি পার্স করতে
  • গ্লস নাসা ডাবল যথার্থ অ্যারে ফাইলগুলি পার্স করতে (ডিএএফ)
  • কফি একটি বিদেশী ফাংশন ইন্টারফেস হিসাবে
  • কোর.মেমোইজ কমপক্ষে ব্যবহৃত ফাংশন ফলাফলের ক্যাচিং
  • অ্যাপাচি কমন্স সংকুচিত টার ফাইলগুলি থেকে মানচিত্রের টাইলগুলি পড়তে
  • কুইড ফাংশনগুলিতে স্কিমাস যুক্ত করতে
  • ইমুকনফ কনফিগারেশন ফাইল লোড করতে
  • অগ্রগতি দীর্ঘ চলমান বিল্ডগুলির জন্য একটি অগ্রগতি বার
  • ক্লেপুল লুপগুলির জন্য সমান্তরাল প্রয়োগ করতে
  • সরঞ্জাম.বিল্ড প্রকল্পটি তৈরি করতে
  • সিএলজে-অ্যাসিঙ্ক-প্রোফাইলার ক্লোজুর প্রোফাইলার শিখা গ্রাফ তৈরি করছে
  • Slf4j-timbre ক্লোজুরের জন্য জাভা লগিং বাস্তবায়ন

দ্য Depp.edn ফাইলটিতে অপারেটিং সিস্টেম নির্ভর এলডাব্লুজিজিএল বাইন্ডিং রয়েছে। উদাহরণস্বরূপ জিএনইউ/লিনাক্সে Depp.edn ফাইলটিতে নিম্নলিখিত রয়েছে:

{:deps {; ...
        org.lwjgl/lwjgl {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl$natives-linux {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-opengl {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-opengl$natives-linux {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-glfw {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-glfw$natives-linux {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-nuklear {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-nuklear$natives-linux {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-stb {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-stb$natives-linux {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-assimp {:mvn/version "3.3.6"}
        org.lwjgl/lwjgl-assimp$natives-linux {:mvn/version "3.3.6"}}
        ; ...
        }

মাইক্রোসফ্ট উইন্ডোজের জন্য বিভিন্ন নির্ভরতা পরিচালনা করার জন্য, একটি পৃথক গিট শাখা বজায় রাখা হয়।

বায়ুমণ্ডল রেন্ডারিং

https://www.youtube.com/watch?v=Q9AWD_14QHA

বায়ুমণ্ডলের জন্য, ব্রুনটনের পূর্বনির্ধারিত বায়ুমণ্ডলীয় ছড়িয়ে ছিটিয়ে ব্যবহৃত হয়েছিল। বাস্তবায়নে একটি 2 ডি ট্রান্সমিট্যান্স টেবিল, একটি 2 ডি পৃষ্ঠের ছড়িয়ে ছিটিয়ে থাকা টেবিল, একটি 4 ডি রায়লেহ স্কেটারিং এবং একটি 4 ডি এমআইই ছড়িয়ে ছিটিয়ে থাকা টেবিল ব্যবহার করা হয়। টেবিলগুলি সংখ্যার সংহতকরণের বেশ কয়েকটি পুনরাবৃত্তি ব্যবহার করে গণনা করা হয়। একটি গোলক এবং একটি লাইন বিভাগের উপর একীকরণের জন্য উচ্চতর অর্ডার ফাংশনগুলি ক্লোজারে প্রয়োগ করা হয়েছিল। 3 ডি স্পেসে একটি রশ্মির উপর সংহতকরণ (ফাস্টমাথ ভেক্টর ব্যবহার করে) উদাহরণস্বরূপ প্রয়োগ করা হয়েছিল: উদাহরণস্বরূপ:

(defn integral-ray
  "Integrate given function over a ray in 3D space"
  {:malli/schema (:=> (:cat ray N :double (:=> (:cat (:vector :double)) :some)) :some)}
  ({::keys (origin direction)} steps distance fun)
  (let (stepsize      (/ distance steps)
        samples       (mapv #(* (+ 0.5 %) stepsize) (range steps))
        interpolate   (fn interpolate (s) (add origin (mult direction s)))
        direction-len (mag direction))
    (reduce add (mapv #(-> % interpolate fun (mult (* stepsize direction-len))) samples))))

যদিও বায়ুমণ্ডলীয় টেবিলগুলি প্রাকপম্পিউট করতে বেশ কয়েক ঘন্টা সময় লাগে পিএমএপি ব্যবহৃত হয়েছিল। বহুমাত্রিক ফাংশনগুলির নমুনা দেওয়ার সময়, পিএমএপি শীর্ষ স্তরের লুপ হিসাবে ব্যবহৃত হয়েছিল এবং মানচিত্র অভ্যন্তর লুপের জন্য ব্যবহৃত হয়েছিল। ব্যবহার java.nio.bytebuffer ভাসমান পয়েন্টের মানগুলি একটি বাইট অ্যারে রূপান্তরিত হয়েছিল এবং তারপরে একটি ব্যবহার করে ডিস্কে লেখা হয়েছিল ক্লোজুর.জাভা.আইও/আউটপুট-স্ট্রিম::

(defn floats->bytes
  "Convert float array to byte buffer"
  (^floats float-data)
  (let (n           (count float-data)
        byte-buffer (.order (ByteBuffer/allocate (* n 4)) ByteOrder/LITTLE_ENDIAN))
    (.put (.asFloatBuffer byte-buffer) float-data)
    (.array byte-buffer)))

(defn spit-bytes
  "Write bytes to a file"
  {:malli/schema (:=> (:cat non-empty-string bytes?) :nil)}
  (^String file-name ^bytes byte-data)
  (with-open (out (io/output-stream file-name))
    (.write out byte-data)))

(defn spit-floats
  "Write floating point numbers to a file"
  {:malli/schema (:=> (:cat non-empty-string seqable?) :nil)}
  (^String file-name ^floats float-data)
  (spit-bytes file-name (floats->bytes float-data)))

গেমটি চালু করার সময়, লুকআপ টেবিলগুলি লোড হয়ে যায় এবং ওপেনজিএল টেক্সচারে অনুলিপি করে। শেডার ফাংশনগুলি টেবিলগুলি থেকে মানগুলি সন্ধান এবং ইন্টারপোলেট করতে ব্যবহৃত হয়। গ্রহের পৃষ্ঠ বা মহাকাশ কারুকাজের রেন্ডার করার সময়, বায়ুমণ্ডলটি মূলত রে ট্রেসিং ব্যবহার করে সুপারিম্পোজড হয়ে যায়। গ্রহটি রেন্ডার করার পরে, একটি ব্যাকগ্রাউন্ড কোয়াড দিগন্তের উপরে বায়ুমণ্ডলের অবশিষ্ট অংশটি প্রদর্শন করার জন্য রেন্ডার করা হয়।

ওপেনজিএল শেডারগুলি টেম্প্লেটিং

ওপেনজিএল শেডারগুলির সাথে প্রোগ্রামিংকে আরও নমনীয় হিসাবে তৈরি করা সম্ভব যেমন একটি টেম্প্লেটিং লাইব্রেরি যেমন ব্যবহার করে ঝুঁটি। নিম্নলিখিত শেডারটি বেস শব্দের ফাংশনে একাধিক অষ্টক শব্দের সংজ্ঞা দেয়:

#version 410 core

float <%= base-function %>(vec3 idx);

float <%= method-name %>(vec3 idx)
{
  float result = 0.0;
<% (doseq (multiplier octaves) %>
  result += <%= multiplier %> * <%= base-function %>(idx);
  idx *= 2;
<% ) %>
  return result;
}

এরপরে কেউ উদাহরণস্বরূপ ফাংশনটি সংজ্ঞায়িত করতে পারে fbm_noise বেস ফাংশনের অক্টেভ ব্যবহার করে শব্দ নিম্নরূপ:

(def noise-octaves
  "Shader function to sum octaves of noise"
  (template/fn (method-name base-function octaves) (slurp "resources/shaders/core/noise-octaves.glsl")))

; ...

(def fbm-noise-shader (noise-octaves "fbm_noise" "noise" (0.57 0.28 0.15)))

প্ল্যানেট রেন্ডারিং

https://www.youtube.com/watch?v=ce3owqflyoy

গ্রহকে রেন্ডার করতে, নাসা ব্লুমার্বল ডেটা, নাসা ব্ল্যাকমার্বল ডেটা, এবং নাসা উচ্চতা ডেটা ব্যবহার করা হয়েছিল। চিত্রগুলি মানচিত্রের টাইলগুলির একটি মাল্টি রেজোলিউশন পিরামিডে রূপান্তরিত হয়েছিল। নিম্নলিখিত ফাংশনগুলি রঙ মানচিত্রের টাইলগুলির জন্য এবং উচ্চতা টাইলগুলির জন্য প্রয়োগ করা হয়েছিল:

  • প্রদত্ত 2 ডি টাইল সূচক এবং বিশদ স্তরের স্তরের টাইলস লোড এবং ক্যাশে করার জন্য একটি ফাংশন
  • মানচিত্রের টাইল থেকে একটি পিক্সেল বের করার জন্য একটি ফাংশন
  • একটি নির্দিষ্ট দ্রাঘিমাংশ এবং অক্ষাংশের জন্য পিক্সেল বের করার জন্য একটি ফাংশন

প্রদত্ত দ্রাঘিমাংশ এবং অক্ষাংশের জন্য পিক্সেল উত্তোলনের জন্য ফাংশনগুলি প্রতিটি মুখের জন্য টাইলগুলির কোয়াড ট্রি সহ একটি ঘনক্ষেত্রের মানচিত্র তৈরি করতে ব্যবহৃত হত। প্রতিটি টাইলের জন্য, নিম্নলিখিত ফাইলগুলি উত্পন্ন হয়েছিল:

  • একটি দিনের টেক্সচার
  • একটি নাইট টাইম টেক্সচার
  • পৃষ্ঠের জাল সংজ্ঞায়িত 3 ডি ভেক্টরগুলির একটি চিত্র
  • একটি জলের মুখোশ
  • একটি সাধারণ মানচিত্র

সামগ্রিকভাবে 655350 ফাইল উত্পন্ন হয়েছিল। যেহেতু স্টিম কন্টেন্টবিল্ডার বিপুল সংখ্যক ফাইলকে সমর্থন করে না, তাই টাইল ডেটার প্রতিটি সারি একটি টার ফাইলে একত্রিত হয়েছিল। দ্য অ্যাপাচি কমন্স সংকুচিত লাইব্রেরি আপনাকে এন্ট্রিগুলির একটি তালিকা পেতে এবং তারপরে টার ফাইলের সামগ্রীতে এলোমেলো অ্যাক্সেস সম্পাদন করতে একটি টার ফাইল খুলতে দেয়। উন্নত পারফরম্যান্সের জন্য খোলা টার ফাইলগুলির ক্যাশে বজায় রাখতে একটি ক্লোজুর এলআরইউ ক্যাশে ব্যবহৃত হয়েছিল।

রান সময়ে, একটি ভবিষ্যত তৈরি করা হয়, যা একটি আপডেট হওয়া টাইল ট্রি, ড্রপ করার জন্য টাইলগুলির একটি তালিকা এবং ওপেনজেলিতে লোড করার জন্য টাইলগুলির একটি পাথ তালিকা দেয়। যখন ভবিষ্যতটি উপলব্ধি করা হয়, মূল থ্রেডটি ড্রপ তালিকা থেকে ওপেনজিএল টেক্সচারগুলি মুছে দেয় এবং তারপরে টাইল গাছ থেকে নতুন লোডযুক্ত চিত্রগুলি পেতে, ওপেনজিএল টেক্সচারে লোড করতে এবং নতুন ওপেনজিএল টেক্সচার যুক্ত করে একটি আপডেট টাইল গাছ তৈরি করতে পাথ তালিকাটি ব্যবহার করে। কোয়াড গাছগুলি হেরফের করার জন্য নিম্নলিখিত ফাংশনগুলি এটি উপলব্ধি করার জন্য প্রয়োগ করা হয়েছিল:

(defn quadtree-add
  "Add tiles to quad tree"
  {:malli/schema (:=> (:cat (:maybe :map) (:sequential (:vector :keyword)) (:sequential :map)) (:maybe :map))}
  (tree paths tiles)
  (reduce (fn add-title-to-quadtree (tree (path tile)) (assoc-in tree path tile)) tree (mapv vector paths tiles)))

(defn quadtree-extract
  "Extract a list of tiles from quad tree"
  {:malli/schema (:=> (:cat (:maybe :map) (:sequential (:vector :keyword))) (:vector :map))}
  (tree paths)
  (mapv (partial get-in tree) paths))

(defn quadtree-drop
  "Drop tiles specified by path list from quad tree"
  {:malli/schema (:=> (:cat (:maybe :map) (:sequential (:vector :keyword))) (:maybe :map))}
  (tree paths)
  (reduce dissoc-in tree paths))

(defn quadtree-update
  "Update tiles with specified paths using a function with optional arguments from lists"
  {:malli/schema (:=> (:cat (:maybe :map) (:sequential (:vector :keyword)) fn? (:* :any)) (:maybe :map))}
  (tree paths fun & arglists)
  (reduce (fn update-tile-in-quadtree
            (tree (path & args))
            (apply update-in tree path fun args)) tree (apply map list paths arglists)))

অন্যান্য বিষয়

সৌর সিস্টেম

গ্রহগুলির অবস্থান এবং ওরিয়েন্টেশন পাওয়ার জন্য জ্যোতির্বিজ্ঞানের কোডটি অনুসারে প্রয়োগ করা হয়েছিল ডিস্ক ব্রিল্ড পাইথন লাইব্রেরি। ঘুরেফিরে পাইথন লাইব্রেরি উপর ভিত্তি করে মশলা নাসা জেপিএল এর টুলকিট। জেপিএল মূলত এর ক্রম সরবরাহ করে চেবিশেভ বহুবর্ষ চাঁদ এবং গ্রহগুলির পাশাপাশি বাইনারি ফাইল হিসাবে চাঁদের ওরিয়েন্টেশনকে ইন্টারপোলেট করা। অন্যান্য সংস্থার রেফারেন্স সমন্বয় ব্যবস্থা এবং ওরিয়েন্টেশনগুলি পাঠ্য ফাইলগুলিতে সরবরাহ করা হয় যা মানব এবং মেশিন পঠনযোগ্য বিভাগগুলি নিয়ে গঠিত। বাইনারি ফাইলগুলি ব্যবহার করে পার্স করা হয়েছিল গ্লস (দেখুন উইকি কিছু উদাহরণের জন্য) এবং পাঠ্য ফাইলগুলি ব্যবহার করে এন্ট্রি -লেভেল

জোল্ট বাইন্ডিংস

চাকাযুক্ত যানবাহন গতিশীলতার জন্য প্রয়োজনীয় জোল্ট ফাংশনগুলি এবং মেসের সাথে সংঘর্ষগুলি সি ফাংশনে আবৃত এবং একটি ভাগ করা লাইব্রেরিতে সংকলিত হয়েছিল। দ্য কফি ক্লোজুর লাইব্রেরি (যা জাভার নতুন বিদেশী ফাংশন এবং মেমরি এপিআইয়ের জন্য একটি মোড়ক) ক্লোজুরে সি ফাংশন এবং ডেটা ধরণের ব্যবহারযোগ্য করতে ব্যবহৃত হয়েছিল।

উদাহরণস্বরূপ নিম্নলিখিত কোডটি সি ফাংশনে একটি কল প্রয়োগ করে অ্যাড_ফোর্স::

(defcfn add-force
  "Apply a force in the next physics update"
  add_force (::mem/int ::vec3) ::mem/void)

এখানে :: vec3 বেসিক প্রকারগুলি ব্যবহার করে সংজ্ঞায়িত একটি কাস্টম যৌগিক প্রকারকে বোঝায়। মেমরি লেআউট, সিরিয়ালাইজেশন এবং জন্য মরুভূমির জন্য :: vec3 নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

(def vec3-struct
  (::mem/struct
   ((:x ::mem/double)
    (:y ::mem/double)
    (:z ::mem/double))))


(defmethod mem/c-layout ::vec3
  (_vec3)
  (mem/c-layout vec3-struct))


(defmethod mem/serialize-into ::vec3
  (obj _vec3 segment arena)
  (mem/serialize-into {:x (obj 0) :y (obj 1) :z (obj 2)} vec3-struct segment arena))


(defmethod mem/deserialize-from ::vec3
  (segment _vec3)
  (let (result (mem/deserialize-from segment vec3-struct))
    (vec3 (:x result) (:y result) (:z result))))

পারফরম্যান্স

দ্য সিএলজে-অ্যাসিঙ্ক-প্রোফাইলার গেমের পারফরম্যান্স ভিজ্যুয়ালাইজিং শিখা গ্রাফ তৈরি করতে ব্যবহৃত হয়েছিল। পর্যাপ্ত ধরণের ঘোষণা ছাড়াই জাভা কলগুলির জন্য প্রতিচ্ছবি সতর্কতা পেতে, *সতর্কতা-অন-প্রতিবিম্ব* সেট করা ছিল সত্য

(set! *warn-on-reflection* true)

তদুপরি সংখ্যার ধরণের অনুপস্থিত ঘোষণাগুলি আবিষ্কার করা, *আনচেকড-ম্যাথ* সেট করা ছিল : সতর্কতা-অন-বক্সড

(set! *unchecked-math* :warn-on-boxed)

আবর্জনা সংগ্রাহক বিরতি কমাতে, জেভিএমের জন্য জেডজিসি লো-ল্যাটেন্সি আবর্জনা সংগ্রাহক ব্যবহার করা হয়েছিল। নিম্নলিখিত বিভাগে Depp.edn প্রকল্পটি চালানোর সময় জেডজিসি আবর্জনা সংগ্রাহক ব্যবহৃত হয় তা নিশ্চিত করে সিএলজে -এম: রান::

{:deps {; ...
        }
 :aliases {:run {:jvm-opts ("-Xms2g" "-Xmx4g" "--enable-native-access=ALL-UNNAMED" "-XX:+UseZGC"
                            "--sun-misc-unsafe-memory-access=allow")
                 :main-opts ("-m" "sfsim.core")}}}

জেডজিসি ব্যবহারের বিকল্পটি অ্যাপ্লিকেশনটি স্থাপনের জন্য ব্যবহৃত প্যাকআর জেএসএন ফাইলেও নির্দিষ্ট করা হয়েছে।

প্রকল্প নির্মাণ

মানচিত্রের টাইলস, বায়ুমণ্ডলীয় লুকআপ টেবিল এবং অন্যান্য ডেটা ফাইলগুলি ব্যবহার করে তৈরি করার জন্য সরঞ্জাম.বিল্ডপ্রকল্প উত্স কোডটি উপলব্ধ করা হয়েছিল বিল্ড.সিএলজে ফাইল ব্যবহার করে ফাইল : স্থানীয়/মূল নির্ভরতা:

{:deps {; ...
        }
 :aliases {; ...
           :build {:deps {io.github.clojure/tools.build {:mvn/version "0.10.10"}
                          sfsim/sfsim {:local/root "."}}
                   :ns-default build
                   :exec-fn all
                   :jvm-opts ("-Xms2g" "-Xmx4g" "--sun-misc-unsafe-memory-access=allow")}}}

প্রকল্পের বিভিন্ন উপাদান তৈরি করতে বিভিন্ন লক্ষ্যগুলি সংজ্ঞায়িত করা হয়েছিল। উদাহরণস্বরূপ বায়ুমণ্ডলীয় লুকআপ টেবিলগুলি নির্দিষ্ট করে তৈরি করা যেতে পারে সিএলজে -টি: বায়ুমণ্ডল -লুট তৈরি করুন কমান্ড লাইনে।

নিম্নলিখিত বিভাগ বিল্ড.সিএলজে নির্দিষ্ট করে সমস্ত নির্ভরতা সহ একটি “উবারজার” জার ফাইল তৈরির অনুমতি দেওয়ার জন্য ফাইল যুক্ত করা হয়েছিল সিএলজে -টি: উবার তৈরি করুন কমান্ড-লাইনে।

(defn uber (_)
  (b/copy-dir {:src-dirs ("src/clj")
               :target-dir class-dir})
  (b/compile-clj {:basis basis
                  :src-dirs ("src/clj")
                  :class-dir class-dir})
  (b/uber {:class-dir class-dir
           :uber-file "target/sfsim.jar"
           :basis basis
           :main 'sfsim.core}))

প্যাকআর দিয়ে এক্সিকিউটেবল একটি লিনাক্স তৈরি করতে, কেউ তারপরে চালাতে পারে জাভা-জার প্যাকআর-অল -4.0.0.jar স্ক্রিপ্টস/প্যাকআর-কনফিফিগ-লিনাক্স.জসন যেখানে JSON ফাইলটিতে নিম্নলিখিত সামগ্রী রয়েছে:

{
  "platform": "linux64",
  "jdk": "/usr/lib/jvm/jdk-24.0.2-oracle-x64",
  "executable": "sfsim",
  "classpath": ("target/sfsim.jar"),
  "mainclass": "sfsim.core",
  "resources": ("LICENSE", "libjolt.so", "venturestar.glb", "resources"),
  "vmargs": ("Xms2g", "Xmx4g", "XX:+UseZGC"),
  "output": "out-linux"
}

বাষ্পে গেমটি বিতরণ করার জন্য, তিনটি ডিপো তৈরি করা হয়েছিল:

  • অপারেটিং সিস্টেমের স্বতন্ত্র ডেটা ফাইলগুলির সাথে একটি ডেটা ডিপো
  • LWJGL এর লিনাক্স নেটিভ বাইন্ডিং সহ লিনাক্স এক্সিকিউটেবল এবং উবারজার সহ একটি লিনাক্স ডিপো
  • এবং উইন্ডোজ এক্সিকিউটেবল সহ একটি উইন্ডোজ ডিপো এবং এলডাব্লুজিজিএল এর উইন্ডোজ নেটিভ বাইন্ডিং সহ একটি উবারজার

কোনও ডিপো আপডেট করার সময়, স্টিম কন্টেন্টবিল্ডার কমান্ড লাইন সরঞ্জাম স্টোরেজ স্পেস এবং ব্যান্ডউইথ সংরক্ষণের জন্য একটি প্যাচ তৈরি করে এবং আপলোড করে।

ভবিষ্যতের কাজ

যদিও হার্ড অংশগুলি বেশিরভাগই করা হয়, তবুও বেশ কয়েকটি কাজ করার আছে:

  • পৃষ্ঠতল এবং থ্রাস্টার গ্রাফিক্স নিয়ন্ত্রণ করুন
  • লঞ্চপ্যাড এবং রানওয়ে গ্রাফিক্স
  • শব্দ প্রভাব
  • একটি 3 ডি ককপিট
  • চাঁদ
  • একটি স্পেস স্টেশন

গেমটিকে নিরাপদ উপায়ে মোডেবল করাও আকর্ষণীয় হবে (সম্ভবত কোনও স্যান্ডবক্সযুক্ত পরিবেশে ক্লোজুর ফাইলগুলি মূল্যায়ন করা?)।

উপসংহার

https://www.youtube.com/watch?v=1PQMVLUT5_G

আপনি খুঁজে পেতে পারেন গিটহাবের উত্স কোড। বর্তমানে কেবলমাত্র একটি প্লেস্টেস্ট বিল্ড রয়েছে, তবে আপনি যদি অবহিত করতে চান, যখন গেমটি প্রকাশিত হয়, আপনি পারেন এটি এখানে ইচ্ছুক

যাইহোক, আমাকে কোনও মন্তব্য এবং পরামর্শ জানান।

উপভোগ করুন!

Source link