سؤال

أنا أبحث عن طريقة سريعة وسهلة لرسم وحدات البكسل الملونة بشكل عشوائي في لوحة SWT Canvas.حتى الآن أستخدم شيئًا كهذا:

// initialization:
GC gc = new GC(canvas);

// inside the drawing loop:
Color cc = new Color(display, r, g, b);
gc.setForeground(cc);
gc.drawPoint(x, y);
cc.dispose();

هذا بطيء للغاية.يستغرق الأمر حوالي ثانية ونصف لملء لوحة قماشية مقاس 300 × 300 بالبكسل.يمكنني إنشاء صورة خارج الشاشة، وضبط وحدات البكسل فيها ثم رسم الصورة.سيكون هذا أسرع ولكني أريد على وجه التحديد تأثير الرسم التدريجي لتخطيط الصورة بكسل تلو الآخر على اللوحة القماشية.

هل كانت مفيدة؟

المحلول

هل يمكن رسم عدة صور خارج الشاشة حيث يمكنك ملء تدريجيا المنطقة 300X300. وبهذه الطريقة يمكنك التحكم في كيفية بسرعة يجب أن تظهر الصورة.

نصائح أخرى

أراهن أن ما يقتل الأداء هو تخصيص وإطلاق 90 ألفًا Color أشياء.تذكر، في سبحانه وتعالى، لكل منهما Color يخصص الكائن الموارد الأصلية، ولهذا السبب عليك القيام بذلك dispose() هو - هي.وهذا يعني في كل مرة تقوم فيها بتخصيص والتخلص من Color كائن، يجب عليك الانتقال من JVM إلى التعليمات البرمجية الأصلية والعودة.

هل يمكنك تخزين ملفاتك مؤقتًا؟ Color مثيلات أثناء وجودك في حلقة 300 × 300 بكسل ثم تخلص من الكائنات بعد الحلقة؟ستحتاج إلى ذاكرة تخزين مؤقت ذكية إلى حد ما لا تحتوي إلا على عدد كبير جدًا من العناصر كحد أقصى، وبعد ذلك ستتخلص من بعض إدخالاتها، ولكن هذا من شأنه أن يسرع الأمور إلى حد كبير.

وإنشاء كائن BufferedImage:

BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);

وداخل الحلقة رسم مجموعة بكسل الخاص بك:

bi.setRGB(x, y, int_rgb);
...

وعرض أخيرا صورة مخزنة:

g.drawImage(bi, 0, 0, null); 

وإذا وجدت setRGB () بطيئة، يمكنك الوصول إلى البيانات النقطية مباشرة:

int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();

وبعد ذلك

raster[y * 300 + x] = int_rgb;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top