5

カーボンメソッドをココアに変換する必要がありますが、カーボンメソッドgetPtrSizeが実際に何をするかについてのドキュメントを見つけるのに苦労しています。私が翻訳しているコードから、それは画像のバイト表現を返すように見えますが、それは実際には名前と一致していません。誰かが私にこの方法の良い説明を与えるか、それを説明するいくつかのドキュメントに私をリンクすることができますか?私が翻訳しているコードは、カーボンへのブリッジを持つMCLと呼ばれる一般的なlisp実装にあります(Cocoaブリッジを使用した一般的なlisp実装であるCCLに翻訳しています)。MCLコードは次のとおりです(#_メソッド呼び出しの前は、それがカーボンメソッドであることを意味します):

(defmethod COPY-CONTENT-INTO ((Source inflatable-icon)
                              (Destination inflatable-icon))
  ;; check for size compatibility to avoid disaster
  (unless (and (= (rows Source) (rows Destination)) 
               (= (columns Source) (columns Destination))
               (= (#_getPtrSize (image Source))
                  (#_getPtrSize (image Destination))))
    (error "cannot copy content of source into destination
inflatable icon: incompatible sizes"))
  ;; given that they are the same size only copy content
  (setf (is-upright Destination) (is-upright Source))
  (setf (height Destination) (height Source))
  (setf (dz Destination) (dz Source))
  (setf (surfaces Destination) (surfaces Source))
  (setf (distance Destination) (distance Source))
  ;; arrays
  (noise-map Source)  ;; accessor makes array if needed
  (noise-map Destination)  ;; ;; accessor makes array if needed
  (dotimes (Row (rows Source))
    (dotimes (Column (columns Source))
      (setf (aref (noise-map Destination) Row Column)
            (aref (noise-map Source) Row Column))
      (setf (aref (altitudes Destination) Row Column)
            (aref (altitudes Source) Row Column))))
  (setf (connectors Destination)
        (mapcar #'copy-instance (connectors Source)))
  (setf (visible-alpha-threshold Destination)
        (visible-alpha-threshold Source))
  ;; copy Image: slow byte copy
  (dotimes (I (#_getPtrSize (image Source)))
    (%put-byte (image Destination) (%get-byte (image Source) i) i))
  ;; flat texture optimization:
  ;; do not copy texture-id
  ;;   -> destination should get its own texture id from OpenGL
  (setf (is-flat Destination) (is-flat Source))
  ;; do not compile flat textures: the display list overhead
  ;; slows things down by about 2x
  (setf (auto-compile Destination) (not (is-flat Source)))
  ;; to make change visible we have to reset the compiled flag
  (setf (is-compiled Destination) nil))
4

1 に答える 1

4

GetPtrSizeメモリマネージャの関数です。(別のメモリマネージャ機能)を使用してメモリを割り当てた場合NewPtr、メモリマネージャは、要求したメモリの量を追跡するため、でその数を取得できますGetPtrSize

の最新の代替品NewPtrmalloc、です。これはそのような機能を提供しません。関数はありmalloc_sizeますが、返される数値は切り上げられる場合があるため、最初に要求した数値よりも大きい場合があります。それが(少なくとも概念的には)どのように悪いかがわかります。

の唯一の正確な置き換えGetPtrSizeは、バッファのサイズを自分で追跡することです。

または、これらのバッファをNSMutableDataオブジェクトに置き換えることもできます。NSMutableDataは、バッファーとそのサイズをカプセル化するため、それらを簡単にまとめることができます。

于 2010-03-08T18:18:34.350 に答える