সি # / এক্সএনএ হার্ডওয়্যার মাউসের অবস্থান পান


10

আমি সি # ব্যবহার করছি এবং হার্ডওয়্যার মাউসের অবস্থান পাওয়ার চেষ্টা করছি। আমি প্রথমে চেষ্টা করেছিলাম সাধারণ এক্সএনএ কার্যকারিতা যা ব্যবহার করা সহজ

Vector2 position = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);

এর পরে আমি মাউসের অঙ্কনও করি এবং উইন্ডোজ হার্ডওয়্যার মাউসের সাথে তুলনা করি, এক্সএনএ প্রদত্ত সমন্বয়যুক্ত এই নতুন মাউসটি "স্ল্যাকিং অফ"। তার মানে আমার, এটি কয়েকটি ফ্রেমের পিছনে রয়েছে। উদাহরণস্বরূপ, যদি গেমটি 600 fps এ চলেছে তবে অভিশাপটি এটি প্রতিক্রিয়াশীল, তবে 60 fps এ সফ্টওয়্যার মাউসের বিলম্বটি আর গ্রহণযোগ্য নয়। অতএব আমি যা মনে করেছি এটি একটি হার্ডওয়্যার মাউস হিসাবে ব্যবহার করার চেষ্টা করেছি,

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT lpPoint);

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

GraphicsDeviceManager.SynchronizeWithVerticalRetrace = true/false
Game.IsFixedTimeStep = true/fale

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


2
Mouse.GetState()ভাঙা ভাবি না । আপনি কি নিশ্চিত যে আপনি এটি আঁকছেন ঠিক একই ফ্রেমে মাউস পজিশন পাচ্ছেন? এছাড়াও মনে রাখবেন যে উইন্ডোজ কার্সারে ত্বরণ / পতন সক্ষম হয়েছে, সুতরাং এটি আরও প্রতিক্রিয়াশীল বোধ করে । আপনি যদি হার্ডওয়্যারটির কাছাকাছি যেতে চান তবে আপনার ডাইরেক্টইনপুটটি আঘাত করা উচিত, যা আপনাকে পরম মাউসের অবস্থানের পরিবর্তে চলাচল ডেল্টাস দেয়। তবে আমি বিশ্বাস করি যে Mouse.GetState()এটি এখনও এক্সএনএ-তে করার সঠিক উপায়।
পান্ডা পাইজামা

না, Mouse.GetState()ভাঙ্গা নেই এবং যতক্ষণ IsFixedTimeStep == trueনা লোকেরা সরাসরি দৃশ্যমান উইন্ডো মাউসের সাথে তুলনা না করে দেরি করতে সক্ষম হয় না। তবে নিম্ন ফ্রেমরেটে ইসফিক্সডটাইমস্টেপটিকে মিথ্যা হিসাবে সেট করা প্রত্যেকের কাছে দৃশ্যমান হয়। সরাসরি ইনপুট সম্পর্কে আমি বিবেচনা করেছি যে একটি ইতিবাচকতা (শেষ অবলম্বন)।
সুন্দর

আপনি যা চান তা নিশ্চিত না, তবে আপনার উইন্ডোতে থাকা অবস্থায় কার্সার স্প্রিট পরিবর্তন করার বিষয়ে কী হবে, এবং তারপরে এটিকে সর্বদা দৃশ্যমান করা যায়?
উইলিয়াম মেরিজার

ঠিক আমি যা করছি তা হ'ল, বিষয়টি হ'ল আমি কেবল এটি দেখাতে চাই না, তবে মাউসের সঠিক অবস্থানটিও জানতে চাই। তবে আমি যা পাচ্ছি তা কী হওয়া উচিত তার পিছনে কিছুটা পিছনে।
সুন্দর

উত্তর:


17

আপনি যা দেখছেন তা ইনপুট ল্যাগ নয়।

উইন্ডোজটিতে কার্সারের অবস্থান পেতে আপনি ব্যবহার করতে পারেন WM_MOUSEMOVEবা করতে পারেন GetCursorPos। তারা উভয়ই ত্বরণের মতো জিনিস প্রয়োগ করে উইন্ডোজ এটি প্রক্রিয়া করার পরে কার্সারের অবস্থান সরবরাহ করে। এটি কার্সার অবস্থান যা উইন্ডোজ অঙ্কন সহ ব্যবহার করে। এবং প্রায়শই আপনি যা ব্যবহার করতে চান তা সর্বদা।

এক্সএনএ এটি ব্যবহার করে । বিশেষত GetCursorPos( এমএসডিএন )। এর অর্থ হ'ল Mouse.GetState, আপনি যখন কল করবেন তখন উইন্ডোজ যেমন দেখছে আপনি কার্সারের আসল অবস্থানটি পেয়ে যাচ্ছেন - কার্যত শূন্যের বিলম্বের সাথে।

এখন, আপনি ব্যবহার করতে পারেন WM_INPUT(বা ডাইরেক্টইনপুট, যদিও এটি হ্রাস করা হয়েছে)। এটি আপনাকে কাঁচা পয়েন্টার ডেটা দেয়। এটি উইন্ডোজ ত্বরণের মতো জিনিসগুলি প্রয়োগ করার আগে এবং সাধারণত আপনি যা চান তা তা নয়

আপনি যা দেখছেন তা হ'ল আউটপুট লেগ।

এটি " হার্ডওয়্যার কার্সার " এর কারণেই । এটি একটি ছোট স্প্রিট যা জিপিইউর পাইপলাইনের একেবারে শেষে স্ক্রিনে আঁকতে পারে । এবং আমি শেষ মানে । এটি ফ্রেম বাফারের পরে আসে - চিত্রটি মনিটরে প্রেরণ করা হওয়ায় এটি ডেটা প্রবাহে সন্নিবেশিত হয়। এটি এত তাড়াতাড়ি প্রতিক্রিয়া করার কারণ হ'ল এটির অবস্থানটি সরাসরি জিপিইউ রেজিস্টার সেট করে। পাইপলাইনে মোটেও অপেক্ষা নেই।

অন্যদিকে আপনার গেমটি জিপিইউ পাইপলাইন দিয়ে যেতে হবে। এটি নিজস্বভাবে প্রচুর বিলম্ব যুক্ত করে। আপনার জন্য এর মধ্যে সবচেয়ে সমস্যাটি হ'ল ডাবল-বাফারিং - যা (আমি বেশ নিশ্চিত) আপনি এক্সএনএ ৪ এ বন্ধ করতে পারবেন না You আপনি সরাসরি ফ্রেম বাফারের দিকে আঁকেন না - আপনি ব্যাকবফারের দিকে আঁকুন। যা প্রতি ms 16ms (60FPS এ) উপস্থাপিত হয়। এর অর্থ আপনি সেই Mouse.GetStateস্ক্রিনটির অন স্ক্রিনের ভিত্তিতে কিছু পাওয়ার ফলাফল পাওয়ার মধ্যে সর্বনিম্ন 16 মিমের দিকে তাকিয়ে আছেন । সম্ভবত দীর্ঘ। অবশ্যই হার্ডওয়ার কার্সারের চেয়ে অনেক ধীর।

তাহলে সমাধানগুলি কী?

একটি হ'ল হার্ডওয়্যার কার্সার দ্বারা প্রদর্শিত চিত্রটি পরিবর্তনের জন্য SetCursor( এমএসডিএন ) ব্যবহার করা , এমন চিত্র যা আপনার গেমের সাথে আরও ভাল মানায় (বা কেবল উইন্ডোজ কার্সারের সাথে লাইভ)।

এবং অন্যটি (খুব সহজ) হ'ল ল্যাগটি গ্রহণ করুন এবং Game.IsMouseVisible = falseআপেক্ষিক ল্যাগটি লুকিয়ে রাখুন। গেমটিতে আপনার নিজস্ব কার্সার প্রদর্শন করুন। এটি লুকানো উইন্ডোজ কার্সারের চেয়ে 16 মাইল ধীর হবে - তবে কে চিন্তা করে? গেমাররা এর অভ্যস্ত। এবং 16 এমএস যাইহোক প্রায় দৃষ্টিশক্তিহীন দুর্ভেদ্য (তাই আমরা 60FPS এ জিনিসগুলি রেন্ডার করি)।


বিষয়টি বিস্তারিত ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ। সম্ভবত আমি কেবল এক্সএনএ মাউস দিয়ে থাকব। কারও কাছে এটির জন্য অতিরিক্ত কিছু কাজ করার ক্ষেত্রে গ্রহণ করার আগে কিছুটা অপেক্ষা করতে যাচ্ছি।
সুন্দর

আমার ধারণা ল্যাগটি গ্রহণ করা বা না প্লেস্টেস্টের মাধ্যমে উত্তর দেওয়া উচিত এমন একটি প্রশ্ন।
জোনকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.